找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的1602显示源代码

[复制链接]
跳转到指定楼层
楼主
ID:240991 发表于 2017-10-19 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. #include<reg52.h>
  2. #define uchar unsigned char//宏定义
  3. #define uint unsigned int//宏定义
  4. sbit dula=P2^6;//控制数码管
  5. sbit wela=P2^7;
  6. sbit rs=P3^5;//控制液晶数据名命令选择
  7. sbit lcden=P3^4;//液晶写数据控制
  8. sbit s1=P3^0;//控制矩阵键盘的S9
  9. sbit s2=P3^1;//控制矩阵键盘的S13
  10. sbit s3=P3^2;//控制矩阵键盘的S17
  11. sbit rd=P3^7;//申明RD的位
  12. uchar count,date,shi,fen,miao,s1num;
  13. uchar code table[]=" 2017-10-17 MON";//初始化显示日期
  14. uchar code table1[]="    19:28:20";//初始化显示时间
  15. void delay(uint z)
  16. {
  17.     uint x,y;
  18.      for(x=z;x>0;x--)
  19.           for(y=110;y>0;y--);
  20. }
  21. void write_com(uchar com)//写指令函数
  22. {
  23.      rs=0;//数据置低
  24.      lcden=0;//lcden拉低
  25.      P0=com;
  26.      delay(5);
  27.      lcden=1;//拉高
  28.      delay(5);//稳定五毫秒
  29.      lcden=0;//拉低
  30.          
  31. }
  32. void write_date(uchar date)//写指数据函数
  33. {
  34.      rs=1;//数据置高
  35.      lcden=0;//lcden拉低
  36.      P0=date;
  37.      delay(5);
  38.      lcden=1;//拉高
  39.      delay(5);//稳定五毫秒
  40.      lcden=0;//拉低
  41.          
  42. }


  43. void init()
  44. {
  45.      uchar num;
  46.      dula=0;//关闭数码管
  47.      wela=0;
  48.      lcden=0;//通过1602的资料显示lcden初始为低


  49. /*  一定注意这里的赋值与程序开头的自定义赋值,当二者赋值一致的时候才会正常走动,不也一样时就会出现错误,原因未知*/
  50.      fen=28;
  51.      miao=20;
  52.      shi=19;
  53. /***************************************************/
  54.      write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
  55.      delay(5);
  56.      write_com(0x0c);//00001100开显示,不显示光标
  57.      write_com(0x06);//00000110,读入一个字符后指针和光标都加一,整屏不移动
  58.      write_com(0x01);//清零,不清零会显示出错
  59.      write_com(0x80);//指针赋值,写入地址,表示从第一行开始写
  60.     for(num=0;num<15;num++)//第一行共需要15个显示位,显示位数一定要一一对应
  61.         {
  62.             write_date(table[num]);//写数据进去
  63.             delay(5);
  64.         }
  65.     write_com(0x80+0x40);//写入第二行的地址
  66.     for(num=0;num<12;num++)//第二行共需要11个显示位,显示位数一定要一一对应,
  67.         {
  68.             write_date(table1[num]);//写数据进去
  69.             delay(5);
  70.         }
  71.      TMOD=0x01;//采用定时器0的方式1
  72.      TH0=(65536-50000)/256;//装初值
  73.      TL0=(65536-50000)%256;
  74.      EA=1;//开总中断
  75.      ET0=1;//打开T0中断
  76.      TR0=1;//启动定时器0
  77.    
  78.   
  79. }


  80. void write_sfm(uchar add,uchar date)//写动态数据到时分秒表中
  81. {
  82.    uchar shi,ge;//时、分、秒、都由两个数字表示,分离开
  83.    shi=date/10;//分离出数据的十位
  84.    ge=date%10;//分离个位
  85.    write_com(0x80+0x40+add); //写动态到第二行中
  86.    write_date(0x30+shi);//通过1602的字符手册,让十位显示0(0x30),送数据到第二行
  87.    write_date(0x30+ge);//通过1602的字符手册,让个位显示0(0x30),送数据到第二行
  88.      


  89. }
  90. void keyscan()//编写按键控制时钟函数
  91. {//5
  92.    rd=0;//让RD接地,要控制那一列就让那一列接地,通过矩阵键盘原理图判断   
  93.    if(s1==0)//检测s1是否按下
  94.     {//4
  95.         s1num++;//每按下一次s1就加一
  96.         delay(5);//延时消抖
  97.         if(s1==0)//判断s1确实被按下
  98.           {
  99.             
  100.              while(!s1);//检测是否松手
  101.              if(s1num==1)//按下第一次让秒闪烁
  102.                    {
  103.                   TR0=0;//关闭定时器,禁止时钟继续走动
  104.                   write_com(0x80+0x40+11);//控制第二行的第几位
  105.                   write_com(0x0f);//显示光标,并让光标闪烁,0x0f来源于1602的原理图
  106.                    }
  107.              if(s1num==2)//按下第二次让分闪烁
  108.                   {
  109.                   TR0=0;//关闭定时器,禁止时钟继续走动
  110.                   write_com(0x80+0x40+8);//控制第二行的第几位
  111.                   write_com(0x0f);//显示光标,并让光标闪烁,0x0f来源于1602的原理图
  112.                   }
  113.              if(s1num==3)//按下第三次让时闪烁
  114.                   {
  115.                    TR0=0;//关闭定时器,禁止时钟继续走动
  116.                    write_com(0x80+0x40+5);//控制第二行的第几位
  117.                    write_com(0x0f);//显示光标,并让光标闪烁,0x0f来源于1602的原理图
  118.                   }
  119.              if(s1num==4)//第四次按下,清零,让光标不闪烁
  120.                  {
  121.                   s1num=0;//清零
  122.                   write_com(0x0c);//光标停止闪烁
  123.                   TR0=1;//开启定时器,时钟重新开始走动
  124.                  }


  125.           }


  126.   
  127.     }//4
  128.    
  129.        if(s1num!=0)//确认s1键被按下
  130.           {//3
  131.             if(s2==0)//检测s2被按下
  132.               {//2
  133.                   delay(5);
  134.                   if(s2==0)//确定s2被按下
  135.                     {//1
  136.                          while(!s2);
  137.                          if(s1num==1)//确定让秒加一
  138.                            {
  139.                              miao++;
  140.                                 if(miao==60)
  141.                                      miao=0;
  142.                              write_sfm(10,miao);
  143.                              write_com(0x80+0x40+10);
  144.                              
  145.                            }   
  146.                          if(s1num==2)//确定让分加一
  147.                            {
  148.                              fen++;
  149.                              if(fen==60)
  150.                                      fen=0;
  151.                              write_sfm(7,fen);
  152.                              write_com(0x80+0x40+7);
  153.                            
  154.                            }  
  155.                          if(s1num==3)//确定让时加一
  156.                            {
  157.                              shi++;
  158.                               if(shi==24)
  159.                                   shi=0;
  160.                               write_sfm(4,shi);
  161.                              write_com(0x80+0x40+4);
  162.                              
  163.                            }  
  164.                     }//1
  165.       
  166.               }//2
  167.            if(s3==0)//检测s3被按下
  168.               {//2
  169.                   delay(5);
  170.                   if(s3==0)//确定s2被按下
  171.                     {//1
  172.                          while(!s3);
  173.                          if(s1num==1)//确定让秒加一
  174.                            {
  175.                              miao--;
  176.                                 if(miao==0)
  177.                                      miao=60;
  178.                              write_sfm(10,miao);
  179.                              write_com(0x80+0x40+10);
  180.                              
  181.                            }   
  182.                          if(s1num==2)//确定让分加一
  183.                            {
  184.                              fen++;
  185.                              if(fen==0)
  186.                                      fen=60;
  187.                              write_sfm(7,fen);
  188.                              write_com(0x80+0x40+7);
  189.                            
  190.                            }  
  191.                          if(s1num==3)//确定让时加一
  192.                            {
  193.                              shi++;
  194.                               if(shi==0)
  195.                                   shi=24;
  196.                               write_sfm(4,shi);
  197.                              write_com(0x80+0x40+4);
  198.                              
  199.                            }  
  200.                     }//1
  201.       
  202.               }//2  
  203.           } //3     
  204.             
  205. }//5


  206. void main()
  207. {
  208.      init();
  209.       
  210.      while(1)
  211.     {
  212.          keyscan();
  213.          if(count==20)//判断是否到了1秒
  214.          {
  215.             count=0;
  216.             miao++;
  217.               if(miao==60)//判断是否到了一分钟
  218.                    {
  219.                    miao=0;
  220.                    fen++;
  221.                    if(fen==60)
  222.                       {
  223.                          fen=0;
  224.                          shi++;
  225.                          if(shi==24)
  226.                             {
  227.                                shi=0;
  228.                               
  229.                             }
  230.                          write_sfm(4,shi);
  231.                        }
  232.                     write_sfm(7,fen);
  233.                    }
  234.              write_sfm(10,miao);//10表示table1[]中的秒位正好在第十个字符位后面
  235.          }
  236.     }
  237.      


  238. }




  239. void timer0() interrupt 1//选择中断源
  240. {
  241.       TH0=(65536-50000)/256;//装初值
  242.       TL0=(65536-50000)%256;
  243.      count++;


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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