找回密码
 立即注册

QQ登录

只需一步,快速开始

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

怎么修改LCD1602显示程序,不要小数后面的

[复制链接]
跳转到指定楼层
楼主

这么修改显示+40℃呢,不要小数后面的。
我把uchar  cdis2[ ] = "+00.00";
修改成uchar  cdis2[ ] = "+00.";显示还是不变

  1. #include < reg51.h >
  2. #include < intrins.h >

  3. #define uchar unsigned char
  4. #define uint   unsigned int

  5. //#define lcddata P0
  6. #define lcddata P2
  7. sbit LCDRS=P1^7;              //液晶数据选择命令端
  8. sbit LCDRW=P1^6;             //液晶读写命令端
  9. sbit LCDEN=P1^5;            //液晶使能端
  10. //sbit LCDRS = P2^6 ;     // 命令/数据选择端  0为写命令 1为写数据      
  11. //sbit LCDRW = P2^5 ;                // lcd读写端
  12. //sbit LCDEN = P2^7 ;                //lcd使能端
  13. void write_com(uchar com);
  14. void zdyzfxs();
  15. unsigned char code   mytab[8] = {0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义 ℃字符
  16. //sbit DQ = P3^7 ;   //定义DS18B20端口DQ  
  17. sbit DQ = P1^0;   //定义DS18B20端口DQ
  18. bit presence;           //ds18b20 DQ被拉低 信号0允许,1禁止
  19. uint cc,cc2;       //变量cc中保存读出的温度值
  20. float cc1;
  21. uchar flag;                   //flag为温度值正负标志位,“1”表示温度为复制,“0”表示为正值//flag为温度值正负标志位,“1”表示温度为复制,“0”表示为正值
  22. void write_com(uchar com);

  23. uchar code cdis0[ ] = "CHECKING...";  //无字符类型0~255,定位在code区,因为定义的数据是常量,所以放在ROM(程序存储区)里面,写入后就不能再更改。放在RAM区也需要在ROM里占用同样的大小
  24. uchar code cdis1[ ] = "   DS18B20 OK   " ;
  25. //uchar code cdis5[ ] = "Temp: ";
  26. uchar  cdis2[ ] = "+00.00";
  27. uchar code cdis3[ ] = " DS18B20   ERR0R " ;
  28. uchar code cdis4[ ] = "   PLEASE CHECK  " ;

  29. unsigned char data   temp_data[2] = {0x00,0x00} ;  //存储16位温度  有字符类型-128~127    data;内部数据存储区     xdata;外部数据存储区  code;程序存储区

  30. /**********************************lcd1602********************************************/

  31. //--------------------------------- 延时程序
  32. void delaylcd(uint z)
  33. {uchar x,y;
  34. for(x=z;x>0;x--)
  35.   {for(y=110;y>0;y--);
  36.   }
  37. }

  38. /*lcd1602初始化        */
  39. /**********************************/
  40. void lcd_init(void)
  41. {
  42. LCDRW=0;                 //低电平为写
  43. LCDEN=0;                 
  44. write_com(0x38);                 //使用8位数据开关,显示两行,使用5*7字形

  45. write_com(0x0c);                //显示器开,光标关,字符不闪烁         0x0e 光标开

  46. write_com(0x06);           //字符不动,光标自动右移动一位

  47. write_com(0x01);          //清屏
  48. }

  49. /*写命令to lcd        */
  50. /**********************************/
  51. void write_com(uchar com)//写命令
  52. {
  53.   LCDRW=0;         //低电平为写
  54.   LCDRS=0;         //低电平为命令选择
  55.   //LCDEN=1;
  56.   lcddata=com;
  57.   delaylcd(5);
  58.   LCDEN=1;
  59.   delaylcd(5);
  60.   LCDEN=0;
  61. }

  62. /*写数据to lcd             */
  63. /**********************************/
  64. void write_data(uchar  date)
  65. {
  66. LCDRW=0;  //低电平为写
  67. LCDRS=1;  //高电平为数据选择
  68. //LCDEN=1;
  69. lcddata=date;
  70. delaylcd(5);
  71. LCDEN=1;
  72. delaylcd(5);
  73. LCDEN=0;
  74. }

  75. /*设定显示位置             */
  76. /********************************/
  77. void lcd_pos(uchar pos)
  78. {                                    //第一行第几列直接写pos为几,第二行pos从0x40开始
  79.    write_com(pos | 0x80) ;   //数据指针=80+地址变量
  80. }
  81. /*自定义字符写入CGRAM      */
  82. /*********************************/
  83. void mywritetab()  
  84. {  
  85.      unsigned char i ;
  86.      write_com(0x40) ;             //写CGRAM
  87.      for(i=0;i<8;i++)
  88.          {write_data(mytab[i]);}                                                                                                                                                                                                                                                                                                                                                
  89. }

  90. /*******************************ds18b20*******************************************/
  91. /*ms级别 延时程序      */
  92. void ddelay(uint ms)
  93. {
  94. uint i;
  95. uchar j;
  96. for(i=0;i<ms;i++)
  97.    for(j=0;j<250;j++)
  98.    {
  99.     _nop_();          //一个机器周期,1us
  100.            _nop_();          //适用于精度高的
  101.         _nop_();
  102.     _nop_();
  103.    }
  104. }
  105. /*us级延时,延时时间约4+2*i*/
  106. void Delayus(uchar i)
  107. {
  108.   while(--i);
  109. }
  110. /*复位,每次读写之前都要进行复位*/
  111. /**********************************/
  112. bit ow_reset(void)
  113. {
  114. DQ = 1 ;       //DQ复位
  115. Delayus(8) ;     //稍做延时

  116. DQ = 0; //拉低约600us
  117. Delayus(150);
  118. Delayus(150);

  119. DQ = 1;//产生上升沿,延时约15~60us
  120. Delayus(30);

  121. if(DQ==0) {presence=0;}         
  122. else presence=1;
  123. return(presence); //等待应答信号 0允许,1禁止
  124. }

  125. /*读取数据一位            */
  126. //---------------------------------
  127. bit Read_bit()
  128. {
  129. uint i = 0;
  130. bit b = 0;

  131. DQ = 0; //产生读时隙  
  132. i++;         //维持低电平至少1us

  133. DQ = 1; //1us以上后拉高
  134. Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效


  135. b = DQ; //读取数据
  136. Delayus(40);         //每个读时隙至少持续60us

  137. return(b);
  138. }

  139. /*读取一个字节             */
  140. //------------------------------------
  141. uchar Read_byte()
  142. {
  143. uchar byte_read = 0;
  144. uchar i, j;

  145. for(i=0; i<8; i++)
  146.   {
  147.    j = Read_bit();
  148.    byte_read = (j<<i) | byte_read; //低位读起
  149.   }

  150. return(byte_read);
  151. }

  152. //-----------------------------------------
  153. /*写一个字节         */
  154. void Write_byte(uchar byte_to_write)
  155. {
  156. uchar i = 0;
  157. uchar j = 0;
  158. bit write_bit = 0;

  159. for(j=0; j<8; j++)
  160.   {
  161.    write_bit =         (byte_to_write & 0x01);
  162.     if(write_bit == 1) //写1
  163.          {
  164.           DQ = 0;  //产生写时隙
  165.          Delayus(3);           //延时15us
  166.          
  167.           DQ = 1;  //写1
  168.           Delayus(40);   //延时,写时隙不得低于60us
  169.          }
  170.         else
  171.          {
  172.           DQ = 0;  //产生写时隙
  173.           Delayus(50);   //延时,保持低约60us~120us
  174.           DQ = 1;  
  175.           i++;
  176.          }
  177.    byte_to_write = byte_to_write >> 1;
  178.   }
  179. }
  180. //-----------------------------------
  181. /*读取温度,启动温度转换*/
  182. /*启动温度转换*/
  183. void start_convert()
  184. {
  185. ow_reset();          // 发出复位脉冲,每次操作都从复位开始
  186. ddelay(1);
  187. Write_byte(0xcc); //skip room命令,跳过序列号命令字
  188. Write_byte(0x44); //启动温度转换命令
  189. }

  190. /*读取温度值*/
  191. void read_tempreture()
  192. {
  193. ow_reset();          // 发出复位脉冲,每次操作都从复位开始
  194. ddelay(1);
  195. Write_byte(0xcc); //skip room命令
  196. Write_byte(0xbe); //读取暂存器命令
  197. temp_data[0] = Read_byte(); //存储温度低字节值 (整数部分低四位和小数部分) 先从低字节读取
  198. temp_data[1] = Read_byte(); //存储温度高字节值 (其中高五位为符号位)
  199. }
  200. //--------------------------------------
  201. /* CHECKING...显示              */
  202. void lcd_display()
  203. {
  204. uchar   m ;
  205. lcd_init() ;                 //初始化LCD
  206. lcd_pos(0) ;                 //设置显示位置为第一行的第1个字符
  207.       m = 0 ;
  208.      while(cdis0[m] != '\0')
  209.       {                          //显示字符
  210.         write_data(cdis0[m]) ;
  211.         m++ ;
  212.       }
  213. }

  214. //--------------------------------------
  215. /* DS18B20 OK 显示菜单                 */
  216. void Ok_Menu ()
  217. {
  218.      uchar   m ;
  219.      lcd_init() ;                 //初始化LCD

  220.      lcd_pos(0) ;                 //设置显示位置为第一行的第1个字符
  221.       m = 0 ;
  222.      while(cdis1[m] != '\0')
  223.       {                          //显示字符
  224.         write_data(cdis1[m]) ;
  225.         m++ ;
  226.       }         
  227. }

  228. //-----------------------------------
  229. /*DS18B20   ERR0R          */
  230. /*PLEASE   CHECK  显示    */
  231. void Error_Menu ()
  232. {
  233.       uchar   m ;
  234.       lcd_init() ;                 //初始化LCD

  235.       lcd_pos(0) ;                 //设置显示位置为第一行的第1个字符
  236.       m = 0 ;
  237.       while(cdis3[m] != '\0')
  238.       {                          
  239.         write_data(cdis3[m]) ;           //显示字符
  240.         m++ ;
  241.       }

  242.       lcd_pos(0x40) ;              //设置显示位置为第二行第1个字符
  243.       m = 0 ;
  244.       while(cdis4[m] != '\0')
  245.       {
  246.         write_data(cdis4[m]) ;       //显示字符
  247.         m++ ;
  248.       }
  249. }

  250. //-----------------------------------
  251. /*自定义字符显示    */
  252. void zdyzfxs()
  253. {
  254. mywritetab();
  255. lcd_pos(12);
  256. write_data(0x00);
  257. }
  258. //------------------------------------
  259. /*温度显示                       */
  260. void temperature_display()
  261. {
  262.   uchar m;
  263.   flag=0;
  264.   while(1)
  265.   {
  266.     ddelay(2);
  267.     EA=0;                                //DS18B20读写数据按照严格的时序,最好不要被打断,故把所有中断关闭
  268.         start_convert();                          //启动温度转换
  269.     ddelay(250);
  270.         read_tempreture();                          //读取温度
  271.     EA=1;
  272.         cc=temp_data[1]*256.0+temp_data[0];
  273.         if(temp_data[1]>0xF8) {flag=1;cc=~cc+1;} else flag=0;
  274.         cc1=cc*0.0625;
  275.         cc2=cc1*100;
  276.         cdis2[1]=cc2/1000+0x30;
  277.         if(cdis2[1]==0x30)
  278.          {cdis2[1]=0x20;}
  279.         cdis2[2]=cc2/100%10+0x30;//LCD显示温度个位
  280.         //cdis2[4]=cc2%100/10+0x30;
  281.     //cdis2[5]=cc2%10+0x30;
  282.         if(flag==1)
  283.            cdis2[0]='-';//LCD温度显示  -
  284.         else
  285.            cdis2[0]='+';//LCD温度显示  +
  286.          
  287.          lcd_pos(6) ;                 //设置显示位置为第一行的第6个字符
  288.      m=0;
  289.      while(cdis2[m]!='\0')
  290.       {                          //显示字符
  291.         write_data(cdis2[m]) ;
  292.                 m++;
  293.           }                                                                  
  294.    }
  295. }

  296. //---------------------------------
  297. /*主函数             */
  298. void main()
  299. {
  300.   lcd_display();
  301.   ddelay(1000);
  302.   ow_reset();
  303.   if(presence==0)
  304.     {
  305.           Ok_Menu ();
  306.          ddelay(1000);
  307.          zdyzfxs();//显示自定义字符 ℃
  308.          temperature_display();  
  309.     }
  310.   else
  311.     {
  312.          Error_Menu ();
  313.          while(1)
  314.          {
  315.           ow_reset();
  316.           if(presence==0)
  317.            {
  318.                 Ok_Menu ();
  319.             ddelay(1000);
  320.             temperature_display();
  321.            }
  322.          }
  323.     }
  324. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:608872 发表于 2019-10-10 17:48 | 只看该作者
自己弄好了,谢谢大家
回复

使用道具 举报

板凳
ID:235200 发表于 2019-10-10 22:51 | 只看该作者
uchar  cdis2[ ] = "+00.00";这一条是定义显示小数部分的数据,把.00去掉即可
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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