Salta al contenuto principale

Con il simulatore PICSimLab che abbiamo appena installato proviamo il display LCD 20x4 oppure LCD 20x2 ed una apposita libreria. Vogliamo usare il PIC 16F887 come microcontrollore.

Il nostro scopo è quello di programmarlo in C ed usare il compilatore XC8 per microcontrollori PIC a 8 bit e l'ambiente di sviluppo in cloud MPLAB Xpress IDE oppure con MPLAB X IDE.

Dividiamo il programma in tre parti

1) main.c

2) config.h

3) lcd.h

 

Naturalmente altre scelte sono possibili. Sfruttiamo la possibile riutilizzabilità degli header .h e delle librerie in futuri progetti.

Per la libreria del display usiamo una trovata in rete. Altrimenti bisognerebbe autocostruirsela.

 * File:   lcd.h
 * Author: Originally created by Ligo George https://electrosome.com/lcd-pic-mplab-xc8/

Il resto della libreria trovatela nel sito dell'autore Ligo Geoge, che ringrazio per averla condivisa.

Ora metto il config.h

/*
 * File:   config.h
 * Author: fausto
 *
 * Created on 20 febbraio 2022, 14.12
 */

// This is a guard condition so that contents of this file are not included
// more than once.  
#ifndef XC_HEADER_TEMPLATE_H
#define	XC_HEADER_TEMPLATE_H


// PIC16F887 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTRC_CLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#ifdef	__cplusplus
extern "C" {
#endif /* __cplusplus */

    // TODO If C++ is being used, regular C code needs function names to have C 
    // linkage so the functions can be used by the c code. 

#ifdef	__cplusplus
}
#endif /* __cplusplus */

#endif	/* XC_HEADER_TEMPLATE_H */

ed infine il programma vero e proprio, main.c

/*
 * File:   main.c
 * Author: fausto
 *
 * Created on 20 febbraio 2022, 14.12
 */


#define RS PORTDbits.RD4
#define EN PORTDbits.RD5
#define D4 PORTDbits.RD0
#define D5 PORTDbits.RD1
#define D6 PORTDbits.RD2
#define D7 PORTDbits.RD3


#include <xc.h>
#include "config.h"


#define _XTAL_FREQ 8000000

#include "lcd.h"

// #include <stdio.h>


void main(void) {
    TRISD = 0x00;
    Lcd_Init();
    Lcd_Set_Cursor(1,1);
    Lcd_Write_String("Hello World!");
    Lcd_Shift_Left();
    Lcd_Shift_Left();
    __delay_ms(1000);
    Lcd_Clear();
    Lcd_Set_Cursor(2,1);
    Lcd_Write_String("e-guernica.net");
    Lcd_Shift_Right();
    Lcd_Shift_Right();
    __delay_ms(1000);
    return;
}

Si tratta di un programmino di prova molto semplice, che puo' essere simulato con PICSimLab

 

Enjoy!