找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机时间显示 LCD1602.c LCD1602.h文件分享

[复制链接]
跳转到指定楼层
楼主
用定时器和lcd1602做的一个简单计时器。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <REGX51.H>
  2. #include "LCD1602.h"
  3. unsigned char miao,fen,shi;
  4. //定时器
  5. void InitTimer0(void)
  6. {
  7.     TMOD = 0x01;
  8.     TH0 = 0xff;
  9.     TL0 = 0xA4;
  10.     EA = 1;
  11.     ET0 = 1;
  12.     TR0 = 1;
  13. }
  14. //主函数
  15. void main()
  16. {
  17.         InitTimer0();//定时器初始化
  18.         LCD_Init();//1602初始化
  19.         LCD_ShowString(1,1,"TIME:");
  20.         LCD_ShowChar(2,3,':');
  21.         LCD_ShowChar(2,6,':');
  22.         while(1)
  23.         {
  24.                 LCD_ShowNum(2,1,shi,2);
  25.                 LCD_ShowNum(2,4,fen,2);
  26.                 LCD_ShowNum(2,7,miao,2);
  27.         }
  28. }

  29. void Timer0Interrupt(void) interrupt 1
  30. {
  31.   unsigned int jia; //长整型
  32.     TH0 = 0xff;
  33.     TL0 = 0xA4;
  34.         jia++;
  35.         if(jia>=10000)
  36.         {
  37.                 jia=0;
  38.                 miao++;
  39.                 if(miao>=60)
  40.                 {
  41.                         miao=0;
  42.                         fen++;
  43.                         if(fen>=60)
  44.                         {
  45.                                 fen=0;
  46.                                 shi++;
  47.                                 if(shi>=24)
  48.                                 {
  49.                                         shi=0;
  50.                                 }
  51.                         }
  52.                 }
  53.         }
  54. }
