#ifndef _LCD_H_ #define _LCD_H_ #include #include #define LCD_CMD_ADDR *((volatile unsigned char *)0x8000) #define LCD_DAT_ADDR *((volatile unsigned char *)0xC000) #define LCD_BUSY_FLAG 0x80 // 6.9 Read Busy Flag & Address #define LCD_CMD_DL8 0x38 // Sets interface data length 8BIT, 2วเ, 5x8 dot #define LCD_CMD_DL4 0x20 // Sets interface data length 4BIT #define LCD_CMD_ON 0x0C // Display ON #define CURON_BIT 0x02 // Cursor ON bit 0x02 #define BLINK_BIT 0x01 // blinking ON bit #define LCD_CMD_OFF 0x08 // Display OFF #define LCD_CMD_CLR 0x01 // Display clear #define LCD_CMD_ENT 0x06 // Entry mode (increment) #define LCD_CMD_CUR 0x0F // Moves cursor and shifts display #define LCD_CMD_RTN 0x02 // Sets DDRAM address to 00H in AC and returns shifted display to.. #define LCD_CMD_LIN 0x80 // Sets DDRAM Line #define LINE1_BIT 0x00 // line1 #define LINE2_BIT 0x40 // line2 void lcd_init(void); char lcd_busy(void); void lcd_command (unsigned char data); void lcd_data (unsigned char data); void lcd_position (char x, char y); void lcd_putchar (char x, char y, char c); int lcd_putstring(char x, char y, char * pstr); void lcd_delay(int del) { while ( del--); while ( del--); } char lcd_busy(void) { while( (LCD_CMD_ADDR) & LCD_BUSY_FLAG) { if(( (LCD_CMD_ADDR) & 0xFF) ==0xFF) return -1; } return 0; } void lcd_command( unsigned char data) { lcd_busy(); Delay_ms(2); LCD_CMD_ADDR = data; Delay_ms(4); } void lcd_init(void) { // _delay_ms(15); Delay_ms(20); LCD_CMD_ADDR= 0x30; // _delay_ms(5); Delay_ms(10); LCD_CMD_ADDR = 0x30; // _delay_ms(1); Delay_ms(2); LCD_CMD_ADDR = 0x30; // _delay_ms(1); Delay_ms(2); lcd_command(LCD_CMD_DL8); lcd_command(LCD_CMD_OFF); lcd_command(LCD_CMD_CLR); lcd_command(LCD_CMD_ENT); lcd_command(LCD_CMD_ON); } /* void lcd_init(void) { lcd_delay(500); // Wait more then 30ms lcd_command(LCD_CMD_DL8); // Data length set 8bit lcd_delay(500); // Wait for more than 39us lcd_command(LCD_CMD_ON| CURON_BIT|BLINK_BIT); // Display on lcd_delay(500); // Wait for more than 39us lcd_command(LCD_CMD_CLR); lcd_delay(500); // Wait for more than 1.53ms lcd_command(LCD_CMD_ENT); // Entry Mode Set lcd_delay(500); // Wait for more than 39us // Ect statics.. //lcd_command(LCD_CMD_CUR); lcd_delay(500); // Wait for more than 1.53ms } */ /* * L000 0000 : 00 + column (Line1) * L100 0000 : 40 + column (Line2) */ void lcd_position( char x, char y) { char line; if(y) line = LINE2_BIT; else line = LINE1_BIT; lcd_command((LCD_CMD_LIN | line) + x ); } void lcd_data( unsigned char data) { lcd_busy(); lcd_delay(50); LCD_DAT_ADDR=data; lcd_delay(50); } void lcd_putchar( char x, char y, char c) { lcd_position(x,y); lcd_data(c); } int lcd_putstring( char x, char y, char * pstr) { char * p= pstr; lcd_position(x,y); while(*p) { lcd_busy(); //lcd_delay(50); Delay_ms(2); lcd_data(*p++); //lcd_delay(50); Delay_ms(2); } return (int)(p-pstr); } #endif //_LCD_H_