找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602电子表单片机程序详细注释

[复制链接]
跳转到指定楼层
楼主
ID:198662 发表于 2017-7-5 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>//包含52单片机头文件
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #include"24c02.h"
  5. sbit dula=P2^6; //定义锁存器锁存端
  6. sbit wela=P2^7;
  7. sbit rs=P3^5;  //定义1602液晶RS端
  8. sbit lcden=P3^4;//定义1602液晶LCDEN端
  9. sbit s1=P3^0;   //定义按键--功能键
  10. sbit s2=P3^1; //定义按键--增加键
  11. sbit s3=P3^2; //定义按键--减小键
  12. sbit rd=P3^7;
  13. sbit beep=P2^3; //定义蜂鸣器端
  14. uchar count,s1num;
  15. char miao,shi,fen;
  16. uchar code table[]="  2008-9-30 MON";//定义初始上电时液晶默认显示状态
  17. void delay(uint z)  //延时函数
  18. {
  19. uint x,y;
  20. for(x=z;x>0;x--)
  21.   for(y=110;y>0;y--);
  22. }
  23. void di()//蜂鸣器发声函数
  24. {
  25. beep=0;
  26. delay(100);
  27. beep=1;
  28. }
  29. void write_com(uchar com)//液晶写命令函数
  30. {
  31. rs=0;
  32. lcden=0;
  33. P0=com;
  34. delay(5);
  35. lcden=1;
  36. delay(5);
  37. lcden=0;
  38. }
  39. void write_date(uchar date)//液晶写数据函数
  40. {
  41. rs=1;
  42. lcden=0;
  43. P0=date;
  44. delay(5);
  45. lcden=1;
  46. delay(5);
  47. lcden=0;
  48. }
  49. void write_sfm(uchar add,uchar date)//写时分秒函数
  50. {
  51. uchar shi,ge;
  52. shi=date/10;//分解一个2位数的十位和个位
  53. ge=date%10;
  54. write_com(0x80+0x40+add);//设置显示位置
  55. write_date(0x30+shi);//送去液晶显示十位
  56. write_date(0x30+ge); //送去液晶显示个位
  57. }
  58. void init()//初始化函数
  59. {
  60. uchar num;
  61. rd=0;  //软件将矩阵按键第4列一端置低用以分解出独立按键
  62. dula=0;//关闭两锁存器锁存端,防止操作液晶时数码管会出乱码
  63. wela=0;
  64. lcden=0;
  65. fen=0; //初始化种变量值
  66. miao=0;
  67. shi=0;
  68. count=0;
  69. s1num=0;
  70. init_24c02();
  71. write_com(0x38);//初始化1602液晶
  72. write_com(0x0c);
  73. write_com(0x06);
  74. write_com(0x01);
  75. write_com(0x80);//设置显示初始坐标
  76. for(num=0;num<15;num++)//显示年月日星期
  77.   {
  78.    write_date(table[num]);
  79.    delay(5);
  80.   }
  81.   write_com(0x80+0x40+6);//写出时间显示部分的两个冒号
  82.   write_date(':');
  83.   delay(5);
  84.   write_com(0x80+0x40+9);
  85.   write_date(':');
  86.   delay(5);
  87. miao=read_add(1);//首次上电从AT24C02中读取出存储的数据
  88. fen=read_add(2);
  89. shi=read_add(3);
  90. write_sfm(10,miao);//分别送去液晶显示
  91. write_sfm(7,fen);
  92. write_sfm(4,shi);
  93. TMOD=0x01;//设置定时器0工作模式1
  94. TH0=(65536-50000)/256;//定时器装初值
  95. TL0=(65536-50000)%256;
  96. EA=1; //开总中断
  97. ET0=1; //开定时器0中断
  98. TR0=1; //启动定时器0
  99. }
  100. void keyscan()//按键扫描函数
  101. {
  102. if(s1==0)
  103. {
  104.   delay(5);
  105.   if(s1==0)//确认功能键被按下
  106.   { s1num++;//功能键按下次数记录
  107.    while(!s1);//释放确认
  108.    di();//每当有按键释放蜂鸣器发出滴声
  109.    if(s1num==1)//第一次被按下时
  110.    {
  111.     TR0=0;  //关闭定时器
  112.     write_com(0x80+0x40+10);//光标定位到秒位置
  113.     write_com(0x0f); //光标开始闪烁
  114.    }
  115.    if(s1num==2)//第二次按下光标闪烁定位到分钟位置
  116.    {
  117.     write_com(0x80+0x40+7);
  118.    }
  119.    if(s1num==3)//第三次按下光标闪烁定位到小时位置
  120.    {
  121.     write_com(0x80+0x40+4);
  122.    }
  123.    if(s1num==4)//第四次按下
  124.    {
  125.     s1num=0;//记录按键数清零
  126.     write_com(0x0c);//取消光标闪烁
  127.     TR0=1; //启动定时器使时钟开始走
  128.    }  
  129.   }
  130. }
  131. if(s1num!=0)//只有功能键被按下后,增加和减小键才有效
  132. {
  133.   if(s2==0)
  134.   {
  135.    delay(5);
  136.    if(s2==0)//增加键确认被按下
  137.    {
  138.     while(!s2);//按键释放
  139.     di();//每当有按键释放蜂鸣器发出滴声
  140.     if(s1num==1)//若功能键第一次按下
  141.     {
  142.      miao++; //则调整秒加1
  143.      if(miao==60)//若满60后将清零
  144.       miao=0;
  145.      write_sfm(10,miao);//每调节一次送液晶显示一下
  146.      write_com(0x80+0x40+10);//显示位置重新回到调节处
  147.      write_add(1,miao); //数据改变立即存入24C02
  148.     }
  149.     if(s1num==2)//若功能键第二次按下
  150.     {
  151.      fen++;//则调整分钟加1
  152.      if(fen==60)//若满60后将清零
  153.       fen=0;
  154.      write_sfm(7,fen);//每调节一次送液晶显示一下
  155.      write_com(0x80+0x40+7);//显示位置重新回到调节处
  156.      write_add(2,fen);//数据改变立即存入24C02
  157.     }
  158.     if(s1num==3)//若功能键第三次按下
  159.     {
  160.      shi++;//则调整小时加1
  161.      if(shi==24)//若满24后将清零
  162.       shi=0;
  163.      write_sfm(4,shi);;//每调节一次送液晶显示一下
  164.      write_com(0x80+0x40+4);//显示位置重新回到调节处
  165.      write_add(3,shi);//数据改变立即存入24C02
  166.     }
  167.    }
  168.   }
  169.   if(s3==0)
  170.   {
  171.    delay(5);
  172.    if(s3==0)//确认减小键被按下
  173.    {
  174.     while(!s3);//按键释放
  175.     di();//每当有按键释放蜂鸣器发出滴声
  176.     if(s1num==1)//若功能键第一次按下
  177.     {
  178.      miao--;//则调整秒减1
  179.      if(miao==-1)//若减到负数则将其重新设置为59
  180.       miao=59;
  181.      write_sfm(10,miao);//每调节一次送液晶显示一下
  182.      write_com(0x80+0x40+10);//显示位置重新回到调节处
  183.      write_add(1,miao);//数据改变立即存入24C02
  184.     }
  185.     if(s1num==2)//若功能键第二次按下
  186.     {
  187.      fen--;//则调整分钟减1
  188.      if(fen==-1)//若减到负数则将其重新设置为59
  189.       fen=59;
  190.      write_sfm(7,fen);//每调节一次送液晶显示一下
  191.      write_com(0x80+0x40+7);//显示位置重新回到调节处
  192.      write_add(2,fen);//数据改变立即存入24C02
  193.     }
  194.     if(s1num==3)//若功能键第二次按下
  195.     {
  196.      shi--;//则调整小时减1
  197.      if(shi==-1)//若减到负数则将其重新设置为23
  198.       shi=23;
  199.      write_sfm(4,shi);//每调节一次送液晶显示一下
  200.      write_com(0x80+0x40+4);//显示位置重新回到调节处
  201.      write_add(3,shi);//数据改变立即存入24C02
  202.     }
  203.    }
  204.   }
  205. }
  206. }
  207. void main()//主函数
  208. {
  209. init();//首先初始化各数据
  210. while(1)//进入主程序大循环
  211. {
  212.   keyscan();//不停的检测按键是否被按下
  213. }
  214. }
  215. void timer0() interrupt 1//定时器0中断服务程序
  216. {
  217. TH0=(65536-50000)/256;//再次装定时器初值
  218. TL0=(65536-50000)%256;
  219. count++;  //中断次数累加
  220. if(count==20) //20次50毫秒为1秒
  221. {
  222.   count=0;
  223.   miao++;
  224.   if(miao==60)//秒加到60则进位分钟
  225.   {
  226.    miao=0;//同时秒数清零
  227.    fen++;
  228.    if(fen==60)//分钟加到60则进位小时
  229.    {
  230.     fen=0;//同时分钟数清零
  231.     shi++;
  232.     if(shi==24)//小时加到24则小时清零
  233.     {
  234.      shi=0;
  235.     }
  236.     write_sfm(4,shi);//小时若变化则重新写入
  237.     write_add(3,shi);//数据改变立即存入24C02
  238.    }
  239.    write_sfm(7,fen);//分钟若变化则重新写入
  240.    write_add(2,fen);//数据改变立即存入24C02
  241.   }
  242.   write_sfm(10,miao);//秒若变化则重新写入
  243.   write_add(1,miao);//数据改变立即存入24C02
  244. }
  245. }

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

使用道具 举报

沙发
ID:369060 发表于 2018-7-13 20:27 | 只看该作者
写时分秒子函数中,送到lcd中的数据为什么是0x30加上分离出来的数呢
回复

使用道具 举报

板凳
ID:369060 发表于 2018-7-13 20:56 | 只看该作者
read_add(,)并未定义,是个是个什么函数
回复

使用道具 举报

地板
ID:369060 发表于 2018-7-14 10:02 | 只看该作者
24c02是个什么头文件啊
回复

使用道具 举报

5#
ID:372579 发表于 2020-3-19 11:22 | 只看该作者
这个对我这种初学者很有帮助,谢谢
回复

使用道具 举报

6#
ID:711836 发表于 2020-3-19 20:18 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:711836 发表于 2020-3-19 20:18 | 只看该作者
这个是源程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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