复制代码
  1. #include <REGX52.H>

  2. //引脚配置:
  3. sbit LCD_RS=P2^6;
  4. sbit LCD_RW=P2^5;
  5. sbit LCD_EN=P2^7;
  6. #define LCD_DataPort P0

  7. //函数定义:
  8. /**
  9.   * @brief  LCD1602延时函数,12MHz调用可延时1ms
  10.   * @param  无
  11.   * @retval 无
  12.   */
  13. void LCD_Delay()
  14. {
  15.         unsigned char i, j;

  16.         i = 2;
  17.         j = 239;
  18.         do
  19.         {
  20.                 while (--j);
  21.         } while (--i);
  22. }

  23. /**
  24.   * @brief  LCD1602写命令
  25.   * @param  Command 要写入的命令
  26.   * @retval 无
  27.   */
  28. void LCD_WriteCommand(unsigned char Command)
  29. {
  30.         LCD_RS=0;
  31.         LCD_RW=0;
  32.         LCD_DataPort=Command;
  33.         LCD_EN=1;
  34.         LCD_Delay();
  35.         LCD_EN=0;
  36.         LCD_Delay();
  37. }

  38. /**
  39.   * @brief  LCD1602写数据
  40.   * @param  Data 要写入的数据
  41.   * @retval 无
  42.   */
  43. void LCD_WriteData(unsigned char Data)
  44. {
  45.         LCD_RS=1;
  46.         LCD_RW=0;
  47.         LCD_DataPort=Data;
  48.         LCD_EN=1;
  49.         LCD_Delay();
  50.         LCD_EN=0;
  51.         LCD_Delay();
  52. }

  53. /**
  54.   * @brief  LCD1602设置光标位置
  55.   * @param  Line 行位置,范围:1~2
  56.   * @param  Column 列位置,范围:1~16
  57.   * @retval 无
  58.   */
  59. void LCD_SetCursor(unsigned char Line,unsigned char Column)
  60. {
  61.         if(Line==1)
  62.         {
  63.                 LCD_WriteCommand(0x80|(Column-1));
  64.         }
  65.         else if(Line==2)
  66.         {
  67.                 LCD_WriteCommand(0x80|(Column-1+0x40));
  68.         }
  69. }

  70. /**
  71.   * @brief  LCD1602初始化函数
  72.   * @param  无
  73.   * @retval 无
  74.   */
  75. void LCD_Init()
  76. {
  77.         LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
  78.         LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
  79.         LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
  80.         LCD_WriteCommand(0x01);//光标复位,清屏
  81. }

  82. /**
  83.   * @brief  在LCD1602指定位置上显示一个字符
  84.   * @param  Line 行位置,范围:1~2
  85.   * @param  Column 列位置,范围:1~16
  86.   * @param  Char 要显示的字符
  87.   * @retval 无
  88.   */
  89. void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
  90. {
  91.         LCD_SetCursor(Line,Column);
  92.         LCD_WriteData(Char);
  93. }

  94. /**
  95.   * @brief  在LCD1602指定位置开始显示所给字符串
  96.   * @param  Line 起始行位置,范围:1~2
  97.   * @param  Column 起始列位置,范围:1~16
  98.   * @param  String 要显示的字符串
  99.   * @retval 无
  100.   */
  101. void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
  102. {
  103.         unsigned char i;
  104.         LCD_SetCursor(Line,Column);
  105.         for(i=0;String[i]!='\0';i++)
  106.         {
  107.                 LCD_WriteData(String[i]);
  108.         }
  109. }

  110. /**
  111.   * @brief  返回值=X的Y次方
  112.   */
  113. int LCD_Pow(int X,int Y)
  114. {
  115.         unsigned char i;
  116.         int Result=1;
  117.         for(i=0;i<Y;i++)
  118.         {
  119.                 Result*=X;
  120.         }
  121.         return Result;
  122. }

  123. /**
  124.   * @brief  在LCD1602指定位置开始显示所给数字
  125.   * @param  Line 起始行位置,范围:1~2
  126.   * @param  Column 起始列位置,范围:1~16
  127.   * @param  Number 要显示的数字,范围:0~65535
  128.   * @param  Length 要显示数字的长度,范围:1~5
  129.   * @retval 无
  130.   */
  131. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  132. {
  133.         unsigned char i;
  134.         LCD_SetCursor(Line,Column);
  135.         for(i=Length;i>0;i--)
  136.         {
  137.                 LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
  138.         }
  139. }

  140. /**
  141.   * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
  142.   * @param  Line 起始行位置,范围:1~2
  143.   * @param  Column 起始列位置,范围:1~16
  144.   * @param  Number 要显示的数字,范围:-32768~32767
  145.   * @param  Length 要显示数字的长度,范围:1~5
  146.   * @retval 无
  147.   */
  148. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
  149. {
  150.         unsigned char i;
  151.         unsigned int Number1;
  152.         LCD_SetCursor(Line,Column);
  153.         if(Number>=0)
  154.         {
  155.                 LCD_WriteData('+');
  156.                 Number1=Number;
  157.         }
  158.         else
  159.         {
  160.                 LCD_WriteData('-');
  161.                 Number1=-Number;
  162.         }
  163.         for(i=Length;i>0;i--)
  164.         {
  165.                 LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
  166.         }
  167. }

  168. /**
  169.   * @brief  在LCD1602指定位置开始以十六进制显示所给数字
  170.   * @param  Line 起始行位置,范围:1~2
  171.   * @param  Column 起始列位置,范围:1~16
  172.   * @param  Number 要显示的数字,范围:0~0xFFFF
  173.   * @param  Length 要显示数字的长度,范围:1~4
  174.   * @retval 无
  175.   */
  176. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  177. {
  178.         unsigned char i,SingleNumber;
  179.         LCD_SetCursor(Line,Column);
  180.         for(i=Length;i>0;i--)
  181.         {
  182.                 SingleNumber=Number/LCD_Pow(16,i-1)%16;
  183.                 if(SingleNumber<10)
  184.                 {
  185.                         LCD_WriteData(SingleNumber+'0');
  186.                 }
  187.                 else
  188.                 {
  189.                         LCD_WriteData(SingleNumber-10+'A');
  190.                 }
  191.         }
  192. }

  193. /**
  194.   * @brief  在LCD1602指定位置开始以二进制显示所给数字
  195.   * @param  Line 起始行位置,范围:1~2
  196.   * @param  Column 起始列位置,范围:1~16
  197.   * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  198.   * @param  Length 要显示数字的长度,范围:1~16
  199.   * @retval 无
  200.   */
  201. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
  202. {
  203.         unsigned char i;
  204.         LCD_SetCursor(Line,Column);
  205.         for(i=Length;i>0;i--)
  206.         {
  207.                 LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
  208.         }
  209. }
复制代码


所有资料51hei附件下载:
1602计数器(带仿真).7z (93.48 KB, 下载次数: 25)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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