1. 下载了官网提供的 断码LCD程序,发现里面对显示寄存器操作有点复杂。
/****************** 对第1~5数字装载显示函数 ***************************/
u8 code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e};
u8 code T_LCD_mask[7] = {0x00,0x0C,0x30,0xC0,0x03,0x0C};
u8 code T_LCD_mask7[7] = {0x00,0x04,0x10,0x40,0x01,0x04};
u8 code T_SEG_ABC[7] = {0x00,0x08,0x20,0x80,0x02,0x08};
u8 code T_SEG_DEFG[7] = {0x00,0x04,0x10,0x40,0x01,0x04};
/********************** 装载显示5个8字 *****************************/
void LCD_load(u8 n, u8 dat) //n为第几个数字,为1~5,dat为要显示的数字
{
u8 i,k;
if((n == 0) || (n >= 6)) return; //合法值 1~5
dat = t_display[dat]; //3F
k = ~T_LCD_mask[n]; //FF
if(n <= 3) //1~3
{
LCD_buff[0] &= ~T_LCD_mask7[n]; //FF
LCD_buff[2] &= k; //NC
LCD_buff[4] &= k; //NC
LCD_buff[6] &= k; //NC
i = T_SEG_ABC[n]; //00
k = T_SEG_DEFG[n]; //00
if(dat & 0x01) LCD_buff[6] |= i; //T_SEG_ABC[n]; //A
if(dat & 0x02) LCD_buff[4] |= i; //T_SEG_ABC[n]; //B
if(dat & 0x04) LCD_buff[2] |= i; //T_SEG_ABC[n]; //C
if(dat & 0x08) LCD_buff[0] |= k; //T_SEG_DEFG[n]; //D
if(dat & 0x10) LCD_buff[2] |= k; //T_SEG_DEFG[n]; //E
if(dat & 0x20) LCD_buff[6] |= k; //T_SEG_DEFG[n]; //F
if(dat & 0x40) LCD_buff[4] |= k; //T_SEG_DEFG[n]; //G
}
else // n=4 or 5
{
LCD_buff[1] &= ~T_LCD_mask7[n];
LCD_buff[3] &= k;
LCD_buff[5] &= k;
LCD_buff[7] &= k;
i = T_SEG_ABC[n];
k = T_SEG_DEFG[n];
if(dat & 0x01) LCD_buff[7] |= i; //T_SEG_ABC[n]; //A
if(dat & 0x02) LCD_buff[5] |= i; //T_SEG_ABC[n]; //B
if(dat & 0x04) LCD_buff[3] |= i; //T_SEG_ABC[n]; //C
if(dat & 0x08) LCD_buff[1] |= k; //T_SEG_DEFG[n]; //D
if(dat & 0x10) LCD_buff[3] |= k; //T_SEG_DEFG[n]; //E
if(dat & 0x20) LCD_buff[7] |= k; //T_SEG_DEFG[n]; //F
if(dat & 0x40) LCD_buff[5] |= k; //T_SEG_DEFG[n]; //G
}
}
/********************** 将显示内容导入显存 *****************************/
void LoadToLcd(void)
{
C0SEGV1 = LCD_buff[0]; // C0SEG 15~8数据寄存器
C0SEGV2 = LCD_buff[1]; // C0SEG 23~16数据寄存器
C1SEGV1 = LCD_buff[2]; // C1SEG 15~8数据寄存器
C1SEGV2 = LCD_buff[3]; // C1SEG 23~16数据寄存器
C2SEGV1 = LCD_buff[4]; // C2SEG 15~8数据寄存器
C2SEGV2 = LCD_buff[5]; // C2SEG 23~16数据寄存器
C3SEGV1 = LCD_buff[6]; // C3SEG 15~8数据寄存器
C3SEGV2 = LCD_buff[7]; // C3SEG 23~16数据寄存器
}
复制代码
前面对buf的数据处理逻辑比较复杂,最后将数据传入到 CxSEGVx寄存器中。 这段过程一直没有理解;
2. 之前用过TM1621这类的驱动,不知道咱们的这个驱动方式是否和这类芯片类似?如果不相同,应该怎么理解 这些寄存器的作用? 尤其是CxSEGVx寄存器。