找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4257|回復: 5
收起左側(cè)

LCD1602想寫一個能四舍五入保留2位小數(shù)的函數(shù)

[復制鏈接]
ID:210889 發(fā)表于 2017-6-22 01:25 | 顯示全部樓層 |閱讀模式
新人學習到了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);
}





希望論壇大哥幫忙解答一下
回復

使用道具 舉報

ID:82765 發(fā)表于 2017-6-22 06:04 | 顯示全部樓層

回帖獎勵 +10

提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復

使用道具 舉報

ID:123289 發(fā)表于 2017-6-22 07:19 | 顯示全部樓層
很簡單,輸入數(shù)字以后再做一個加法:+0.005,就行了!
設(shè)輸入為:ABC.DEFG,則做ABCDEFG+0000050(不管小數(shù)點,但以小數(shù)點對 位),完成后只顯示至小數(shù)點后兩位就可以了。
回復

使用道具 舉報

ID:210889 發(fā)表于 2017-6-22 09:33 | 顯示全部樓層
yzwzfyz 發(fā)表于 2017-6-22 07:19
很簡單,輸入數(shù)字以后再做一個加法:+0.005,就行了!
設(shè)輸入為:ABC.DEFG,則做ABCDEFG+0000050(不管小 ...

換成程序語言就是 輸入123.123, display_number(double 123.123)
然后作123.123*1000+5運算, 顯示的話是不是直接lcd_wdat(輸入+0x30)?語言上怎么具體實現(xiàn)只顯示小數(shù)后兩位? 剛?cè)腴T,很多不是很清楚,望諒解
回復

使用道具 舉報

ID:210889 發(fā)表于 2017-6-22 09:46 | 顯示全部樓層
cjjcjj1 發(fā)表于 2017-6-22 06:04
通過你輸入的 “.” 來記錄后面的小數(shù)位數(shù)

不知道在display_number函數(shù)具體怎么實現(xiàn)
回復

使用道具 舉報

ID:210889 發(fā)表于 2017-6-22 17:16 | 顯示全部樓層
,到現(xiàn)在還達不到目的效果
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表