找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神帮忙看一下lcd1602程序存在的问题

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



  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 (126.08 KB, 下载次数: 32)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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