找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1882|回复: 2
收起左侧

怎么解决单片机+液晶屏显示数字位数 求帮助

[复制链接]
ID:819671 发表于 2021-4-22 18:45 来自手机 | 显示全部楼层 |阅读模式
50黑币
这是我的温度检测程序,液晶屏显示小数点后三位数,想改成只显示小数点后两位,怎样改呢
void main(){        lcd_ini();        ds18_ini();        //ds18B20初使化           ds18_write(0xcc);  //跳过序列号           ds18_write(0x44);  //启动温度转换         xie1602(4,t_h);         xie1602(12,t_l);        while(1)        {                ds18_check();  //从DS18B20中读出温度                xianshi1();                xiugai();                panduan();                        }}void xie1602(uint8 add,uint8 daa){        lcd_order(0x80+add);        lcd_data(0x30+daa/10);        lcd_data(0x30+daa%10);}//判断是否在报警范围内void panduan(){        if(tmp<(t_l*1000)||tmp>(t_h*1000)&&t_l>=0)        {                BUZZER = 0;                delay(10);        }        else if(t_l<0&&tmp>(t_h*1000))        {                BUZZER = 1;                }        else                BUZZER = 1;}//选择修改的内容void xiugai(){        uint8 jj;        uint8 i = 0;        BUZZER = 1;                if(K1==0)        {                while(!K1);                while(1)                {                        lcd_order(0x0f);  //开启光标显示                        lcd_order(0x80+5);//光标显示位置                        if(K2 == 0)                        //判断加按键按下                        {                                while(K2 == 0);                  //等待按键释放                                        t_h++;                         //温度上限加1                                        xie1602(4,t_h);          //将温度上限显示出来                        }                        if(K3 == 0)                                   //判断减按键按下                        {                                while(K3 == 0);                        //等待按键释放                                if(t_h>t_l)                                //判断 温度上限大于温度下限                                        t_h--;                                xie1602(4,t_h);                         //将温度上限显示出来                        }                        if(K1 == 0)                           //后面的注释类似                        {                                while(K1 == 0);                                while(1)                                {                                        lcd_order(0x0f);                                        lcd_order(0x80+13);                                                if(K2 == 0)                                        {                                                while(K2 == 0);                                                if(t_l<t_h&&t_l>=0)                                                {                                                        lcd_order(0x80+11);                                                        lcd_data(' ');                                                        t_l++;                                                        xie1602(12,t_l);                                                }                                                else {                                                        t_l++;                                                        jj = ~t_l;                                                        xie1602(12,jj);                                                }                                        }                                        if(K3 == 0)                                        {                                                while(K3 == 0);                                                if(t_l>(-50))                                                {                                                        t_l--;                                                        if(t_l<0)                                                                jj = ~t_l;                                                }                                                if(t_l>=0)                                                {                                                        lcd_order(0x80+11);                                                        lcd_data(' ');                                                        xie1602(12,t_l);                                                }                                                if(t_l<0)                                                {                                                                xie1602(12,jj);                                                        lcd_order(0x80+11);                                                        lcd_data('-');                                                }                                        }                                        if(K1 == 0)                                        {                                                while(K1 == 0);                                                goto loop;                                        }                                                }                        }                }                                        }        loop:BUZZER = 1;        }/**********************************************函数名:delay行参  :time 延时基数功能  :用while延时************************************************/// 延时函数(1ms单位)void delay(uint16 time){        while(time--);}/**********************************************函数名:lcd_ini功能  :LCD1602的初始化************************************************/void lcd_ini()  {         uint8 i;                 RW = 0;          lcd_order(0x38);          //设置1602的显示光标功能          delay(100);                            lcd_order(0x0e);          //显示开及光标设置           delay(100);          lcd_order(0x06);          //显示光标移动设置          delay(100);          lcd_order(0x01);          //显示清屏          delay(100);          lcd_order(0x80);                  for(i = 0;i<16;i++)                        lcd_data(hodometer[i]);  }/**********************************************函数名:lcd_order行参  :date 要定入的指令功能  :向LCD1602的写1个指令************************************************/void lcd_order(uint8 date){  RS=0;                  //选择写指令    EN_LCD=0;          //使能初使化  P0=date;          //发送指令  EN_LCD=1;          //开使能  delay(100);          //延时  EN_LCD=0;          //关使能}/**********************************************函数名:lcd_order行参  :date 要定入的指令功能  :向LCD1602的写1个指令************************************************/void lcd_data(uint8 date){  RS=1;                  //选择写数据    EN_LCD=0;          //使能初使化  P0=date;          //发送指令  EN_LCD=1;          //开使能  delay(100);          //延时  EN_LCD=0;          //关使能}/*************************************************************                                              DS18B20**************************************************************//****************************************函数名:    ds18_ini功能:      对DS18B20进行初使化,            若DS18B20是好的则返回1                        若DS18B20是环的则返回0****************************************///ds18B20初使化函数,可根据资料上的时序来写uint8 ds18_ini(){  uint8 ans;  DS18B20 = 1;  delay(1);  DS18B20 = 0;  delay(100);  DS18B20 = 1;  delay(6);  ans = DS18B20;  delay(100);   if(!ans)     return 1;  else     return 0;}/**********************************函数名:    ds18_write函数行参:  date(向ds18b20写入的数据)功能:      功能向DS18B20中写入一个数据***********************************/void ds18_write(uint8 date){  uint8 i;  DS18B20=1;  delay(1);  for(i=0;i<8;i++)        //根据时序将数据从低到高一位一位发送出来       {                    DS18B20 = 0;                 if(date&0x01) //从低到高取出数据的每位                 DS18B20 = 1;                 else                 DS18B20 = 0;                 delay(10);                 DS18B20 = 1;                 date>>=1;                 delay(1);                            }}  /*************************************************函数名:    ds18_read函数返回值:rate(从ds18b20中读出的数据)功能:      功能从DS18B20中读出一个数据并返回。*************************************************/uint8 ds18_read(){  uint8 i,date = 0;  DS18B20 = 1;                  //释放总线  delay(1);  for(i = 0;i < 8;i ++)          //根据时序将数据从低到高一位一位接收       {                              DS18B20 = 0;                  date >>= 1;                  DS18B20 = 1;                  if(DS18B20)                     date |= 0x80;         //将date的一位置1                  delay(8);                  DS18B20 = 1;                  delay(1);                      }   return date;                          //返回读出的数}/************************************************************函数名:     ds18_check函数返回值: tmp(当前温度)功能:       起动DS18B20行进温度采集,并返回当前温度(tmp)*************************************************************/void ds18_check(){  uint8 date1,date2;  float ta;  if(ds18_ini())    {                    ds18_write(0xcc);          //跳过序列号          ds18_write(0x44);          // 启动温度转换          ds18_ini();                  // 复位          ds18_write(0xcc);          //跳过序列号          ds18_write(0xbe);          // 启动读取温度          date1 = ds18_read();   //读取两个温度字节          date2 = ds18_read();          tmp=date2;          tmp<<=8;          tmp=tmp|date1;          ta=tmp*0.0625;          tmp=ta*1000;        } }void xianshi1(){        uint8 i;        temp[8]=0x30+tmp/10000;        temp[9]=0x30+tmp/1000%100;        temp[11]=0x30+tmp/100%100;        temp[12]=0x30+tmp/10%100;        temp[13]=0x30+tmp%10;        lcd_order(0x80+0x40);        for(i = 0;i<16;i++)                lcd_data(temp[i]);        }

1619088291879..jpg
回复

使用道具 举报

ID:517951 发表于 2021-4-23 09:31 | 显示全部楼层
代码都缩成一团,怎么看得了啊
回复

使用道具 举报

ID:905171 发表于 2021-4-23 11:54 | 显示全部楼层
不应该是对10取余数吗,怎么高位都%100
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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