新人学习到了LCD1602部分,参照了例子想写一个 display_number()函数,效果是输入一个数(可以包含小数),在LCD上显示保留两位小数例如输入123,显示123.00,输入123.123,显示123.12. 理想的程序中想法思路是输入的数(相当于一个未知数,不知道它是4位数还是5位数),将其的各个位数的值分别存入到一个数组当中,然后在倒数第三位上添加 “ 。”小数点, 然后再在main函数中显示出来。 可是小弟想了很久不知道怎么实现(太笨了) 下贴程序(是一个很蠢的,而且也不完善的实现方法)。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code first[]="The Value X";
uchar code second[]="X=";
unsigned char shu[20];
sbit rs=P0^7;
sbit rw=P0^6;
sbit en=P0^5;
/*********普通延时********/
void delay(uint t)
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/*********写命令函数******/
void lcd_wcom(uchar com)
{
rs = 0; //选择 指令寄存器
rw = 0;// 写
P2 = com; // 将命令送入P2
delay(5);
en = 1;
en = 0;
}
/*********写数据函数*****/
void lcd_wdat(uchar dat)
{
rs = 1; //选择数据寄存器
rw = 0; // 写
P2 = dat; // 送入P2
delay(5);
en = 1;
en = 0;
}
/*********LCD初始化******/
void lcd_initial()
{
lcd_wcom(0x38); // 8位数据,双列 5*7 字形
delay(1);
lcd_wcom(0x0c); // 开启显示屏,关光标(不闪烁)
delay(1);
lcd_wcom(0x06); //没写一个数据,光标右移一位
delay(1);
lcd_wcom(0x01); //最后清屏
}
/*******数据显示地址函数***/
void lcd_pos(uchar pos)
{
lcd_wcom(pos|0x80);
}
/*******保留两位小数******/ ///就是这里不知道怎么实现我理想的效果!!!
void display_number(unsigned t,unsigned char *str,unsigned z)
{
unsigned char a[5]; char i, j;
a[0]=(t/10000)%10; //取得整数值到数组
a[1]=(t/1000)%10;
a[2]=(t/100)%10; //有没有方法可以实现在不知道输入的数是多少位数的前提下将其各个位的数分出来????
a[3]=(t/10)%10;
a[4]=(t/1)%10;
for(i=0; i<5; i++) //转成ASCII码
a[i]=a[i]+'0';
for(i=0; a[i]=='0' && i<=3; i++);
for(; i<5; i++)
{ *str=a[i]; str++; } //加入有效的数字
//*str='\0';
}
/*********主函数***********/
void main()
{
uchar n = 0,m = 0,k=0;
lcd_initial();
delay(10);
lcd_pos(0);
for(n=0;n<11;n++)
{
lcd_wdat(first[n]);
}
lcd_pos(0x40);
for(m=0;m<2;m++)
{
lcd_wdat(second[m]);
}
lcd_pos(0x42);
// lcd_wdat(0x2E);
display_number(12345,&shu[0],5);
/* for( k=0;k<5;k++)
{
lcd_wdat(shu[k]);
} */
lcd_wdat(shu[0]);
lcd_wdat(shu[1]);
lcd_wdat(shu[2]); //我暂时只想到这么蠢的方法去实现小数点的显示
lcd_wdat(0x2e);// 小数点
lcd_wdat(shu[3]);
lcd_wdat(shu[4]);
while(1);
}
希望论坛大哥帮忙解答一下
|