不知是什么原因,在显示变量数值时,同样的代码,在用常规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);
- }
- }
|