新人學習到了LCD1602部分,參照了例子想寫一個 display_number()函數,效果是輸入一個數(可以包含小數),在LCD上顯示保留兩位小數例如輸入123,顯示123.00,輸入123.123,顯示123.12. 理想的程序中想法思路是輸入的數(相當于一個未知數,不知道它是4位數還是5位數),將其的各個位數的值分別存入到一個數組當中,然后在倒數第三位上添加 “ !毙迭c, 然后再在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);
}
希望論壇大哥幫忙解答一下
|