找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机1602液晶显示-NE555频率计/555的2号引脚连接不对

[复制链接]
跳转到指定楼层
楼主
ID:339285 发表于 2018-5-27 19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit LCD_RS= P2^6;//定义LCD引脚
  5. sbit LCD_RW= P2^5;
  6. sbit LCD_E= P2^7;
  7. uchar codeDIS[]={"NE555-------TEST"};//NE555 测试;
  8. uchar codedsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表码;
  9. uchari,c[4],a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  10. uint s;
  11. /*====================延时子程序====================*/
  12. void delay(uint z)
  13. {
  14.    uchar m;
  15.        for(;z>0;z--)
  16.               for(m=124;m>0;m--);
  17. }
  18. void delay400ms(void)////400ms延时
  19. { uchar z = 5;
  20.   uintm;
  21. while(z--)
  22.   {m=7269;
  23.    while(m--);
  24.   }
  25. }
  26. /*====================LCD1602子程序====================*/
  27. /*-- 读状态 --*/
  28. //读状态子程序;有返回值;返回值类型为CHAR型;
  29. //读回的状态通过RETURN返回;
  30. uchar read_estate(void)                              //定义有返回值的函数;
  31. { P0=0Xff;                                        //把LCD端口全置1方便读取信号;
  32. LCD_RS=0;                                                        //RS置0;
  33. LCD_RW=1;                                                       //RW置1;
  34. LCD_E=0;                                                //E端置0;
  35. delay(10);                                             //短延时;
  36. LCD_E=1;                                                   //E端置1;以锁存数据;
  37. while(P0&0x80);                //检测忙,则一直循环;
  38. return(P0);                                     //返回读取的信号;
  39. }
  40. /*-- 写数据 --*/
  41. //写数据子程序;无返回值;输入变量I;
  42. //I为要写入LCD中的数据;
  43. //数据类型CHAR形;
  44. void write_data(uchar i)                      //定义输入变量值I;
  45. {                                                                    
  46. read_estate();                                         //检测忙信号;
  47. P0=i;                                             //把I中数据送到LCD数据端;
  48. LCD_RS=1;                                                        //RS置1;
  49. LCD_RW=0;                                                       //RW置0;
  50. LCD_E=0;                                                   //E置0;
  51. delay(10);                                             //短延时;
  52. LCD_E=1;                                                   //E置1;以锁存数据;
  53. }
  54. /*-- 写指令 --*/
  55. //写指令子程序;无返回值;输入二个变量I和J.
  56. //I为要写入LCD的指令;J为判断要不要检测忙.
  57. //如果J为0则不判断检测忙;
  58. //如果J为1则判断检测忙;
  59. void write_dictate(uchar i,j)                //定义二个变量;
  60. {
  61. if(j)read_estate();             //根据需要检测忙;
  62. P0=i;                           //把要写入的数据送到LCD数据端;
  63. LCD_RS=0;                                         //RS置0;
  64. LCD_RW=0;                                                       //RW置0;
  65. LCD_E =1;                                                  //E端置0;
  66. delay(10);                                             //延时;
  67. LCD_E =0;                                                  //E端置1;以锁存数据;
  68. }
  69. /*-- LCD初始化 --*/
  70. //LCD初始化程序;主要作用初始化LCD,对LCD进行复位以及设置;
  71. void initialization(void)                      //定义函数;
  72. {
  73.   delay(50);                                             //延时5MS;
  74. write_dictate(0x38,0);                            //写指令38H;不检测忙;
  75. delay(50);                                             //延时5MS;
  76. write_dictate(0x38,0);                            //写指令38H;不检测忙;
  77. delay(50);                                             //延时5MS;
  78. write_dictate(0x38,0);                            //写指令38H;不检测忙;
  79. delay(50);
  80. write_dictate(0x38,1);                            //显示模式设置;检测忙;
  81. write_dictate(0x08,1);                            //关闭显示;检测忙;
  82. write_dictate(0x01,1);                            //显示清屏;检测忙;
  83. write_dictate(0x06,1);                            //显示光标移动设置;检测忙;
  84. write_dictate(0x0C,1);                            //显示开及光标设置;检测忙;
  85. }
  86. /*-- 在指定位置显示一个字符 --*/
  87. void displayonechar(uchar x, y,ddata)
  88. {
  89. y &= 0x01;
  90. x &= 0x0f;                             //限制X不能大于15,Y不能大于1
  91. if (y) x+= 0x40;                      //当要显示第二行时地址码+0x40;
  92. x+= 0x80;                             //算出指令码
  93. write_dictate(x,0);                    //这里不检测忙信号,发送地址码
  94. write_data(ddata);
  95. }
  96. /*-- 在指定位置显示一串字符 --*/
  97. void displaylistchar(uchar x,y,uchar code*ddata)
  98. {uchar a=0;
  99. y&=0x01;
  100. x&=0xf;
  101. while(ddata[a]>0x20)
  102. {if(x<=0xff)
  103.        {  
  104.          displayonechar(x, y,ddata[a]);
  105.          a++;
  106.          x++;
  107.        }
  108.    }
  109. }
  110. /*====================MAIN主程序====================*/
  111. void main()
  112. {
  113.   delay400ms();//延时400MS
  114. initialization();//LCD复位;
  115. displaylistchar(0,0,DIS);//显示NE555 测试;
  116. displayonechar(0,1,'F'); //在LCD是显示F=____Hz
  117. displayonechar(1,1,'=');
  118.       displayonechar(9,1,'H');
  119.    displayonechar(10,1,'z');
  120. TMOD=0X51;                //定义T0为方式一(十六位进制),T1为计数器(16位)
  121. TH0=0X3C;           //50 ms
  122. TL0=0XB0;
  123. TH1=0X00;           //初始值
  124. TL1=0X00;
  125. TR0=1;
  126. TR1=1;
  127. ET0=1;
  128. ET1=0;
  129. EA=1;
  130. i=0;
  131. /*  显示 */     //  调用显示子程序(显示位,显示行,显示数据)注:显示行 “0”为第一行,“1为第二行”
  132. while(1)
  133. {   
  134.   if(s/10000>=1)
  135.     {
  136.        displayonechar(2,1,dsptab[s/10000]);//万
  137.        displayonechar(3,1,dsptab[s/1000%10]);//千
  138.        displayonechar(4,1,'.');//点
  139.        displayonechar(5,1,dsptab[s/100%10]);//百
  140.        displayonechar(6,1,dsptab[s/10%10]);//十
  141.        displayonechar(7,1,dsptab[s%10]);    //个
  142.       displayonechar(8,1,'K');
  143.     }
  144.    else  if(s/1000>=1)
  145.         {
  146.         displayonechar(2,1,' ');
  147.         displayonechar(3,1,dsptab[s/1000%10]);//千
  148.         displayonechar(4,1,'.'); //点
  149.         displayonechar(5,1,dsptab[s/100%10]);//百
  150.         displayonechar(6,1,dsptab[s/10%10]); //十
  151.         displayonechar(7,1,dsptab[s%10]);    //个
  152.        displayonechar(8,1,'K');
  153.         }
  154.          else if(s/100>=1)
  155.          {
  156.              displayonechar(2,1,' ');
  157.                 displayonechar(3,1,' ');
  158.                 displayonechar(4,1,' '); //万
  159.                 displayonechar(5,1,' ');        //千
  160.                 displayonechar(6,1,dsptab[s/100%10]);//百
  161.                 displayonechar(7,1,dsptab[s/10%10]); //十
  162.                 displayonechar(8,1,dsptab[s%10]);    //个
  163.              }
  164.                 else if(s/10>=1)      
  165.                    {
  166.                             displayonechar(2,1,'');
  167.                            displayonechar(3,1,'');
  168.                            displayonechar(4,1,''); //万
  169.                            displayonechar(5,1,'');    //千
  170.                     displayonechar(6,1,' ');//百
  171.                       displayonechar(7,1,dsptab[s/10%10]); //十
  172.                       displayonechar(8,1,dsptab[s%10]);    //个
  173.                       }
  174.                                 else         
  175.                           {
  176.                                    displayonechar(2,1,'');
  177.                                   displayonechar(3,1,'');
  178.                                   displayonechar(4,1,''); //万
  179.                                   displayonechar(5,1,'');    //千
  180.                            displayonechar(6,1,'');//百
  181.                              displayonechar(7,1,dsptab[s/10%10]);//十
  182.                              displayonechar(8,1,dsptab[s%10]);    //个
  183.                              }
  184. }
  185. }
  186. /*  中断 */
  187. void t0()interrupt 1
  188. {
  189.        TH0=0X3C;
  190.    TL0=0XB0;
  191.        i++;
  192.        if(i==20)               //1 s时间到时
  193.        {
  194.        s=TH1;                     //555信号发生器的输出口接P3.5(T1) 15脚
  195.        s=s<<8;
  196.        s=s+TL1;         
  197.        i=0;                 //清零
  198.        TH1=0X00;
  199.        TL1=0X00;
  200.        }
  201. }
  202. /*----------------------------------------------------------------*/
  203. /*----------------- 1602液晶数据读取子程序 -----------------------*/
  204. //读数据子程序;有返回值,返回值类型为CHAR型;
  205. /*uchar read_data(void)                             //定义有返回值的子函数;
  206. {
  207. LCD_DATA=0Xff;                                        //LCD数据端口置1;
  208. LCD_RS=1;                                                        //RS置1;
  209. LCD_RW=1;                                                       //RW置1;
  210. LCD_E=0;                                                   //E置0;
  211. delay(10);                                             //短延时;
  212. LCD_E=1;                                                   //E置1;以锁存数据;
  213. return(LCD_DATA);                                     //返回读取的值;
  214. }
  215. /*----------------------------------------------------------------*/
复制代码


测试系统.zip

36.36 KB, 下载次数: 13, 下载积分: 黑币 -5

Proteus仿真图

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

使用道具 举报

沙发
ID:1 发表于 2018-5-27 23:41 | 只看该作者
请先把问题描述清楚吧,帖子先转到这里来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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