久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1472|回復: 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. }
復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲a视频 | 日批av| 久久69精品久久久久久久电影好 | 美女黄网站 | 日韩欧美综合在线视频 | 翔田千里一区二区 | 福利视频亚洲 | 日韩一区二区三区在线 | 2018国产大陆天天弄 | 中文字幕一区二区三区在线观看 | 97精品超碰一区二区三区 | 91精品国产综合久久久久久蜜臀 | 成人免费网站www网站高清 | 在线观看国产视频 | 成人影 | 黄色免费在线观看 | 精品一区二区久久久久久久网精 | 精品一区二区三区在线观看 | 国产精品夜夜春夜夜爽久久电影 | 成人在线观看中文字幕 | 91久久看片 | www.99热.com| 精品日韩一区二区 | 久久久亚洲一区 | 高清视频一区二区三区 | 国产亚洲精品久久情网 | 黄色国产大片 | 国产日韩一区二区三免费 | 亚洲成人福利视频 | 91精品国产综合久久久久久漫画 | 国产精品国产 | 午夜小视频在线播放 | 91精品国模一区二区三区 | 国产精品久久av | 国产精品乱码一区二区三区 | 亚洲欧洲小视频 | 亚洲国产精品99久久久久久久久 | 亚洲精品一区二区网址 | 成人在线免费观看视频 | 免费观看www7722午夜电影 | 久久另类|