微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD1602+按键可调时钟

LCD1602+按键可调时钟

时间:10-02 整理:3721RD 点击:

                           刚写了一个可调时钟程序,用LCD1602显示的,分享一下
先上硬件图:

  1.                    /***************************
  2.                 *项目名称:LCD1602时钟;
  3.                 *编程时间:2013/05/17--18;
  4.                 *单   位:宁波大红鹰学院机电学院电气工程三班
  5.                 ****************************/
  6.                
  7.                 /**程序头文件及数据类型**/
  8.                 #include <reg52.h>
  9.                 #include <intrins.h>
  10.                 typedef unsigned int   uint16;
  11.                 typedef unsigned char  uint8;               
  12.                
  13.         /**LCD1602接口定义及其他**/
  14.                 #define LCD_DATA P0 /*液晶数据输入端*/
  15.                 sbit LCD_RS        = P1^0;                /*数据H/命令L选择端*/
  16.                 sbit LCD_RW        = P1^1;                /*读H/写L选择端*/
  17.                 sbit LCD_EN        = P2^5;                /*使能信号输入端*/
  18.                 sbit wela = P2^7;                /*数码管位选*/
  19.                 sbit dula = P2^6;            /*数码管段选*//*数码管接在P0口*/
  20.                 sbit K1 = P3^4;                  /*调时选择按键*/
  21.                 sbit K2 = P3^5;                  /*调时加数按键*/
  22.                 sbit K3 = P3^6;                  /*调时减数按键*/
  23.                 uint8 i,j;
  24.                 uint8 count ,shi,fen,miao; /*时间:时分秒*/
  25.                 uint8 K1num,K2num,K3num;   /*按键次数*/
  26.                 /**液晶内容显示**/
  27.                 uint8 code table_1[] =  "  2013/05/17 FR";
  28.                 uint8 code table_2[] =  "    00:00:00";
  29.          
  30.           /*********调用函数声明*********/
  31.            void Init();        /*初始化化函数*/
  32.            void Delay_ms(uint16 z);        /*延时函数*/
  33.            void Stimer();           /*开定时器*/
  34.            void Wtimer(uint8 ad,uint8 dat); /*时间显示*/
  35.            void Keyscan();          /*调时独立按键*/
  36.            /*LCD1602函数*/
  37.            void LCDINIT();    /*LCD初始化*/
  38.            void LCDWCOM(uint8 com); /*写指令*/
  39.            void LCDWDAT(uint8 dat); /*写数据*/
  40.           /*********调用函数声明*********/

  41.       /******************************
  42.            *函  数:主函数main()
  43.            *功  能:
  44.            *参  数: 无
  45.            *返回值: 无
  46.           *******************************/
  47.           void main()
  48.           {
  49.                   Init();
  50.                   LCDINIT();
  51.                   Stimer();  
  52.                   while (1)
  53.                    {
  54.                         Keyscan();
  55.                    }
  56.           }
  57.                   
  58.            /******************************
  59.            *函  数:初始化Init()
  60.            *功  能:初始化
  61.            *参  数: 无
  62.            *返回值: 无
  63.            *******************************/
  64.                 void Init()
  65.                 {
  66.                  P0 = 0x00;
  67.                  dula = 1;
  68.                  dula = 0;
  69.                  P0 = 0x00;
  70.                  wela = 1;
  71.                  wela = 0;
  72.                 }

  73.            /******************************
  74.            *函  数:延时Delay_ms()
  75.            *功  能:实现软件延时
  76.            *参  数: uint16 z
  77.            *返回值: 无
  78.            *******************************/
  79.            void Delay_ms(uint16 z)
  80.            {
  81.                  uint16 x,y;
  82.                  for (x = z; x > 0; x--)
  83.                   for (y = 125; y > 0; y--);
  84.            }

  85.            /******************************
  86.            *函  数:Stimer()
  87.            *功  能:开定时器
  88.            *参  数: 无
  89.            *返回值: 无
  90.            *******************************/
  91.            void Stimer()
  92.            {
  93.                  TMOD = 0X01;
  94.                  TH0  = (65536 - 46080)/256; /*晶振11.0592MHz*/
  95.                  TL0  = (65536 - 46080)%256;
  96.                  EA   = 1;
  97.                  ET0  = 1;
  98.                  TR0  = 1;
  99.            }

  100.            /******************************
  101.            *函  数:Timer0()
  102.            *功  能:定时器0中断函数
  103.            *参  数: 无
  104.            *返回值: 无
  105.            *******************************/
  106.            void Timer0() interrupt 1        
  107.            {
  108.                  TH0  = (65536 - 46080)/256; /*晶振11.0592MHz*/
  109.                  TL0  = (65536 - 46080)%256;
  110.                  count++;
  111.                  if (20 == count)
  112.                   {
  113.                      count = 0;
  114.                          miao++;

  115.                          if (60 == miao)
  116.                           {
  117.                            miao = 0;
  118.                            fen++;

  119.                            if (60 == fen)
  120.                             {
  121.                                   fen = 0;
  122.                                   shi++;

  123.                                   if (24 == shi)
  124.                                    {
  125.                                          shi = 0;
  126.                                    }
  127.                                    Wtimer(4,shi);        /*显示小时*/  
  128.                                 }
  129.                                 Wtimer(7,fen);        /*显示分*/
  130.                           }
  131.                    Wtimer(10,miao);        /*显示秒*/
  132.                   
  133.                   
  134.                   
  135.                   }
  136.            }

  137.            /******************************
  138.            *函  数:Wtimer(uint8 ad,uint8 dat)
  139.            *功  能:
  140.            *参  数: 无
  141.            *返回值: 无
  142.            *******************************/
  143.            void Wtimer(uint8 ad,uint8 dat)
  144.            {
  145.               uint8 sw,gw;
  146.                   sw = dat/10;
  147.                   gw = dat%10;
  148.                   LCDWCOM(0x80+0x40+ad);
  149.                   LCDWDAT(0x30+sw);
  150.                   LCDWDAT(0x30+gw);
  151.            }

  152.            /******************************
  153.            *函  数:Keyscan()
  154.            *功  能:调时独立按键
  155.            *参  数: 无
  156.            *返回值: 无
  157.           *******************************/
  158.           void Keyscan()
  159.           {
  160.              K1 = 1;
  161.                  K2 = 1;
  162.                  K3 = 1;
  163.                  if (0 == K1)
  164.                  {
  165.                      Delay_ms(5);
  166.                          if (0 == K1)
  167.                          {
  168.                            K1num++;
  169.                            while (!K1);
  170.                            if (1 == K1num)
  171.                             {
  172.                                  TR0 = 0;
  173.                              LCDWCOM(0XC0+11);
  174.                              LCDWCOM(0X0F);
  175.                                 }
  176.         
  177.                                    if (2 == K1num)
  178.                             {
  179.                              LCDWCOM(0XC0+8);
  180.                                 }
  181.         
  182.                                 if (3 == K1num)
  183.                             {
  184.                              LCDWCOM(0XC0+5);
  185.                                 }
  186.         
  187.                                 if (4 == K1num)
  188.                             {
  189.                              TR0 = 1;
  190.                                  K1num = 0;
  191.                                  LCDWCOM(0x0c);
  192.                                 }
  193.                          }
  194.                         }
  195.                     if (0 != K1num)
  196.                          {
  197.                            if (0 == K2)
  198.                            {
  199.                                 Delay_ms(5);
  200.                                 while (!K2);
  201.                                 
  202.                                  if(1 == K1num)
  203.                                  {
  204.                                   miao++;
  205.                                   if(60 == miao)
  206.                                   miao = 0;
  207.                                   LCDWCOM(0xc0+10);
  208.                                   Wtimer(10,miao);
  209.                                   LCDWCOM(0xc0+11);
  210.                                  }
  211.                                  if(2 == K1num)
  212.                                  {
  213.                                   fen++;
  214.                                   if(60 == fen)
  215.                                    fen = 0;
  216.                                   LCDWCOM(0xc0+7);
  217.                                   Wtimer(7,fen);
  218.                                   LCDWCOM(0xc0+8);
  219.                                  }
  220.                                  if(3 == K1num)
  221.                                  {
  222.                                   shi++;
  223.                                   if(24 == shi)
  224.                                   shi = 0;
  225.                                   LCDWCOM(0xc0+4);
  226.                                   Wtimer(4,shi);
  227.                                   LCDWCOM(0xc0+5);
  228.                                  }
  229.                                 
  230.                            }
  231.                          }
  232.                         if (0 != K1num)
  233.                          {
  234.                            if (0 == K3)
  235.                            {
  236.                                 Delay_ms(5);
  237.                                 while (!K3);
  238.                                 
  239.                                  if(1 == K1num)
  240.                                  {
  241.                                   miao--;
  242.                                   if(255 == miao)
  243.                                   miao = 59;
  244.                                   LCDWCOM(0xc0+10);
  245.                                   Wtimer(10,miao);
  246.                                   LCDWCOM(0xc0+11);
  247.                                  }
  248.                                  if(2 == K1num)
  249.                                  {
  250.                                   fen--;
  251.                                   if(255 == fen)
  252.                                    fen = 59;
  253.                                   LCDWCOM(0xc0+7);
  254.                                   Wtimer(7,fen);
  255.                                   LCDWCOM(0xc0+8);
  256.                                  }
  257.                                  if(3 == K1num)
  258.                                  {
  259.                                   shi--;
  260.                                   if(255 == shi)
  261.                                   shi = 23;
  262.                                   LCDWCOM(0xc0+4);
  263.                                   Wtimer(4,shi);
  264.                                   LCDWCOM(0xc0+5);
  265.                                  }
  266.                                 
  267.                            }
  268.                          }
  269.           }

  270.            /******************************
  271.            *函  数:LCDINIT()
  272.            *功  能:LCD初始化
  273.            *参  数: 无
  274.            *返回值: 无
  275.            *******************************/
  276.            void LCDINIT()
  277.            {
  278.                  LCDWCOM(0x38);         /*开显示*/
  279.                  LCDWCOM(0x0c);         /*光标显示闪烁0x0f,不闪烁0x0e,无光标0x0c*/
  280.                  LCDWCOM(0x06);         /*指针光标加1*/
  281.                  LCDWCOM(0x01);         /*数据清屏*/

  282.                  LCDWCOM(0X80);  /*初始指针位置*/
  283.                  for (j = 0;j < 15;j++)
  284.                   {
  285.                          LCDWDAT(table_1[j]);
  286.                   }
  287.                  LCDWCOM(0Xc0);  /*初始指针位置*/
  288.                  for (j = 0;j < 12;j++)
  289.                   {
  290.                          LCDWDAT(table_2[j]);
  291.                   }
  292.            }

  293.            /******************************
  294.            *函  数:LCDWCOM()
  295.            *功  能:写指令到LCD
  296.            *参  数: com
  297.            *返回值: 无
  298.           *******************************/
  299.           void LCDWCOM(uint8 com)
  300.           {
  301.                 LCD_RS = 0;
  302.                 LCD_RW = 0;
  303.                 LCD_EN = 0;
  304.                 LCD_DATA = com;
  305.                 Delay_ms(5);
  306.                 LCD_EN = 1;
  307.                 Delay_ms(5);
  308.                 LCD_EN = 0;
  309.           }

  310.           /******************************
  311.            *函  数:LCDWDAT()
  312.            *功  能:写数据到LCD
  313.            *参  数: dat
  314.            *返回值: 无
  315.           *******************************/
  316.           void LCDWDAT(uint8 dat)
  317.           {
  318.                 LCD_RS = 1;
  319.                 LCD_RW  =0;
  320.                 LCD_EN = 0;
  321.                 LCD_DATA = dat;
  322.                 Delay_ms(5);
  323.                 LCD_EN = 1;
  324.                 Delay_ms(5);
  325.                 LCD_EN = 0;
  326.           }

复制代码

LCD接口


独立按键接口


敢问小编编码用的什么环境,界面好漂亮

到电子乐屋上看看,有很多实例制作的。

好使,但是数码管没用上,还多个按键

不错欧..

谢谢分享。

不错的资料,谢谢啊

好不好看看再说  小编辛苦了

好东东,下下来学习学习

小编这个能调年月日和周几么

谢谢分享。

感谢分享                                 

不错哦
1111111111

有年月日吗                          

哇。好东东,谢谢分享。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top