⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_clock.lst

📁 基于51系列单片机的1602液晶显示可调时钟(精确到毫秒级)。
💻 LST
字号:
C51 COMPILER V8.02   LCD_CLOCK                                                             11/02/2008 21:54:01 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCD_CLOCK
OBJECT MODULE PLACED IN LCD_CLOCK.OBJ
COMPILER INVOKED BY: D:\Program Files\keil C\C51\BIN\C51.EXE LCD_CLOCK.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //=============================================
   2          //              基于1602液晶显示可调时钟                 //
   3          //作者:万迅       2008年11月02日                        //
   4          //QQ:373179882                                                          //
   5          //E-mail:wanxunpcmo@163.com                             //
   6          //使用AT89C51单片机  12MHz晶振  精确到毫秒       //
   7          //=============================================
   8          //库与数据缩写定义
   9          #include <AT89X51.h>            //包含AT89X51库
  10          #define uc unsigned char        //定义数据格式缩写
  11          #define ui unsigned int         //定义数据整形缩写
  12          #define control_number 2        //定义可供调节的数据数
  13          //=============================================
  14          //与1602液晶显示模块(LCM)的接口定义
  15          #define DB_BUS P2                       //定义数据总线
  16          sbit RS=P3^0;                           //定义:数据(1)/指令(0)使能引脚
  17          sbit RW=P3^1;                           //定义:读(1)/写(0)使能信号
  18          sbit E=P3^2;                            //定义执行操作使能信号,下降沿有效
  19          sbit busy=DB_BUS^7;                     //定义忙信号
  20          //=============================================
  21          //定义按键接口                          
  22          sbit FUN_KEY=P1^0;                              //定义功能键
  23          sbit INC_KEY=P1^1;                              //定义增加键
  24          sbit DEC_KEY=P1^2;                              //定义减少键
  25          //=============================================
  26          //定义相关数据
  27          uc hou,min,sec,mil;                             //定义:小时(hou),分钟(min),秒(sec),毫秒(mil)
  28          uc connum;                                              //定义数据可调允许位,为0时不可调
  29          bit k0,k1,k2;                                   //定义按键状态位,防止因长按按键引起多次操作
  30          //=============================================
  31          //函数预定义
  32          void writcode(uc cd);                     //写指令函数
  33          void writdata(uc dat);                    //写数据函数
  34          //=============================================
  35          
  36          //液晶显示模块(LCM)初始化
  37          void init_lcm()
  38          {       writcode(0x38);                           //设置功能:8位通信;两行显示;5x7显示单元
  39   1              writcode(0x38);                           //重写一次防止因1602通电时的假就绪而引起的功能设置失败
  40   1              writcode(0x08);                           //关闭显示屏
  41   1              writcode(0x01);                           //清屏
  42   1              writcode(0x0c);                           //开显示屏并置光标不可见,光标所在字符不闪烁
  43   1              writcode(0x06);                           //设置输入模式
  44   1      }
  45          //单片机基本初始化                                                                 
  46          void uart_init()                                //定义初始化定时函数
  47          {       hou=min=sec=mil=0;                      //时,分,秒初始化
  48   1              connum=0;                                       //置数据可调允许位为0,即数据不可调节
  49   1              k0=k1=k2=1;                                     //按键状态初始化
  50   1              TMOD=0x01;                                      //定时计数工作方式1
  51   1              IE=0x82;                                        //允许定时计数中断0
  52   1              TH0=0xd8;                                       //
  53   1              TL0=0xf0;                                       //定时10ms
  54   1              TR0=1;                                          //开启定时计数器0
  55   1      } 
