/****************** LCD段码扫描函数 *************************** u8 code T_COM[4]={0x080x040x020x01}; void LCD_scan(void) //5us @22.1184MHZ { u8 j; j = scan_index >> 1; //COMx P2n_pure_input(0x0f); //全部COM输出高阻 COM为中点电压 if(scan_index & 1) //反相扫描 { P1 = ~LCD_buff[j]; //送SEG驱动码 P2 = ~(LCD_buff[j|4] & 0xf0); //送SEG驱动码和COM驱动码 } else //正相扫描 { P1 = LCD_buff[j]; //送SEG驱动码 P2 = LCD_buff[j|4] & 0xf0; //送SEG驱动码和COM驱动码 } P2n_push_pull(T_COM[j]); //某个COM设置为推挽输出 if(++scan_index >= 8) scan_index = 0; //扫描完成,重复扫描 } /****************** LCD段码显示缓冲装载函数 ***************************/ /****************** 对第1~6数字装载显示函数 ***************************/ u8 code T_LCD_mask[4] = {~0xc0~0x30~0x0c~0x03}; u8 code T_LCD_mask4[4] = {~0x40~0x10~0x04~0x01}; void LCD_load(u8 nu8 dat) //n为第几个数字,为1~6,dat为要显示的数字 10us@22.1184MHZ { u8 ik; u8 *p; if((n == 0) || (n > 6)) return; i = t_display[dat]; if(n <= 4) //1~4 { n--; p = LCD_buff; } else { n = n - 5; p = &LCD_buff[4]; } k = 0; if(i & 0x08) k |= 0x40; //D *p = (*p & T_LCD_mask4[n]) | (k>>2*n); p++; k = 0; if(i & 0x04) k |= 0x40; //C if(i & 0x10) k |= 0x80; //E *p = (*p & T_LCD_mask[n]) | (k>>2*n); p++; k = 0; if(i & 0x02) k |= 0x40; //B if(i & 0x40) k |= 0x80; //G *p = (*p & T_LCD_mask[n]) | (k>>2*n); p++; k = 0; if(i & 0x01) k |= 0x40; //A if(i & 0x20) k |= 0x80; //F *p = (*p & T_LCD_mask[n]) | (k>>2*n); }
下面是STC官网的驱动程序,电路图和相关文档:
http://www.stcmcu.com/STC-DEMO-CODE/40-IO-LCD-8x6-2014-6-19.rar