|
写了一个函数,作用是将变量以十进制方式显示在LCD上,调试这个函数却花费了不少时间,一直都是三位数可以正常显示,大于三位数则显示不正常,反反复复检查代码都没有效果,一上午很快就过去了,下午继续调试时忽然发现是数据类型的问题,原来我将倍数变量定义成字符型了,最大仅能表示255(即三位数),后来将这个变量类型修改成32位的,顺利地解决了问题。下图是用不同位数显示同一变量:
下面是程序代码:
- /****************************************************************
- * 显示变量函数display_value()
- * 输入参数:开始显示(左上角)坐标:x,y,(uint16_t)
- * 前景色,背景色,(White,Black,Red,Green,Blue,Yellow)
- * 变量,(uint32_t)
- * 显示长度(不含小数点),小数位数,(uint8_t)
- * 前导0(0=显示,1=空格)
- *****************************************************************/
- void display_value(uint16_t x,uint16_t y,uint16_t fc,uint16_t bc,uint32_t v,uint8_t l,uint8_t b,uint8_t z)
- {
- unsigned char i,j,m;
- unsigned short k,x0;
- uint32_t u,n;
-
- x0 = x;
- u = v;
- z = z > 0 ? 0: 16; //前导0:z=16;前空格:z=0
- n = 1;
- for(j = 1; j < l; j++) //计算倍数
- n = n * 10;
-
- LCD_CS_CLR; //选择LCD
- for(m = l;m > 0;m --) //开始分拆变量
- {
- k = u / n; //当前位数字
- u = u - (k * n); //剩余数字
- if(k > 0) z = 16; //只要有一位数字>0,之后不能显示空格
- if(m == 1) z = 16; //小数点之前的'0'显示
- n = m < 2 ? 1: n / 10; //计算当前的倍数
-
- if((m == b) & (m > 0)) //显示小数点
- {
- for(i = 0;i < 16;i ++){
- for(j = 0;j < 8;j ++){
- if(asc16[14 * 16 + i] & (0x80 >> j))//从asc16[]数组中取字符.数据
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,fc);
- else{
- if(fc != bc)
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,bc);
- }
- }
- }
- x += 8;
- }
-
- for(i = 0;i < 16;i ++){ //显示字符(k=字符序号)
- for(j = 0;j < 8;j ++){
- if(asc16[(k+z) * 16 + i] & (0x80 >> j))//从asc16[]数组中取字符数据
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,fc);
- else{
- if(fc != bc)
- /* draw a point on the lcd */
- lcd_draw_point(x + j,y + i,bc);
- }
- }
- }
- x += 8;
- }
- LCD_CS_SET;
- }
复制代码
|
|