16FXXX with LCD16x2
เว็บมาสเตอร์ |
/* * PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble) * PORTA bit 2 is connected to the LCD RS input (register select) * PORTA bit 3 is connected to the LCD EN bit (enable) * * To use these routines, set up the port I/O (TRISA, TRISB) then * call lcd_init(), then other routines as required. * */ //Define compiler error message. #ifndef __CPU_16F877__ #error "This program is tailored for PIC16F648A controller" #endif //Include required header files here. #include "io16f877.h" //the hardware register definition file. //-----------------------------------------------------------------delay--------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------- void DelayUs(int count) { int i; int j; for(i=0;i<count;i++) { for(j=0;j<5;j++); //This for loop has 5 NOPs & wastes 1 uS for our PIC clock frequency of 20MHz. } } void DelayMs(int count) { int i; for(i=0;i<count;i++) {DelayUs(4000);} } //--------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------- #define LCD_RS RA2 // Register select #define LCD_EN RA3 // Enable #define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { PORTB = (PORTB & 0xF0) | (c >> 4); LCD_STROBE; PORTB = (PORTB & 0xF0) | (c & 0x0F); LCD_STROBE; DelayUs(40); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); DelayMs(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters PORTB = (PORTB & 0xF0) | (c >> 4); LCD_STROBE; PORTB = (PORTB & 0xF0) | (c & 0x0F); LCD_STROBE; DelayUs(40); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init(void) { LCD_RS = 0; // write control bytes DelayMs(15); // power on delay PORTB = 0x2; // attention! or 0x2 LCD_STROBE; // Step 1 DelayMs(5); LCD_STROBE; // Step 2 DelayUs(100); LCD_STROBE; // Step 3 DelayMs(5); PORTB = 0x2; // set 4 bit mode LCD_STROBE; // Step 4 DelayUs(40); lcd_write(0x28 ); // 4 bit mode, 1/16 duty, 5x8 font lcd_write(0x08 ); // display off lcd_write(0x0F); // display on, blink curson on lcd_write(0x06); // entry mode } void IniPort() { ADCON1=0x06; TRISA=0x00; TRISB=0x00; PORTA=0x00; PORTB=0x00; } char text[]="len di\n"; int count=0; void main(void) { IniPort(); lcd_init(); while (text[count]!='\n') { lcd_putch(text[count]); count++; } DelayUs(100); while(1){} } |
