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!