// used display type : AMPIRE AG-12864D // ==================================== #define char_width 8 #define text_lin 8 #define graph_lin 64 #define graph_mem 0 #define graph_size 0x400 #define text_mem 0x400 #define text_size 0x80 #define attr_mem 0x0 #define attr_size 0x80 //------------------------------------------------------------------- /* * TEXT DISPLAY : * -------------- * * font 8 * 8 => 16 * 8 char * text memory area: * * start at 0x1000 = th (text home) * ta = 16 char * addr. of char 1 in line n = th + ta * (n-1) * addr. of char m in line n = th + ta * (n-1) + (m-1) * mem. space = 16 * 8 = 128 = 0x80 Byte * * ATTRIBUTE : * ----------- * * used in text mode only * uses graphic memory pointer to address * attribute memory area: * * start at 0x1300 = gh (graphic home) * ga = 20 char * addr. of char 1 in line n = gh + ga * (n-1) * addr. of char m in line n = gh + ga * (n-1) + (m-1) * mem. space = 16 * 8 = 128 = 0x80 Byte of graphic memory */ //------------------------------------------------------------------- #define char_norm 0 #define char_rev 5 #define char_blink 8 #define char_rev_blink 0xd //--- G-RAPHIC DISPLAY ---------------------------------------------- // 128 * 64 dots // graphic memory area: // // start at 0 = gh (graphic home) // ga = 16 (16 * 8 = 128 dots) // (Note: when writing graphic data only bit 0 - 5 of a byte // is valid) // addr. of pixl 1 in line n = gh + ga * (n-1) // addr. of char m in line n = gh + ga * (n-1) + (int(m/8)-1) // & bit in byte = mod8(m) // mem. space = 16 * 64 = 1024 = 0x400 Byte //--- STATUS BYTE --------------------------------------------------- // sta0 : busy1 - check execute // sta1 : busy2 - check read ans write // sta2 : dav - check read in auto mode // sta3 : rdy - check write in auto mode // sta4 : nc // sta5 : clr - check controler operation // sta6 : error - error for peek and copy // sta7 : blink - condition of blink // //--- COMMAND SET --------------------------------------------------- #define lcd_cur_ptr 0x21 #define lcd_offs_ptr 0x22 #define lcd_addr_ptr 0x24 #define lcd_set_th 0x40 #define lcd_set_ta 0x41 #define lcd_set_gh 0x42 #define lcd_set_ga 0x43 #define lcd_set_or 0x80 #define lcd_set_xor 0x81 #define lcd_set_and 0x83 #define lcd_set_text 0x84 #define lcd_graph_on 0x98 #define lcd_text_on 0x94 #define lcd_cur_on 0x92 #define lcd_cur_off 0x90 #define lcd_cur_blink 0x91 #define lcd_cur_size 0xa0 #define lcd_auto_wr 0xb0 #define lcd_auto_rd 0xb1 #define lcd_auto_rst 0xb2 #define lcd_write 0xc0 #define lcd_read 0xc1 #define lcd_ptr_up 0xc0 #define lcd_ptr_down 0xc2 #define lcd_ptr_halt 0xc4 #define lcd_pixl_set 0xf8 #define lcd_pixl_rst 0xf0 #define lcd_set_graph 0xff void init_lcd(unsigned char lcd_mode, unsigned char cur_mode, unsigned char cur_siz) { /* startup init of lcd display with all pointers * and clear text,attribute and graphic memory * * IN: lcd_mode ... display mode (lcd_set_or, lcd_set_xor, * lcd_set_and, lcd_set_text, * lcd_set_graph) * cur_mode ... cursor mode (lcd_cur_on, lcd_cur_off, * lcd_cur_blink) * cur_size ... 1 - 8 lines (0 - 7) */ rst_lcd(); lcd_wr(text_mem); /* text memory = 0x1000 - 0x12ff */ lcd_wr(text_mem / 0x100); lcd_cmd(lcd_set_th); lcd_wr(colums); lcd_wr(0); lcd_cmd(lcd_set_ta); set_mode(lcd_mode, cur_mode, cur_siz);/* call set_mode */ gclr_scr(); /* clear graphic mem */ aclr_scr(); /* clear text + attr. mem */ } void set_mode(unsigned char lcd_mode, unsigned char cur_mode, unsigned char cur_size) { /* changes modes of display * * IN: lcd_mode ... display mode (lcd_set_or, lcd_set_xor, * lcd_set_and, lcd_set_text, * lcd_set_graph) * cur_mode ... cursor mode (lcd_cur_on, lcd_cur_off, * lcd_cur_blink) * cur_size ... 1 - 8 lines (0 - 7) */ if (lcd_mode == lcd_set_text) { lcd_wr(attr_mem); /* attrib. mem. = 0x1300 - 0x15ff */ lcd_wr(attr_mem / 0x100); } else { lcd_wr(graph_mem); /* graphic area = 0 - 0x0fff */ lcd_wr(graph_mem / 0x100); } lcd_cmd(lcd_set_gh); lcd_wr(colums); lcd_wr(0); lcd_cmd(lcd_set_ga); switch(lcd_mode) /* lcd display mode set */ { case lcd_set_graph: lcd_cmd(lcd_set_or); lcd_cmd(lcd_graph_on | cur_mode); break; default: lcd_cmd(lcd_mode); lcd_cmd(lcd_text_on | lcd_graph_on | cur_mode); break; } lcd_cmd(lcd_cur_size | cur_size); /* cursor size set */ lcd_wr(1); /* cursor position 0,0 */ lcd_wr(1); lcd_cmd(lcd_cur_ptr); } -- =8-)