找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机LCD1602之简易万年历源程序

[复制链接]
跳转到指定楼层
楼主
ID:720331 发表于 2020-4-1 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是小单采集到关于如何在LCD1602上显示日历表的一个51小程序,在这里和大家分享下,希望能帮助到有需要的师兄。LCD1602可以简单的显示一些字母数字,但是对于汉字来说,显示起来还是不太好,不怎么好显示,毕竟像素比较低,所以这次我们的程序里面用的是英文字母来代替汉字。

单片机源程序如下:
  1. /*******lcd.h*******/
  2. #ifndef _LCD_H_
  3. #define _LCD_H_
  4. #include <reg51.h>
  5. #include <intrins.h>

  6. sbit RS = P2^6;
  7. sbit RW = P2^5;
  8. sbit EN = P2^7;

  9. #define RS_CLR  RS = 0
  10. #define RS_SET  RS = 1
  11. #define RW_CLR  RW = 0
  12. #define RW_SET  RW = 1
  13. #define EN_CLR  EN = 0
  14. #define EN_SET  EN = 1
  15. #define dataport  P0
  16. #define uchar unsigned char

  17. extern void DelayUs2x(uchar t);
  18. extern void DelayMs(uchar t);
  19. extern void LCD_Write_COM(uchar com);           //写指令
  20. extern void LCD_Write_Data(uchar Data);
  21. extern void LCD_Clear();
  22. extern void LCD_Write_String(uchar x, uchar y, uchar* s);
  23. extern void LCD_Write_Char(uchar x, uchar y, uchar c);
  24. extern void LCD_Init();

  25. #endif

  26. /*****lcd.c********/
  27. #include "lcd.h"

  28. void DelayUs2x(uchar t)
  29. {
  30.     while(--t);
  31. }


  32. void DelayMs(uchar t)
  33. {
  34.     while(t--)
  35.     {
  36.         DelayUs2x(245);
  37.         DelayUs2x(245);
  38.     }
  39. }


  40. /* bit LCD_Check_busy(void)
  41. {
  42.    dataport = 0xff;
  43.    RS_CLR;
  44.    RW_SET;
  45.    EN_CLR;
  46.    _nop_();
  47.    EN_SET;
  48.    return (bit)(dataport&0x80);
  49. } */


  50. //写指令
  51. void LCD_Write_COM(uchar com)
  52. {
  53.     DelayMs(5);
  54.     RS_CLR;
  55.     RW_CLR;
  56.     EN_SET;
  57.     dataport = com;
  58.     _nop_();
  59.     EN_CLR;
  60. }



  61. //写数据
  62. void LCD_Write_Data(uchar Data)
  63. {
  64.     DelayMs(5);
  65.     RS_SET;
  66.     RW_CLR;
  67.     EN_SET;
  68.     dataport = Data;
  69.     _nop_();
  70.     EN_CLR;
  71. }



  72. //清屏
  73. void LCD_Clear()
  74. {
  75.     LCD_Write_COM(0x01);
  76.     DelayMs(5);
  77. }



  78. //输入字符,x为横坐标,y为纵坐标
  79. void LCD_Write_String(uchar x, uchar y, uchar* s)
  80. {
  81.     if(y == 0)
  82.     {
  83.         LCD_Write_COM(0x80+x);
  84.     }
  85.     else
  86.     {
  87.         LCD_Write_COM(0xC0+x);
  88.     }
  89.     while(*s)
  90.     {
  91.         LCD_Write_Data(*s);
  92.         s++;
  93.     }
  94. }



  95. //输入字符,x为横坐标,y为纵坐标
  96. void LCD_Write_Char(uchar x, uchar y, uchar c)
  97. {
  98.     if(y == 0)
  99.     {
  100.         LCD_Write_COM(0x80+x);
  101.     }
  102.     else
  103.     {
  104.         LCD_Write_COM(0xC0+x);
  105.     }
  106.     LCD_Write_Data(c);
  107. }



  108. void LCD_Init()                   //LCD初始化子程序
  109. {
  110.     EN_CLR;
  111.     LCD_Write_COM(0x38);         //设置显示模式
  112.     DelayMs(5);
  113.     LCD_Write_COM(0x38);         //设置显示模式
  114.     DelayMs(5);
  115.     LCD_Write_COM(0x38);         //设置显示模式
  116.     DelayMs(5);
  117.     LCD_Write_COM(0x38);         //设置显示模式
  118.     DelayMs(5);
  119.     LCD_Write_COM(0x0c);         //开显示不显示光标,光标闪烁
  120.     LCD_Write_COM(0x06);         //写一个指针加一
  121.     LCD_Write_COM(0x01);         //清屏
  122.     LCD_Write_COM(0x80);         //设置数据指针起点
  123. }


  124. /*****main.c*******/
  125. #include "lcd.h"
  126.         
  127. uchar hour = 21, min = 43, sec = 0, count, date = 28, monse = 4;
  128. unsigned int year = 2017;

  129. void init_T0()
  130. {
  131.     EA = 1;
  132.     ET0 = 1;
  133.     TMOD = 0X01;
  134.     TH0 = 0X3C;
  135.     TL0 = 0XB0;
  136.     TR0 = 1;
  137. }

  138. void main()
  139. {
  140.     init_T0();
  141.     LCD_Init();
  142.     LCD_Clear();
  143.     while(1)
  144.     {
  145.         LCD_Write_String(0, 0, "Date:");
  146.         LCD_Write_Char(5, 0, year/1000+48);
  147.         LCD_Write_Char(6, 0, year%1000/100+48);
  148.         LCD_Write_Char(7, 0, year%100/10+48);
  149.         LCD_Write_Char(8, 0, year%10+48);
  150.         LCD_Write_Char(9, 0, '-');
  151.         LCD_Write_Char(10, 0, monse/10+48);
  152.         LCD_Write_Char(11, 0, monse%10+48);
  153.         LCD_Write_Char(12, 0, '-');
  154.         LCD_Write_Char(13, 0, date/10+48);
  155.         LCD_Write_Char(14, 0, date%10+48);

  156.         LCD_Write_String(0, 1, "Time:");
  157.         LCD_Write_Char(5, 1, hour/10+48);
  158.         LCD_Write_Char(6, 1, hour%10+48);
  159.         LCD_Write_Char(7, 1, '-');
  160.         LCD_Write_Char(8, 1, min/10+48);
  161.         LCD_Write_Char(9, 1, min%10+48);
  162.         LCD_Write_Char(0xa, 1, '-');
  163.         LCD_Write_Char(0xb, 1, sec/10+48);
  164.         LCD_Write_Char(0xc, 1, sec%10+48);
  165.     }
  166. }

  167. void inter()   interrupt 1
  168. {
  169.     TH0 = 0X3C;
  170.     TL0 = 0XB0;
  171.     count++;
  172.     if(count >= 20)
  173.      {
  174.         count = 0;
  175.         sec++;
  176.      }
  177.      if(sec >= 60)
  178.      {
  179.         sec = 0;
  180.         min++;
  181.      }
  182.      if(min >= 60)
  183.      {
  184.         min = 0;
  185.         hour++;
  186.      }
  187.      if(hour >= 24)
  188.      {
  189.         hour = 0;
  190.         date++;
  191.      }
  192.      if(date > 31)
  193.      {
  194.         date = 0;
  195.         monse++;
  196.      }
  197.      if(monse > 13)
  198.      {
  199.         monse = 0;
  200.         year++;
  201.      }

  202. }
复制代码

所有资料51hei提供下载:
新建 ZIP 压缩文件.zip (1.38 KB, 下载次数: 14)


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

使用道具 举报

沙发
ID:1 发表于 2020-4-2 20:34 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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