不知是什么原因,在显示变量数值时,同样的代码,在用常规5*7点阵字库显示时正常,但在用24*40点阵字库显示时却不正常。在显示四位数的年号时,用小字体显示就不会出错,而用大字体显示则出错,2021显示为0229。2021对应的十六进制是0x7E5,而0229对应的十六进制是0xE5,恰恰“遗失”了16位变量的高8位。
下面是使用5*7点阵字库的变量显示函数:
/*********************************************
* 函数名称:LCD_write_value
* 函数功能:显示变量字符5*7(8)或7*12(16)
* 入口参数:x,y,L,D,N,val :座标、长度、小数、前导零(1显示 0不显示)、负号(1显示 0不显示)、变量
* 出口参数:无 编号(行号)
* 备注:ASCII码表的数组ASC_5[95][8]来寻址
*********************************************/
void LCD_write_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t D,uint8_t Z,uint16_t val)
{
uint8_t i,j,f = 0; //列循环、字循环、显示标志
uint16_t t,cid; //当前余数、当前数字
uint32_t n; //当前倍数
t = val;
n = 1;
if(Z == 1)
f = 16; //空格=0,“0”=16
for (j = 0; j < L; j++)
n = n * 10;
LCD_set_XY(X,Y); //定位(左上角)
for (j = L; j > 0; j--) //字符循环开始
{
n = j < 2 ? 1: n / 10; //计算当前的倍数
cid = t / n; //当前位数字
t = t - (cid * n);
if ((cid > 0)|(j-1 == D)) //显示字符0
f = 16;
for ( i=0; i<5; i++) //写一个5*7字符
{
WriteData(ASC_5[cid + f][i],1);
}
if ((D>0) & (D==(j - 1)))
{
for ( i=0; i<5; i++) //写小数点
{
WriteData(ASC_5[14][i],1);
}
}
else
if(j>1) WriteData(0x00,1);//插入空列
}
}
这是使用24*40点阵字库的变量显示函数,这个函数代码是从上面的函数中改写过来的:
/*********************************************
* 函数名称:LCD_write_GT_value
* 函数功能:显示变量字符24*40
* 入口参数:x,y,L,D,N,val :座标、长度、前导零(1显示 0不显示)、变量
* 出口参数:无 编号(行号)
* 备注:大字体显示24*40
*********************************************/
void LCD_write_GT_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t Z,uint16_t val)
{
uint8_t i,j,f; //列循环、字循环、显示标志
uint16_t t,cid; //当前余数、当前数字
uint32_t n; //当前倍数
t = val;
n = 1;
f = Z; //空格=0,“0”=16
for (j = 0; j < L; j++)
n = n * 10;
for (j = L; j > 0; j--) //字符循环开始
{
n = j < 2 ? 1: n / 10; //计算当前的倍数
cid = t / n; //当前位数字
t = t - (cid * n);
if ((cid > 0)|(j-1 == L)) //显示字符0
f = 1;
if(f>0)
LCD_write_ASC_GT(X+(L-j)*24,Y,cid);
}
}
|