找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么单片机下载程序后,LCD无显示,代码如下 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:532923 发表于 2019-5-13 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #include <intrins.h>

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

  5. sbit P00 = P0^0;
  6. sbit P01 = P0^1;
  7. sbit P02 = P0^2;
  8. sbit P03 = P0^3;
  9. sbit P04 = P0^4;
  10. sbit P05 = P0^5;
  11. sbit P06 = P0^6;
  12. sbit P07 = P0^7;

  13. sbit P10 = P1^0;
  14. sbit P11 = P1^1;
  15. sbit P12 = P1^2;
  16. sbit P13 = P1^3;
  17. sbit P14 = P1^4;
  18. sbit P15 = P1^5;
  19. sbit P16 = P1^6;
  20. sbit P17 = P1^7;

  21. sbit P20 = P2^0;
  22. sbit P21 = P2^1;
  23. sbit P22 = P2^2;
  24. sbit P23 = P2^3;
  25. sbit P24 = P2^4;
  26. sbit P25 = P2^5;
  27. sbit P26 = P2^6;
  28. sbit P27 = P2^7;

  29. sbit P30 = P3^0;
  30. sbit P31 = P3^1;
  31. sbit P32 = P3^2;
  32. sbit P33 = P3^3;
  33. sbit P34 = P3^4;
  34. sbit P35 = P3^5;
  35. sbit P36 = P3^6;
  36. sbit P37 = P3^7;

  37. //****** DS18B20 ******
  38. #define DQ P17

  39. /*************精确延时函数*****************/
  40. void delay10us(void)                   //误差 0us
  41. {
  42.     unsigned char a,b;
  43.     for(b=1;b>0;b--)
  44.         for(a=2;a>0;a--);
  45. }
  46. void delay20us(void)                   //误差 0us
  47. {
  48.     unsigned char a,b;
  49.     for(b=1;b>0;b--)
  50.         for(a=7;a>0;a--);
  51. }
  52. void delay30us()                           //误差 0us
  53. {
  54.     unsigned char a,b;
  55.     for(b=3;b>0;b--)
  56.         for(a=3;a>0;a--);
  57. }
  58. void delay100us()                   //误差 0us
  59. {
  60.     unsigned char a,b;
  61.     for(b=1;b>0;b--)
  62.         for(a=47;a>0;a--);
  63. }
  64. void delay200us(void)           //误差 0us
  65. {
  66.     unsigned char a,b;
  67.     for(b=1;b>0;b--)
  68.         for(a=97;a>0;a--);
  69. }
  70. void delay500us()                   //误差 0us
  71. {
  72.     unsigned char a,b;
  73.     for(b=71;b>0;b--)
  74.         for(a=2;a>0;a--);
  75. }

  76. void DS18B20_init()     //DS18B20初始化 复位
  77. {
  78.         DQ = 1;
  79.         _nop_();
  80.         _nop_();
  81.         _nop_();
  82.         _nop_();                        //延时几个时钟周期 保证DQ引脚稳定在高电平
  83.         DQ = 0;
  84.         delay500us();                //最短为480us的低电平信号 复位

  85.         DQ = 1;                         //拉高总线 15-60us
  86.         delay30us();
  87.         
  88.         delay200us();                //延时足够时间 复位基本上都会成功
  89.         DQ = 1;                                //释放总线
  90. }

  91. uchar Read_One_Byte()
  92. {
  93.         uchar i;
  94.         uchar byte = 0;
  95.         for(i = 0;i < 8;i++)
  96.         {        
  97.                 DQ = 1;
  98.                 _nop_();
  99.                 _nop_();
  100.                 _nop_();
  101.                 _nop_();                        //延时几个时钟周期 保证DQ引脚稳定在高电平
  102.                 DQ = 0;
  103.                 byte >>= 1;
  104.                 delay20us();
  105.                 DQ = 1;                                //给脉冲 产生读时间间隙
  106.                 delay10us();                //延时一定时间后,读DQ的值
  107.                 if(DQ)
  108.                 {        byte |= 0x80;}        //读得DQ为1 将1写到dat最高位 ;读得DQ为0 不必处理
  109.                 delay100us();
  110.                 DQ = 1;               
  111.         }
  112.         return(byte);
  113. }

  114. void Write_One_Byte(uchar byte)
  115. {
  116.         uchar i = 0;
  117.         for(i = 0;i < 8;i++)
  118.         {
  119.                 DQ = 1;
  120.                 _nop_();
  121.                 _nop_();
  122.                 _nop_();
  123.                 _nop_();                        //延时几个时钟周期 保证DQ引脚稳定在高电平
  124.                 DQ = 0;
  125.                 DQ = byte & 0x01;        //写所给数据最低位
  126.                 delay30us();
  127.                 byte >>= 1;
  128.         }
  129. }
  130. int Read_Temp() ////////***读取温度值***********///// 每次读写均要先复位
  131. {
  132.         int t;
  133.         float tep;
  134.         uchar a,b;
  135.         DS18B20_init();
  136.         Write_One_Byte(0xcc);        //跳过ROM命令 单个传感器所以不必读取ROM里的序列号
  137.         Write_One_Byte(0x44);        //开始转换
  138.         DS18B20_init();
  139.         Write_One_Byte(0xcc);        //跳过ROM命令
  140.         Write_One_Byte(0xbe);        //读寄存器,共九字节,前两字节为转换值
  141.         a = Read_One_Byte();         //a存低字节
  142.         b = Read_One_Byte();         //b存高字节
  143.         t = b;
  144.         t <<= 8;//高字节转换为10进制
  145.         t = t|a;
  146.         tep = t*0.0625;//转换精度为0.0625/LSB
  147.         t = tep*10 + 0.5;//保留1位小数并四舍五入****后面除10还原正确温度值)
  148.         return(t);
  149. }
  150. /***********        LCD                ************/
  151. #define RS P22
  152. #define RW P21
  153. #define LCDEN P20
  154. #define LCD_DATA P0                //P0口接LCD数据口
  155. #define LCD_BUSY P07        //lcd1602忙碌标志位
  156. uchar idata lcd_code[10];//用来标记lcd1602 什么时候清显示  每个页面都设一个code,code不想同时清显示

  157. //*****************************************延时函数***************************************//
  158. void delayms(uint ms)//延时
  159. {
  160.     uchar a,b,c;
  161.         while(ms--)
  162.         {
  163.           for(c=1;c>0;c--)
  164.         for(b=142;b>0;b--)
  165.             for(a=2;a>0;a--);
  166.         }
  167. }


  168. //****************    LCD    ********************
  169. //LCD基本函数:
  170. void busy_check()  //忙碌检测
  171. {        
  172.         RW = 1;         //读
  173.         RS = 0;        //指令寄存器
  174.         LCD_DATA = 0xFF;//实验证明读数时要将I/O口要置1  

  175.         LCDEN = 0;
  176.         _nop_();
  177.         _nop_();
  178.         _nop_();
  179.         _nop_();
  180.         LCDEN = 1;// EN高电平读信息 负跳变执行指令
  181.         _nop_();
  182.         _nop_();
  183.         _nop_();
  184.         _nop_();
  185.         while(1)
  186.         {
  187.                 if(LCD_BUSY == 0)//P07 == 0跳出循环
  188.                         break;
  189.         }
  190.         
  191. }
  192. void lcdwrcom(uchar command)//写指令
  193. {        
  194.         busy_check();
  195.         RW = 0;//写
  196.     RS = 0;//指令寄存器
  197.     LCD_DATA = command;

  198.         LCDEN = 1;//负跳变写入指令
  199.         _nop_();
  200.         _nop_();
  201.         _nop_();
  202.         _nop_();
  203.         LCDEN = 0;
  204. }
  205. void lcdwrdata(uchar lcd_data)//写数据        数字、字母、标点符号都是数据
  206. {
  207.         busy_check();
  208.         RW = 0;//写
  209.     RS = 1;//数据寄存器
  210.     LCD_DATA = lcd_data;

  211.         LCDEN = 1;//负跳变写入指令
  212.         _nop_();
  213.         _nop_();
  214.         _nop_();
  215.         _nop_();
  216.         LCDEN = 0;        
  217. }

  218. void lcd_init()
  219. {        
  220.         delayms(15);//必要 lcd1602上电到电压稳定需要时间   
  221.         RW = 0;//写
  222.         RS = 0;//指令寄存器
  223.     LCD_DATA = 0x38;// 0x38设置显示模式为:16X2 显示,5X7 点阵,8 位数据接口'
  224.         LCDEN = 1;
  225.         _nop_();
  226.         _nop_();
  227.         _nop_();
  228.         _nop_();
  229.         LCDEN = 0;
  230.         delayms(5);

  231.         lcdwrcom(0x0c);//打开显示 无光标 不闪烁
  232.         lcdwrcom(0x06);//指令3 光标右移 屏幕所有文字移动无效
  233.         lcdwrcom(0x01);// 清显示,光标复位到地址00H位置。
  234. }

  235. //LCD扩展函数:
  236. void address(uchar x,uchar y)  //定位下一步要写数的地址
  237. {        
  238.         uchar location;
  239.         if(x == 0)
  240.             location = 0x80|y;
  241.         else
  242.                 location = 0xC0|y;

  243.          lcdwrcom(location);               
  244. }
  245. void printchar(uchar x,uchar y,uchar letter)//显示字母、单个字符
  246. {
  247.         address(x,y);
  248.         lcdwrdata(letter);
  249. }
  250. void printword(uchar x,uchar y,uchar *word) //显示单词(字符数组)
  251. {
  252.         uchar i = 0;
  253.         for(i = 0;word[i] != '\0';i++)
  254.         {
  255.                 address(x,y + i);
  256.                 lcdwrdata(word[i]);        
  257.         }        
  258. }

  259. void printtemp(uchar x,uchar y ,uint temp)        //显示温度 显示一位小数 【显示效果相当于将一个数除以10并保存一位小数】
  260. {
  261.         if(temp < 100)
  262.         {
  263.                 address(x,y);
  264.                 lcdwrdata(temp/10 + '0');
  265.                 address(x,y + 1);
  266.                 lcdwrdata('.');
  267.                 address(x,y + 2);
  268.                 lcdwrdata(temp%10 + '0');
  269.                 address(x,y + 3);
  270.                 lcdwrdata(' ');
  271.                 address(x,y + 4);
  272.                 lcdwrdata(' ');
  273.         }
  274.         else if(temp < 1000)
  275.         {
  276.                 address(x,y);
  277.                 lcdwrdata(temp/100 + '0');
  278.                 address(x,y + 1);
  279.                 lcdwrdata(temp%100/10 + '0');
  280.                 address(x,y + 2);
  281.                 lcdwrdata('.');
  282.                 address(x,y + 3);
  283.                 lcdwrdata(temp%10 + '0');
  284.                 address(x,y + 4);
  285.                 lcdwrdata(' ');
  286.         }
  287.         else if(temp < 10000)
  288.         {
  289.                 address(x,y);
  290.                 lcdwrdata(temp/1000 + '0');
  291.                 address(x,y + 1);
  292.                 lcdwrdata(temp%1000/100 + '0');
  293.                 address(x,y + 2);
  294.                 lcdwrdata(temp%100/10 + '0');
  295.                 address(x,y + 3);
  296.                 lcdwrdata('.');
  297.                 address(x,y + 4);
  298.                 lcdwrdata(temp%10 + '0');
  299.         }        
  300. }
  301. void main()
  302. {
  303.         int temp;        //温度值
  304.         lcd_init();
  305.         printword(0,0,"temp:");
  306.         while(1)
  307.         {        
  308.                 temp = Read_Temp();
  309.                 if(temp > 0 )
  310.                 {
  311.                         printchar(0,5,'+');
  312.                         printtemp(0,6,temp);
  313.                 }
  314.                 else if(temp == 0)
  315.                 {
  316.                         printchar(0,5,' ');
  317.                         printchar(0,6,'0');
  318.                 }
  319.                 else
  320.                 {
  321.                         temp = -temp;
  322.                         printchar(0,5,'-');
  323.                         printtemp(0,6,temp);
  324.                 }        
  325.         }        
  326. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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