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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2352|回復: 0
收起左側

求大神幫忙看一下lcd1602程序存在的問題

[復制鏈接]
ID:251225 發表于 2017-11-19 22:25 | 顯示全部樓層 |閱讀模式

這是仿真圖

這是仿真圖



  1. #include <reg52.h>
  2. # include <intrins.h>
  3. #define uchar unsigned char   
  4. #define uint unsigned int
  5. sbit   io = P1^0;   
  6. sbit  rs = P2^0;   
  7. sbit  rw = P2^1;   
  8. sbit   ep = P2^2;   
  9. uchar data_byte ;
  10. uchar RH,RL,TH,TL;
  11. typedef bit BOOL;//此聲明一個布爾型變量即真或假


  12. BOOL lcd_bz()//測試lcd忙碌狀態返回值為布爾型數值真或假'1'.'0'  

  13. {

  14.         BOOL result;
  15.   rs=0;         
  16.   rw=1;
  17.   ep=1;
  18.   _nop_();
  19.   _nop_();
  20.   _nop_();
  21.   _nop_();
  22.   result = (BOOL)(P0&0x80);
  23.   ep=0;
  24.   result ;

  25. }   


  26. void delay(uchar ms) //延時模塊//

  27. {

  28.   uchar i;

  29.   while(ms--)                 

  30.   for(i=0;i<100;i++);

  31. }



  32. void delay1()//一個for循環大概需要8個多機器周期一個機器周期為1us晶振為12MHz也就是說本函數延時8us多此延時函數必須德稍微精確一點

  33. {

  34.   uchar i;

  35.   for(i=0;i<1;i++);

  36. }

  37. void write_com(uchar com)//寫指令//

  38. {
  39.         

  40.   while (lcd_bz());
  41.   rs=0;
  42.   rw=0;
  43.   ep=0;
  44.   _nop_();
  45.   _nop_();
  46.   P0=com;
  47.   _nop_();
  48.   _nop_();
  49.   _nop_();
  50.   _nop_();
  51.   ep=1;
  52.   _nop_();
  53.   _nop_();
  54.   _nop_();
  55.   _nop_();
  56.   ep=0;

  57. }


  58. void write_addr(uchar addr)//寫地址//

  59. {

  60.   write_com(addr+0x80);//LCD第一行的首地址為0x80第二行的首地址為0x80+0x40=0xc0

  61. }



  62. void write_byte(uchar dat) //寫數據//

  63. {

  64.   while (lcd_bz());
  65.   rs=1;
  66.   rw=0;
  67.   ep=0;
  68.   _nop_();
  69.   _nop_();
  70.   P0=dat ;
  71.   _nop_();
  72.   _nop_();
  73.   _nop_();
  74.   _nop_();
  75.   ep=1;
  76.   _nop_();
  77.   _nop_();
  78.   _nop_();
  79.   _nop_();
  80.   ep=0;

  81. }


  82. void lcd_init()   //液晶初始化
  83. {
  84.   ep=0;
  85.   rw=0;    //只寫不讀
  86.   write_com(0x38);   //顯示模式設置,設置16*2顯示,5*7點陣,8位數據接口
  87.   delay(2);
  88.   write_com(0x0c);   //顯示開關及光標設置
  89.   delay(2);
  90.   write_com(0x06);  //讀一個字符后地址指針加一
  91.   delay(2);
  92.   write_com(0x01);   //清屏
  93.   delay(2);
  94. }


  95. void display(uchar addr,uchar q)//在某一地址上顯示內容adder表示的是地址偏移量q表示顯示的字符或數字//

  96. {

  97.   delay(10);   

  98.         write_addr(addr);

  99.   write_byte(q);

  100.   delay(1);//修改此時間可以改變LCD上數值跳變的數度
  101.         
  102. }



  103.         
  104.         
  105. void start()//開始信號

  106. {

  107.   io=1;

  108.   delay1();

  109.   io=0;

  110.   delay(25);// 主機把總線拉低必須大于18ms保證DHT11能檢測到起始信號

  111.   io=1;    //發送開始信號結束后拉高電平延時20-40us

  112.   delay1();//以下三個延時函數差不多為24us符合要求

  113.   delay1();

  114.   delay1();

  115. }


  116. uchar receive_byte()//接收一個字節//

  117. {

  118.   uchar i,temp;

  119.   for(i=0;i<8;i++)//接收8bit的數據

  120.   {

  121.          while(!io);//等待50us的低電平開始信號結束

  122.          delay1();//開始信號結束之后延時26us-28us以下三個延時函數

  123.          delay1();

  124.          delay1();
  125.                
  126.                 delay1();
  127.                 delay1();
  128.                 delay1();
  129.                 delay1();

  130.          temp=0;//時間為26us-28us表示接收的為數據'0'
  131.                         delay1();
  132.                 delay1();
  133.                 delay1();
  134.                 delay1();
  135.                 delay1();
  136.                

  137.          if(io==1)

  138.          temp=1; //如果26us-28us之后還為高電平則表示接收的數據為'1'

  139.   data_byte<<=1;//接收的數據為高位在前右移
  140.         
  141.         data_byte|=temp;

  142.   }
  143.          return data_byte;

  144. }


  145. void receive()//接收數據//

  146. {

  147.   uchar T_H,T_L,R_H,R_L,check,num_check,i;

  148.   start();//開始信號//

  149.   io=1;   //主機設為輸入判斷從機DHT11響應信號

  150.   if(!io)//判斷從機是否有低電平響應信號//

  151.   {  
  152.         while(!io);//判斷從機發出 80us 的低電平響應信號是否結束//

  153.         while(io);//判斷從機發出 80us 的高電平是否結束如結束則主機進入數據接收狀態

  154.         R_H=receive_byte();//濕度高位

  155.          R_L=receive_byte();//濕度低位

  156.         T_H=receive_byte();//溫度高位

  157.         T_L=receive_byte();//溫度低位

  158.         check=receive_byte();//校驗位

  159.         io=0; //當最后一bit數據接完畢后從機拉低電平50us//

  160.         for(i=0;i<7;i++)//差不多50us的延時

  161.         delay1();

  162.         io=1;//總線由上拉電阻拉高進入空閑狀態

  163.         num_check=R_H+R_L+T_H+T_L;

  164.         if(num_check==check)//判斷讀到的四個數據之和是否與校驗位相同

  165.          {

  166.    RH=R_H;

  167.    RL=R_L;

  168.    TH=T_H;

  169.    TL=T_L;

  170.    check=num_check;

  171.          }

  172.   }

  173. }


  174. void main()//主函數模塊//

  175. {

  176.   lcd_init();//初始化LCD

  177.   while(1)

  178.   {

  179.     receive();//接收數據

  180. display(0x00,'R');//LCD的第一行顯示

  181. display(0x01,':');

  182. display(0x02,RH/10+0x30); //0x30表示帶字庫的LCD1602中0x30的位置放有數字0RH/10+0x30即表示濕度的十位數字在字庫RH/10+0x30的位置處放著

  183. display(0x03,RH%10+0x30);

  184. display(0X04,'%');

  185. display(0x40,'T');//LCD的第二行顯示

  186. display(0x41,':');

  187. display(0x42,TH/10+0x30);

  188. display(0x43,TH%10+0x30);

  189. display(0x44,0xdf);//以下兩個是溫度單位的處理

  190. display(0x45,0x43);

  191.   }
  192. }
復制代碼

無標題.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲在线免费 | 国产婷婷色一区二区三区 | 久草网址 | 一级黄色录像毛片 | 欧美中文一区 | 狠狠狠色丁香婷婷综合久久五月 | 免费一级做a爰片久久毛片潮喷 | 农村真人裸体丰满少妇毛片 | 一级毛片视频在线观看 | 视频二区 | 青青久久 | 欧美综合在线视频 | 中文字幕成人在线 | 欧美区日韩区 | av片免费 | 日本高清不卡视频 | 人人擦人人干 | 久久精品小短片 | 国产精品久久久久久久久免费丝袜 | 99精品免费久久久久久日本 | 这里只有精品999 | 国产精品久久久久久久久久 | 国产精品不卡视频 | 夜夜草| 99re视频这里只有精品 | 国产视频第一页 | 精品在线一区二区 | 日韩欧美国产精品 | 国产精品毛片一区二区三区 | 国产乱码久久久 | 女同久久另类99精品国产 | 香蕉视频一区二区 | 黄色精品 | 天天综合网天天综合色 | 免费特级黄毛片 | 九九九久久国产免费 | 99色在线 | 日本五月婷婷 | 日本久久综合 | 久久这里只有精品首页 | 久久久久久一区 |