• 6回复贴,共1

【51单片机】LCD1602+按键可调时钟

只看楼主收藏回复

一个可调时钟程序,用LCD1602显示的


1楼2014-02-06 17:24回复

    LCD接口

    独立按键接口



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


      3楼2014-02-06 17:28
      回复
        ******************************
        *函 数:主函数main()
        *功 能:
        *参 数: 无
        *返回值: 无
        *******************************/
        void main()
        {
        Init();
        LCDINIT();
        Stimer();
        while (1)
        {
        Keyscan();
        }
        }
        /******************************
        *函 数:初始化Init()
        *功 能:初始化
        *参 数: 无
        *返回值: 无
        *******************************/
        void Init()
        {
        P0 = 0x00;
        dula = 1;
        dula = 0;
        P0 = 0x00;
        wela = 1;
        wela = 0;
        }
        /******************************
        *函 数:延时Delay_ms()
        *功 能:实现软件延时
        *参 数: uint16 z
        *返回值: 无
        *******************************/
        void Delay_ms(uint16 z)
        {
        uint16 x,y;
        for (x = z; x > 0; x--)
        for (y = 125; y > 0; y--);
        }


        4楼2014-02-06 17:29
        回复
          /******************************
          *函 数:Stimer()
          *功 能:开定时器
          *参 数: 无
          *返回值: 无
          *******************************/
          void Stimer()
          {
          TMOD = 0X01;
          TH0 = (65536 - 46080)/256; /*晶振11.0592MHz*/
          TL0 = (65536 - 46080)%256;
          EA = 1;
          ET0 = 1;
          TR0 = 1;
          }
          /******************************
          *函 数:Timer0()
          *功 能:定时器0中断函数
          *参 数: 无
          *返回值: 无
          *******************************/
          void Timer0() interrupt 1
          {
          TH0 = (65536 - 46080)/256; /*晶振11.0592MHz*/
          TL0 = (65536 - 46080)%256;
          count++;
          if (20 == count)
          {
          count = 0;
          miao++;
          if (60 == miao)
          {
          miao = 0;
          fen++;
          if (60 == fen)
          {
          fen = 0;
          shi++;
          if (24 == shi)
          {
          shi = 0;
          }
          Wtimer(4,shi); /*显示小时*/
          }
          Wtimer(7,fen); /*显示分*/
          }
          Wtimer(10,miao); /*显示秒*/
          }
          }
          /******************************
          *函 数:Wtimer(uint8 ad,uint8 dat)
          *功 能:
          *参 数: 无
          *返回值: 无
          *******************************/
          void Wtimer(uint8 ad,uint8 dat)
          {
          uint8 sw,gw;
          sw = dat/10;
          gw = dat%10;
          LCDWCOM(0x80+0x40+ad);
          LCDWDAT(0x30+sw);
          LCDWDAT(0x30+gw);
          }


          5楼2014-02-06 17:33
          回复
            /******************************
            *函 数:Keyscan()
            *功 能:调时独立按键
            *参 数: 无
            *返回值: 无
            *******************************/
            void Keyscan()
            {
            K1 = 1;
            K2 = 1;
            K3 = 1;
            if (0 == K1)
            {
            Delay_ms(5);
            if (0 == K1)
            {
            K1num++;
            while (!K1);
            if (1 == K1num)
            {
            TR0 = 0;
            LCDWCOM(0XC0+11);
            LCDWCOM(0X0F);
            }
            if (2 == K1num)
            {
            LCDWCOM(0XC0+8);
            }
            if (3 == K1num)
            {
            LCDWCOM(0XC0+5);
            }
            if (4 == K1num)
            {
            TR0 = 1;
            K1num = 0;
            LCDWCOM(0x0c);
            }
            }
            }
            if (0 != K1num)
            {
            if (0 == K2)
            {
            Delay_ms(5);
            while (!K2);
            if(1 == K1num)
            {
            miao++;
            if(60 == miao)
            miao = 0;
            LCDWCOM(0xc0+10);
            Wtimer(10,miao);
            LCDWCOM(0xc0+11);
            }
            if(2 == K1num)
            {
            fen++;
            if(60 == fen)
            fen = 0;
            LCDWCOM(0xc0+7);
            Wtimer(7,fen);
            LCDWCOM(0xc0+8);
            }
            if(3 == K1num)
            {
            shi++;
            if(24 == shi)
            shi = 0;
            LCDWCOM(0xc0+4);
            Wtimer(4,shi);
            LCDWCOM(0xc0+5);
            }
            }
            }
            if (0 != K1num)
            {
            if (0 == K3)
            {
            Delay_ms(5);
            while (!K3);


            6楼2014-02-06 17:35
            回复
              if(1 == K1num)
              {
              miao--;
              if(255 == miao)
              miao = 59;
              LCDWCOM(0xc0+10);
              Wtimer(10,miao);
              LCDWCOM(0xc0+11);
              }
              if(2 == K1num)
              {
              fen--;
              if(255 == fen)
              fen = 59;
              LCDWCOM(0xc0+7);
              Wtimer(7,fen);
              LCDWCOM(0xc0+8);
              }
              if(3 == K1num)
              {
              shi--;
              if(255 == shi)
              shi = 23;
              LCDWCOM(0xc0+4);
              Wtimer(4,shi);
              LCDWCOM(0xc0+5);
              }
              }
              }
              }
              /******************************
              *函 数:LCDINIT()
              *功 能:LCD初始化
              *参 数: 无
              *返回值: 无
              *******************************/
              void LCDINIT()
              {
              LCDWCOM(0x38); /*开显示*/
              LCDWCOM(0x0c); /*光标显示闪烁0x0f,不闪烁0x0e,无光标0x0c*/
              LCDWCOM(0x06); /*指针光标加1*/
              LCDWCOM(0x01); /*数据清屏*/
              LCDWCOM(0X80); /*初始指针位置*/
              for (j = 0;j < 15;j++)
              {
              LCDWDAT(table_1[j]);
              }
              LCDWCOM(0Xc0); /*初始指针位置*/
              for (j = 0;j < 12;j++)
              {
              LCDWDAT(table_2[j]);
              }
              }
              /******************************
              *函 数:LCDWCOM()
              *功 能:写指令到LCD
              *参 数: com
              *返回值: 无
              *******************************/
              void LCDWCOM(uint8 com)
              {
              LCD_RS = 0;
              LCD_RW = 0;
              LCD_EN = 0;
              LCD_DATA = com;
              Delay_ms(5);
              LCD_EN = 1;
              Delay_ms(5);
              LCD_EN = 0;
              }
              /******************************
              *函 数:LCDWDAT()
              *功 能:写数据到LCD
              *参 数: dat
              *返回值: 无
              *******************************/
              void LCDWDAT(uint8 dat)
              {
              LCD_RS = 1;
              LCD_RW =0;
              LCD_EN = 0;
              LCD_DATA = dat;
              Delay_ms(5);
              LCD_EN = 1;
              Delay_ms(5);
              LCD_EN = 0;
              }


              7楼2014-02-06 17:36
              回复