新人學(xué)習(xí)到了LCD1602部分,參照了例子想寫一個 display_number()函數(shù),效果是輸入一個數(shù)(可以包含小數(shù)),在LCD上顯示保留兩位小數(shù)例如輸入123,顯示123.00,輸入123.123,顯示123.12. 理想的程序中想法思路是輸入的數(shù)(相當于一個未知數(shù),不知道它是4位數(shù)還是5位數(shù)),將其的各個位數(shù)的值分別存入到一個數(shù)組當中,然后在倒數(shù)第三位上添加 “ 。”小數(shù)點, 然后再在main函數(shù)中顯示出來。 可是小弟想了很久不知道怎么實現(xiàn) (太笨了) 下貼程序(是一個很蠢的,而且也不完善的實現(xiàn)方法)。
#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--);
}
/*********寫命令函數(shù)******/
void lcd_wcom(uchar com)
{
rs = 0; //選擇 指令寄存器
rw = 0;// 寫
P2 = com; // 將命令送入P2
delay(5);
en = 1;
en = 0;
}
/*********寫數(shù)據(jù)函數(shù)*****/
void lcd_wdat(uchar dat)
{
rs = 1; //選擇數(shù)據(jù)寄存器
rw = 0; // 寫
P2 = dat; // 送入P2
delay(5);
en = 1;
en = 0;
}
/*********LCD初始化******/
void lcd_initial()
{
lcd_wcom(0x38); // 8位數(shù)據(jù),雙列 5*7 字形
delay(1);
lcd_wcom(0x0c); // 開啟顯示屏,關(guān)光標(不閃爍)
delay(1);
lcd_wcom(0x06); //沒寫一個數(shù)據(jù),光標右移一位
delay(1);
lcd_wcom(0x01); //最后清屏
}
/*******數(shù)據(jù)顯示地址函數(shù)***/
void lcd_pos(uchar pos)
{
lcd_wcom(pos|0x80);
}
/*******保留兩位小數(shù)******/ ///就是這里不知道怎么實現(xiàn)我理想的效果!!!
void display_number(unsigned t,unsigned char *str,unsigned z)
{
unsigned char a[5]; char i, j;
a[0]=(t/10000)%10; //取得整數(shù)值到數(shù)組
a[1]=(t/1000)%10;
a[2]=(t/100)%10; //有沒有方法可以實現(xiàn)在不知道輸入的數(shù)是多少位數(shù)的前提下將其各個位的數(shù)分出來????
a[3]=(t/10)%10;
a[4]=(t/1)%10;
for(i=0; i<5; i++) //轉(zhuǎn)成ASCII碼
a[i]=a[i]+'0';
for(i=0; a[i]=='0' && i<=3; i++);
for(; i<5; i++)
{ *str=a[i]; str++; } //加入有效的數(shù)字
//*str='\0';
}
/*********主函數(shù)***********/
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]); //我暫時只想到這么蠢的方法去實現(xiàn)小數(shù)點的顯示
lcd_wdat(0x2e);// 小數(shù)點
lcd_wdat(shu[3]);
lcd_wdat(shu[4]);
while(1);
}
希望論壇大哥幫忙解答一下
|