#include "t6963lcd.h" #define UC unsigned char void lcd_init(void); void lcd_cls(void); void lcd_putchar(UC achr); void lcd_cmd(UC cmd); void lcd_cmd1(UC cmd, UC arg1); void lcd_cmd2(UC cmd, UC arg1, UC arg2); void lcd_gotoxy(UC x, UC y); // LCD IO mapping xdata at LCD_CMDPORT UC lcd_cmdreg; xdata at LCD_DATAPORT UC lcd_datareg; // Global display status registers data at 0x30 lcd_dx; // Two registers in internal data ram that data at 0x31 lcd_dy; // should'nt be overwritten. These registers // indicates the insert location on display /************************************************************************************ *Test code ************************************************************************************/ void main(void) { lcd_init(); lcd_putchar('H'); lcd_putchar('E'); lcd_putchar('L'); lcd_putchar('L'); lcd_putchar('O'); lcd_putchar('\n'); lcd_putchar('L'); lcd_putchar('C'); lcd_putchar('D'); lcd_putchar(' '); lcd_putchar('O'); lcd_putchar('K'); while (1); } /************************************************************************************ * Lcd functions ************************************************************************************/ // Waits for controller to accept command void lcd_wait_ready(void) { while ((lcd_cmdreg & 3) != 3); } // Writes a command without paramerers to contoller void lcd_cmd(UC cmd) { lcd_wait_ready(); lcd_cmdreg = cmd; } // Writes a command with one parameter to contoller void lcd_cmd1(UC cmd, UC arg1) { lcd_wait_ready(); lcd_datareg = arg1; lcd_wait_ready(); lcd_cmdreg = cmd; } // Writes a command with two parameters to contoller void lcd_cmd2(UC cmd, UC arg1, UC arg2) { lcd_wait_ready(); lcd_datareg = arg1; lcd_wait_ready(); lcd_datareg = arg2; lcd_wait_ready(); lcd_cmdreg = cmd; } // Filling display with ' ' void lcd_cls(void) { unsigned int i; lcd_cmd2(LCD_ADPSET, LCD_TEXT_MEM & 255, LCD_TEXT_MEM >> 8); lcd_cmd(LCD_AWRON); // Enable autowriting for (i = 0; i != (LCD_TEXT_WIDTH * LCD_TEXT_HEIGHT); i++) { while (!(lcd_cmdreg & 8)); // Check autowrite flag lcd_datareg = 0; } lcd_cmd(LCD_AWROFF); // Disable autowriting lcd_cmd2(LCD_ADPSET, LCD_TEXT_MEM & 255, LCD_TEXT_MEM >> 8); lcd_dx = lcd_dy = 0; } // Initializes controller and setting parameters void lcd_init(void) { lcd_cmd2(LCD_TXHOME, LCD_TEXT_MEM & 255, LCD_TEXT_MEM >> 8); lcd_cmd2(LCD_GRHOME, LCD_GRAPH_MEM & 255, LCD_GRAPH_MEM >> 8); lcd_cmd2(LCD_TXAREA, LCD_TEXT_WIDTH, 0); lcd_cmd2(LCD_GRAREA, LCD_TEXT_WIDTH, 0); lcd_cmd2(LCD_OFFSET, 3, 0); lcd_cmd2(LCD_ADPSET, LCD_TEXT_MEM & 255, LCD_TEXT_MEM >> 8); lcd_cmd(0x80); // Internal character generator lcd_cmd(0x94); // Text: ON, Graphic: OFF, Cursor: OFF lcd_cls(); // Clears display } // Changes the instert location void lcd_gotoxy(UC x, UC y) { unsigned int temp; lcd_dx = x; lcd_dy = y; temp = (y * LCD_TEXT_WIDTH + x) + LCD_TEXT_MEM; lcd_cmd2(LCD_ADPSET, temp & 255, temp >> 8); } // Writes an ascii char to display void lcd_putchar(UC achr) { if (achr == '\n') lcd_gotoxy(0,lcd_dy+1); else lcd_cmd1(LCD_WRINC, achr - 0x20); }