找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3769|回复: 5
打印 上一主题 下一主题
收起左侧

LCD1602想写一个能四舍五入保留2位小数的函数

[复制链接]
跳转到指定楼层
楼主
ID:210889 发表于 2017-6-22 01:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新人学习到了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);
}





希望论坛大哥帮忙解答一下
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-6-22 06:04 | 只看该作者

回帖奖励 +10

提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:123289 发表于 2017-6-22 07:19 | 只看该作者
很简单,输入数字以后再做一个加法:+0.005,就行了!
设输入为:ABC.DEFG,则做ABCDEFG+0000050(不管小数点,但以小数点对 位),完成后只显示至小数点后两位就可以了。
回复

使用道具 举报

地板
ID:210889 发表于 2017-6-22 09:33 | 只看该作者
yzwzfyz 发表于 2017-6-22 07:19
很简单,输入数字以后再做一个加法:+0.005,就行了!
设输入为:ABC.DEFG,则做ABCDEFG+0000050(不管小 ...

换成程序语言就是 输入123.123, display_number(double 123.123)
然后作123.123*1000+5运算, 显示的话是不是直接lcd_wdat(输入+0x30)?语言上怎么具体实现只显示小数后两位? 刚入门,很多不是很清楚,望谅解
回复

使用道具 举报

5#
ID:210889 发表于 2017-6-22 09:46 | 只看该作者
cjjcjj1 发表于 2017-6-22 06:04
通过你输入的 “.” 来记录后面的小数位数

不知道在display_number函数具体怎么实现
回复

使用道具 举报

6#
ID:210889 发表于 2017-6-22 17:16 | 只看该作者
,到现在还达不到目的效果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表