找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5435|回复: 0
收起左侧

LCD1602显示温度接线图的单片机程序

[复制链接]
ID:414239 发表于 2018-10-25 19:00 | 显示全部楼层 |阅读模式
lcd温度显示程序
0.png

单片机源程序如下:
  1. /*******************************************************************************
  2. *                 
  3. *                                        普中科技
  4. --------------------------------------------------------------------------------
  5. * 实 验 名                 : 18B20温度显示试验
  6. * 实验说明       : LCD1602显示温度值。
  7. * 连接方式       : 见连接图
  8. * 注    意                 :
  9. *******************************************************************************/

  10. #include<reg51.h>
  11. #include"lcd.h"
  12. #include"temp.h"
  13. #include"XPT2046.h"
  14. void LcdDisplay(int);
  15. typedef unsigned int u16;          
  16. typedef unsigned char u8;



  17. sbit MOTOA = P1^0;
  18. sbit MOTOB = P1^1;
  19. sbit MOTOC = P1^2;
  20. sbit MOTOD = P1^3;

  21. #define SPEED1 200
  22. #define SPEED2 250
  23. #define SPEED3 400
  24. #define GPIO_KEY P3       

  25. u8 KeyValue;
  26. void delay(u16 i)
  27. {
  28.         while(i--);       
  29. }



  30. void KeyDown(void)
  31. {
  32.         char a=0;
  33.         GPIO_KEY=0x0f;
  34.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  35.         {
  36.                 delay(1000);//延时10ms进行消抖
  37.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  38.                 {       
  39.                         //测试列
  40.                         GPIO_KEY=0X0F;
  41.                         switch(GPIO_KEY)
  42.                         {
  43.                                 case(0X07):        KeyValue=0;break;
  44.                                 case(0X0b):        KeyValue=1;break;
  45.                                 case(0X0d): KeyValue=2;break;
  46.                                 case(0X0e):        KeyValue=3;break;
  47.                         }
  48.                         //测试行
  49.                         GPIO_KEY=0XF0;
  50.                         switch(GPIO_KEY)
  51.                         {
  52.                                 case(0X70):        KeyValue=KeyValue;break;
  53.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  54.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  55.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  56.                         }
  57.                         while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  58.                         {
  59.                                 delay(1000);
  60.                                 a++;
  61.                         }
  62.                 }
  63.         }
  64. }




  65. /*******************************************************************************
  66. * 函数名         :datapros()
  67. * 函数功能                 :数据处理函数
  68. * 输入           : 无
  69. * 输出                  : 无
  70. *******************************************************************************/
  71. void datapros(int mmm)
  72. {

  73.     unsigned char disp[] = {0, 0, 0, 0 }; //定义数组

  74.        
  75.         static u8 i;
  76. /*        if(i==50)
  77.         {
  78.                 i=0;
  79.                 mmm = Read_AD_Data(0x94);                //   AIN0 电位器
  80.         }
  81.         i++;  */
  82.         disp[0]=mmm/1000;//千位
  83.         disp[1]=mmm%1000/100;//百位
  84.         disp[2]=mmm%1000%100/10;//个位
  85.         disp[3]=mmm%1000%100%10;



  86.                 LcdWriteCom(0x82);        //
  87.             LcdWriteData('0'+disp[0]);
  88.                 LcdWriteCom(0x83);        //
  89.             LcdWriteData('0'+disp[1]);
  90.                 LcdWriteCom(0x84);        //
  91.             LcdWriteData('0'+disp[2]);
  92.                 LcdWriteCom(0x85);        //
  93.             LcdWriteData('0'+disp[3]);
  94. }



  95. /*******************************************************************************
  96. * 函数名         : main
  97. * 函数功能                   : 主函数
  98. * 输入           : 无
  99. * 输出                  : 无
  100. *******************************************************************************/

  101. void main()
  102. {
  103.         LcdInit();        //初始化LCD1602
  104.         P1=0X00;


  105.            while(1)
  106.         {       
  107.                 KeyDown();                   //按键判断函数
  108.                  while( KeyValue==0 )
  109.                 {       
  110.                   MOTOA = 1;
  111.                  MOTOB = 0;
  112.                  MOTOC = 1;
  113.                  MOTOD = 1;
  114.                  delay(SPEED1);

  115.                  MOTOA = 1;
  116.                    MOTOB = 1;
  117.                  MOTOC = 1;
  118.                  MOTOD = 0;
  119.                  delay(SPEED1);

  120.                  MOTOA = 0;
  121.                  MOTOB = 1;
  122.                  MOTOC = 1;
  123.                  MOTOD = 1;
  124.                  delay(SPEED1);

  125.                  MOTOA = 1;
  126.                  MOTOB = 1;
  127.                  MOTOC = 0;
  128.                  MOTOD = 1;
  129.                  delay(SPEED1);
  130.                           break;
  131.                 }
  132.                 while( KeyValue==1 )
  133.                 {       
  134.                  MOTOA = 1;
  135.                     MOTOB = 0;
  136.                  MOTOC = 1;
  137.                  MOTOD = 1;
  138.                  delay(SPEED2);

  139.                  MOTOA = 1;
  140.                  MOTOB = 1;
  141.                  MOTOC = 1;
  142.                  MOTOD = 0;
  143.                  delay(SPEED2);

  144.                  MOTOA = 0;
  145.                  MOTOB = 1;
  146.                  MOTOC = 1;
  147.                  MOTOD = 1;
  148.                  delay(SPEED2);

  149.                  MOTOA = 1;
  150.                  MOTOB = 1;
  151.                  MOTOC = 0;
  152.                  MOTOD = 1;
  153.                  delay(SPEED2);
  154.                            break;
  155.                 }
  156.                 while( KeyValue==2 )
  157.                 {       
  158.                  MOTOA = 1;
  159.                  MOTOB = 0;
  160.                 MOTOC = 1;
  161.                 MOTOD = 1;
  162.                 delay(SPEED3);

  163.                 MOTOA = 1;
  164.                 MOTOB = 1;
  165.                 MOTOC = 1;
  166.                 MOTOD = 0;
  167.                 delay(SPEED3);

  168.                 MOTOA = 0;
  169.                 MOTOB = 1;
  170.                 MOTOC = 1;
  171.                 MOTOD = 1;
  172.                 delay(SPEED3);

  173.                 MOTOA = 1;
  174.                 MOTOB = 1;
  175.                 MOTOC = 0;
  176.                 MOTOD = 1;
  177.                 delay(SPEED3);
  178.                           break;
  179.                  }
  180.                 while(KeyValue==3)
  181.                 {
  182.                  P1=0X00;
  183.                           break;
  184.                 }
  185.                 while(KeyValue==4)
  186.                 {
  187.                 LcdWriteCom(0x88);        //写地址 80表示初始地址
  188.             LcdWriteData('C');
  189.                 LcdDisplay(Ds18b20ReadTemp());
  190.                 break;
  191.                 }
  192.                 while(KeyValue==5)
  193.                 {
  194.                  LcdWriteCom(0x01);
  195.           
  196.                           break;
  197.                 }
  198.                 while(KeyValue==6)
  199.                 {
  200.                  LcdWriteCom(0x01);
  201.                 datapros(Read_AD_Data(0x94));

  202.             break;
  203.                 }


  204.         }               
  205. }




  206.                
  207. /*******************************************************************************
  208. * 函数名         : LcdDisplay()
  209. * 函数功能                   : LCD显示读取到的温度
  210. * 输入           : v
  211. * 输出                  : 无
  212. *******************************************************************************/

  213. void LcdDisplay(int temp)          //lcd显示
  214. {
  215.    
  216.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
  217.         float tp;  
  218.         if(temp< 0)                                //当温度值为负数
  219.           {
  220.                   LcdWriteCom(0x80);                //写地址 80表示初始地址
  221.             LcdWriteData('-');                  //显示负
  222.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  223.                 temp=temp-1;
  224.                 temp=~temp;
  225.                 tp=temp;
  226.                 temp=tp*0.0625*100+0.5;       
  227.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  228.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  229.                 //算由?.5,还是在小数点后面。

  230.           }
  231.         else
  232.           {                       
  233.                   LcdWriteCom(0x80);                //写地址 80表示初始地址
  234.             LcdWriteData('+');                 //显示正
  235.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  236.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  237.                 temp=tp*0.0625*100+0.5;       
  238.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  239.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  240.                 //算加上0.5,还是在小数点后面。
  241.         }
  242.         datas[0] = temp / 10000;
  243.         datas[1] = temp % 10000 / 1000;
  244.         datas[2] = temp % 1000 / 100;
  245.         datas[3] = temp % 100 / 10;
  246.         datas[4] = temp % 10;

  247.         LcdWriteCom(0x82);                  //写地址 80表示初始地址
  248.         LcdWriteData('0'+datas[0]); //百位

  249.        
  250.         LcdWriteCom(0x83);                 //写地址 80表示初始地址
  251.         LcdWriteData('0'+datas[1]); //十位

  252.         LcdWriteCom(0x84);                //写地址 80表示初始地址
  253.         LcdWriteData('0'+datas[2]); //个位

  254.         LcdWriteCom(0x85);                //写地址 80表示初始地址
  255.         LcdWriteData('.');                 //显示 ‘.’

  256.         LcdWriteCom(0x86);                 //写地址 80表示初始地址
  257.         LcdWriteData('0'+datas[3]); //显示小数点  

  258.         LcdWriteCom(0x87);                 //写地址 80表示初始地址
  259.         LcdWriteData('0'+datas[4]); //显示小数点  
  260. }
复制代码

下载:
LCD1602显示温度接线图 (1).zip (60.58 KB, 下载次数: 38)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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