C51 COMPILER V8.02   LCD_CLOCK                                                             11/02/2008 21:54:01 PAGE 2   

  56          //每10ms中断一次的定时中断
  57          //实现毫秒100进1,秒60进1,分钟60进1,小时24清零时钟功能
  58          void timer0() interrupt 1 using 2
  59          {       TH0=0xd8;                                          //
  60   1              TL0=0xf0;                                          //定时10ms
  61   1              if(mil>=99)                                        
  62   1                      {       mil=0;                             
  63   2                              if(sec>=59)
  64   2                                      {       sec=0;
  65   3                                              if(min>=59)
  66   3                                                      {       min=0;
  67   4                                                              hou=hou>=23?0:++hou;
  68   4                                                      }
  69   3                                              else ++min;
  70   3                                      }
  71   2                              else ++sec;
  72   2                      }
  73   1              else ++mil;
  74   1      }
  75          //等待空闲函数
  76          //检查忙状态,等待空闲
  77          void chkbusy()                                           
  78          {       RS=0;                                                    //定义数据类型为指令
  79   1              E=1;                                                     //置E为1
  80   1              RW=1;                                                    //RW为“1”,使能信号E为“1”表示从总线读数据
  81   1              DB_BUS=0xff;                                     //置数据总线为0xff以便正确读出忙信号
  82   1              while(!busy);                                    //等待直到不忙为止
  83   1      }
  84          
  85          void writcode(uc cd)                                               
  86          {       chkbusy();                                               //等待空闲                                                             
  87   1              RW=0;                                                    //数据操作为写
  88   1              RS=0;                                                    //数据类型为指令
  89   1              E=1;
  90   1              DB_BUS=cd;                                               //将指令写到数据总线端口
  91   1              E=0;                                                     //E产生下跳沿将总线上的数据写入1602
  92   1      }
  93          
  94          void writdata(uc dat)
  95          {       chkbusy();                                               //等待空闲     
  96   1              RW=0;                                                    //数据操作为写
  97   1              E=1;
  98   1              RS=1;                                                    //数据类型为数据
  99   1              DB_BUS=dat;                                              //将数据写到数据总线端口
 100   1              E=0;                                                     //E产生下跳沿将总线上的数据写入1602
 101   1      }
 102          //屏幕显示函数
 103          //注:指定DDRAM地址后每写一次数据DDRAM地址自动加一
 104          void display()
 105          {       writcode(0x80);                                  //置DD RAM地址为0x00(0x80-0x80=0x00)
 106   1              switch(connum)                                   //屏幕显示的数据与DD RAM地数据相对应,初始时0x00对应屏幕上的第一行第一个字符
 107   1              {       case 1:writdata('h');break;      //数据可调允许位为1,即允许调节小时则写第一行第一个字符为‘h’
 108   2                      case 2:writdata('m');break;      //数据可调允许位为2,即允许调节分钟则写第一行第一个字符为‘m’
 109   2                      default:writdata(' ');           //数据不可调则清空第一行第一个字符
 110   2              }
 111   1              writdata(' ');                                   //空出一格
 112   1              writdata(hou/10+48);                     //取小时的十位并将其加48转换成其ASCII后写数据到DDRAM
 113   1              writdata(hou%10+48);                     //取小时的个位并将其加48转换成其ASCII后写数据到DDRAM
 114   1              writdata(':');                                   //编译器会自动将‘:’转换为ASCII码
 115   1              writdata(min/10+48);                     //以下同理
 116   1              writdata(min%10+48);
 117   1              writdata(':');
C51 COMPILER V8.02   LCD_CLOCK                                                             11/02/2008 21:54:01 PAGE 3   

 118   1              writdata(sec/10+48);
 119   1              writdata(sec%10+48);
 120   1              writdata('-');;
 121   1              writdata(mil/10+48);
 122   1              writdata(mil%10+48);
 123   1              writdata(' ');
 124   1              hou>12?writdata('P'):writdata('A');        //小时大于12则显示‘P’小于则显示‘A’
 125   1              writdata('M');  
 126   1      }
 127          //按键检测函数
 128          //
 129          void  chkkey()                                          
 130          {       if(k0==1&&FUN_KEY==0)                   //与标志位结合起来可判断按键的下跳沿
 131   1              {       k0=0;                                           //按键按下将标志位清零表示按键处于按下状态
 132   2                      connum=connum>=control_number? 0:++connum;      //改变数据可调允许位的值
 133   2              }
 134   1              if(k1==1&&INC_KEY==0)                   
 135   1              {       k1=0;
 136   2                      if(connum==1)hou=hou>=23?0:++hou;        //按下加键根据数据可调允许位的值对数据进行操作
 137   2                      if(connum==2)min=min>=59?0:++min;
 138   2              }
 139   1              if(k2==1&&DEC_KEY==0)
 140   1              {       k2=0;
 141   2                      if(connum==1)hou=hou==0?23:--hou;        //按下减键根据数据可调允许位的值对数据进行操作
 142   2                      if(connum==2)min=min==0?59:--min;
 143   2              }
 144   1              k0=FUN_KEY?1:0;                            //一下操作使按键状态与标志位处以同一状态
 145   1              k1=INC_KEY?1:0;
 146   1              k2=DEC_KEY?1:0;
 147   1      }
 148          
 149          void main(void)
 150          {       uart_init();                              //对单片机进行基本初始化
 151   1              init_lcm();                                       //初始化1602液晶显示模块
 152   1              while(1)
 153   1              {       display();                                //屏幕显示
 154   2                      chkkey();                                 //按键检
 155   2               }
 156   1      
 157   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    492    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -