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跳动,后三位也跳但不知道对不对。
但是,我需要的动态显示的小数,而且该小数是通过计算得来的(通过程序),不是直接采集到的数值。具体要求是这样:我通过AD采集到的值temp=0~4095,然后要将temp值转变成电压值,转换公式为:dianya=5*(temp/4095),最终1602是要显示的是dianya值,而dianya值一般会为无限小数,这样主函数该写程序?求指点一下,谢谢
附:我的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仿真如下
- void main(void)
- {
- //uint temp;
- double xiaoshu = 4.63252541874; // 要显示的数,取小数点后4位即xiaoshu=4.6325
- double xiaoshu2 = xiaoshu*10000; // xiaoshu2=46325.2541874
- uint zhengshu = (int)(xiaoshu2); //强制转换为整型为zhengshu=46325
- LCD_Init();
- LCD_Clear(); //清屏
- LCD_Write_String(0,0," Voltage Value "); //液晶第一行显示“Voltage Value ” (电压值)
- while (1)
- {
- // temp = Read_AD_Data(0x94); // 读取ADC转换值(电位器-最大4096)
- LocateXY(4,1); // 定位屏幕第二行第三列
-
- LCD_Write_Data(table[(zhengshu/10000)%10]); //高位在前,低位在后,共5位---第1位
- DelayMs(25);
- LCD_Write_Data(0x2E); //液晶显示:点——“.” 0x2E为点的地址
- DelayMs(25);
-
- LCD_Write_Data(table[zhengshu%10000/1000]); //第2位
- DelayMs(25);
-
- LCD_Write_Data(table[zhengshu%10000%1000/100]); //第3位
- DelayMs(25);
-
- LCD_Write_Data(table[zhengshu%10000%1000%100/10]); //第4位
- DelayMs(25);
-
- LCD_Write_Data(table[zhengshu%10000%1000%100%10/1]); //第5位
- DelayMs(25);
-
- LCD_Write_Data(0x20); //液晶显示:空格——“ ” 0x20为空格的地址
- DelayMs(25);
-
- LCD_Write_Data(0x56); //液晶显示:大写字母V——“V” 0x56为V的地址
- DelayMs(25);
- }
- }
但是,我需要的动态显示的小数,而且该小数是通过计算得来的(通过程序),不是直接采集到的数值。具体要求是这样:我通过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
已经做出来了,谢谢