微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD1602怎么显示小数?(小数格式为X.XXXX)

LCD1602怎么显示小数?(小数格式为X.XXXX)

时间:10-02 整理:3721RD 点击:
本人最近刚接触1602液晶屏,学会了显示整数。但目前需要显示小数,在网上看到需要整数部分和小数部分分离,就试着做了下,但实际显示不正常。不知道是什么原因,请各位大神详细指点一下,谢谢!
附:我的LCD1602显示部分主程序:
void main(void)
{
uint temp;          //存放AD转换值
long dianya;
LCD_Init();
LCD_Clear();//清屏
LCD_Write_String(0,0," Voltage  Value ");         //液晶第一行显示“Voltage  Value ” (电压值)
while (1)
{  
          temp = Read_AD_Data(0x94);         //  读取ADC转换值(电位器-最大4096)
          dianya=5.0000*(temp/(2^12)) ;        //通过计算得到电压值(根据分辨率)
          LocateXY(4,1);                                     //  定位屏幕第二行第三列
          
          LCD_Write_Data(table[dianya/1]);          //高位在前,低位在后,共5位---第1位
          DelayMs(25);
          
          LCD_Write_Data(0x2E);                                                  //液晶显示:点——“.”   0x2E为点的地址
          DelayMs(25);
          
          LCD_Write_Data(table[dianya%10000/1000]);                      //第2位
          DelayMs(25);
          
          LCD_Write_Data(table[dianya%10000%1000/100]);              //第3位
          DelayMs(25);
          
          LCD_Write_Data(table[dianya%10000%1000%100/10]);          //第4位
          DelayMs(25);
          
          LCD_Write_Data(table[dianya%10000%1000%100%10]);          //第5位
          DelayMs(25);
          
          LCD_Write_Data(0x20);                                         //液晶显示:空格——“ ”   0x20为空格的地址
          DelayMs(25);
          
          LCD_Write_Data(0x56);                                        //液晶显示:大写字母V——“V”   0x56为V的地址
          DelayMs(25);
}
}
此程序功能为:利用XPT2046 A/D转换来实现A/D值转变为电压值并在1602上显示。(使用开发板的电位器旋钮改变AD值,从而改变电压值)
注:xpt2046最大AD值为4096,,参考电压5v,转变成电压为0-5v。均以伏特(V)显示,小数组成:整数位-1位,小数位-4位。(即为:x.xxxx  V)


显示是这样。就是整数位乱码,第二位始终是在0-1跳动,后三位也跳但不知道对不对。

你要显示的数字后面要加 48 或者加0x30

整数部分取数字的时候错了,导致数组越界(但编译器不会报错),建议小编根据实际数值的大小修改为table[(number/x)%10],x是10的整数倍,取决于number的大小,例如number为500,要取5的话那么x就是10^2,相当于十进制数右移两位。

是不是%取余的地方错了?我看取余符号两侧必须是整型数据,而我的dianya(程序中)值是小数。那请教下,因为dianya的值必须得是小数(x.xxxx形式),所以要想显示这个dianya值,怎么通过算法来一位一位的显示呢?

请问这是要以ASC II 形式显示字符么?

以12.34为例,先将这个数乘以100,使用强制类型转换为1234。取最高位推荐取数方式是(1234/1000)%10而不要使用1234/1000,这样做更加安全。如果还是不明白我补上一份关键部分代码给你。

我试着用1602指定显示一个值为4.63252541874,我显示取小数后4位即4.6325成功了。程序和protues仿真如下

  1. void main(void)
  2. {
  3. //uint temp;
  4. double xiaoshu = 4.63252541874;                         // 要显示的数,取小数点后4位即xiaoshu=4.6325
  5. double xiaoshu2 = xiaoshu*10000;                 // xiaoshu2=46325.2541874
  6. uint zhengshu = (int)(xiaoshu2);                 //强制转换为整型为zhengshu=46325
  7. LCD_Init();
  8. LCD_Clear(); //清屏
  9. LCD_Write_String(0,0," Voltage  Value ");         //液晶第一行显示“Voltage  Value ” (电压值)
  10. while (1)
  11. {  
  12. //           temp = Read_AD_Data(0x94);         //  读取ADC转换值(电位器-最大4096)

  13.           LocateXY(4,1);                                     //  定位屏幕第二行第三列
  14.           
  15.           LCD_Write_Data(table[(zhengshu/10000)%10]);          //高位在前,低位在后,共5位---第1位
  16.           DelayMs(25);

  17.           LCD_Write_Data(0x2E);                                                  //液晶显示:点——“.”   0x2E为点的地址
  18.           DelayMs(25);
  19.           
  20.           LCD_Write_Data(table[zhengshu%10000/1000]);                      //第2位
  21.           DelayMs(25);
  22.           
  23.           LCD_Write_Data(table[zhengshu%10000%1000/100]);              //第3位
  24.           DelayMs(25);
  25.           
  26.           LCD_Write_Data(table[zhengshu%10000%1000%100/10]);          //第4位
  27.           DelayMs(25);
  28.           
  29.           LCD_Write_Data(table[zhengshu%10000%1000%100%10/1]);          //第5位
  30.           DelayMs(25);
  31.           
  32.           LCD_Write_Data(0x20);                                                                  //液晶显示:空格——“ ”   0x20为空格的地址
  33.           DelayMs(25);
  34.           
  35.           LCD_Write_Data(0x56);                                                                  //液晶显示:大写字母V——“V”   0x56为V的地址
  36.           DelayMs(25);
  37. }
  38. }

复制代码



但是,我需要的动态显示的小数,而且该小数是通过计算得来的(通过程序),不是直接采集到的数值。具体要求是这样:我通过AD采集到的值temp=0~4095,然后要将temp值转变成电压值,转换公式为:dianya=5*(temp/4095),最终1602是要显示的是dianya值,而dianya值一般会为无限小数,这样主函数该写程序?求指点一下,谢谢

1602显示数据本身是按ASCII码来的,就是要显示3,就要写入0x33,而不是0x03,你可以先固定显示一些数字来确定显示正确,剩下的就是数据转换的问题了

没听明白。   

谢谢了,开发板内部信号测试的显示我已经做出来了。还有就是你了解xpt2046这个AD-DA转换芯片么?关于用外部输入信号如何连接测试?我用的这个版本的普中开发板(HC6800-EM3 V2.2),它的AD模块用的是xpt2046

已经做出来了,谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top