clock_show_time_data.lst

来自「这是一段开始学单片机时写的LCD程序」· LST 代码 · 共 381 行 · 第 1/2 页

LST
381
字号
C51 COMPILER V7.50   CLOCK_SHOW_TIME_DATA                                                  07/25/2007 10:48:55 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CLOCK_SHOW_TIME_DATA
OBJECT MODULE PLACED IN clock_show_time_data.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE clock_show_time_data.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //*******************************************************
   2          //该程序实现用液晶显示器LCD显示年,月,日和时间
   3          //程序启发:用查表法把数据送到LCD显示
   4          //不足之处:没有考虑闰年,闰月等;年,月,日和时间不可调
   5          //作者:李锡坚
   6          //完成时间:2007.07.25.10:30
   7          //*******************************************************
   8          /********************************************************
   9          控制说明:
  10          sbit LCD_RS=P3^4;                          //定义LCD的RS控制位
  11          sbit LCD_RW=P3^5;                          //定义LCD的RW控制位
  12          sbit LCD_DISPLAY_START=P1^0;   //LCD开始显示的指示灯
  13          sbit LCD_E=P1^1;                           //定义LCD的E控制位
  14          写操作时用:LCD_E=1;
  15                     _nop_();
  16                             LCD_E=0;
  17                             代替
  18          *********************************************************/
  19          //****************************************
  20          #include<reg51.h>               //包含常用头文件
  21          #include<stdio.h>
  22          #include<intrins.h>
  23          #include<absacc.h>
  24          #define uchar unsigned char        //定义常用数据类型
  25          int cnt;
  26          void LCD_INIT(void);               //LCD的初始化函数
  27          void LCD_DISPLAY_COLON(uchar *DATA);//在指定的位置显示字符串
  28          void LCD_DISPLAY_DATE(uchar *DATA); //在指定的位置显示字符串
  29          void LCD_DISPLAY_STR(void);                //在指定的位置显示字符串
  30          void LCD_CLR(uchar y);                                                   //清除LCD指定的行
  31          void LCD_SEND_COMMAND(uchar COMMAND);                    //向LCD发送命令
  32          void LCD_SEND_DATA(uchar DATA);                                  //向LCD发送数据
  33          void LCD_WAIT(void);                             //检查LCD空闲
  34          uchar LCD_GET_FLAG(void);                                                //检查LCD状态
  35          void DELAY(void);                                                                //延时
  36          /*定义所要显示的数据*/
  37          char code DISPLAY[]="0123456789";//预先存放数字
  38          char code DISPLAY_COLON[]="time:  :  :"; //显示冒号
  39          char code DISPLAY_DATE[]="date:    .  ."; //显示日期
  40          /*定义LCD控制字*/
  41          #define LCD_MODE 0x3C        /* 接口数据8位,显示2行,字体为1号 */          
  42          #define LCD_NO_FLASH 0x0C    /* 屏幕显示开,无光标 */        
  43          #define LCD_HIDE 0x08        /* 屏幕显示关 */       
  44          #define LCD_FLASH 0x0D       /* 屏幕显示开,并打开闪烁光标 */    
  45          #define LCD_SHIFT 0x07       /* 模块数据输入为增量方式,显示内容移动 */      
  46          #define LCD_NO_SHIFT 0x06    /* 模块数据输入为增量方式,显示光标移动 */     
  47          #define LCD_SH 0x14          /* 移动光标及整体显示 */ 
  48          #define LCD_LINE1  0x80          /*第一行DDRAM起始地址*/
  49          #define LCD_LINE2  0xc0          /*第二行DDRAM起始地址*/
  50          #define SEND_IN  P0          /*XBYTE[0xff00] /*定义LCD的实际地址*/
  51          sbit LCD_RS=P3^4;                          //定义LCD的RS控制位
  52          sbit LCD_RW=P3^5;                          //定义LCD的RW控制位
  53          sbit LCD_DISPLAY_START=P1^0;   //LCD开始显示的指示灯
  54          sbit LCD_E=P1^1;                           //定义LCD的E控制位
  55          int t=0;                                           //中断计数
C51 COMPILER V7.50   CLOCK_SHOW_TIME_DATA                                                  07/25/2007 10:48:55 PAGE 2   

  56          int hour_2=1,hour_1=0,minute_2=3,minute_1=0,second_2=0,second_1=0;
  57          int year_4=2,year_3=0,year_2=0,year_1=7,month_2=0,month_1=7,date_2=2,date_1=5;
  58          //*************************************************
  59          //LCD显示字符串的主程序
  60          //利用中断间隔循环显示
  61          //
  62          //*************************************************  
  63          main()
  64          {
  65   1         LCD_INIT();                                    //初始化LCD
  66   1         LCD_CLR(1);
  67   1         LCD_CLR(2);
  68   1         LCD_DISPLAY_COLON(DISPLAY_COLON);  //显示冒号
  69   1         LCD_DISPLAY_DATE(DISPLAY_DATE);        //显示日期
  70   1         TMOD=0x02;                                             
  71   1         TH0=0x06;
  72   1         TL0=0x06;
  73   1         TR0=1;
  74   1         ET0=1;
  75   1         EA=1; 
  76   1       do
  77   1        {        
  78   2         LCD_DISPLAY_STR();
  79   2         
  80   2         }while(1); 
  81   1      }
  82          //*************************************************
  83          //函数功能:LCD初始化
  84          //输入变量:无
  85          //输出变量:无
  86          //调用模块:LCD_SEND_COMMAND(),LCD_CLR()
  87          //*************************************************
  88          void LCD_INIT(void)
  89            {                                                                
  90   1         LCD_SEND_COMMAND(LCD_MODE);     //设置工作方式
  91   1         LCD_SEND_COMMAND(LCD_NO_FLASH); //设置显示方式
  92   1         LCD_SEND_COMMAND(LCD_NO_SHIFT); //设置光标画面滚动方式
  93   1         LCD_SEND_COMMAND(LCD_SH);       //设置输入方式
  94   1         LCD_CLR(1);                                     //清除LCD第一行
  95   1         LCD_CLR(2);                                     //清除LCD第二行
  96   1          }
  97          //*************************************************
  98          //函数功能:清除LCD指定行
  99          //输入变量:y
 100          //输出变量:无
 101          //调用模块:LCD_SEND_COMMAND(),LCD_SEND_DATA()
 102          //************************************************* 
 103          void LCD_CLR(uchar y)
 104             {
 105   1          uchar i;
 106   1              i=0;
 107   1              if(y==1)
 108   1                  {
 109   2                       LCD_SEND_COMMAND(LCD_LINE1);  //发送命令使LCD指向第一行
 110   2                       i=16;
 111   2                       }
 112   1          if(y==2)
 113   1                  {
 114   2                       LCD_SEND_COMMAND(LCD_LINE2);  //发送命令使LCD指向第二行
 115   2                       i=16;
 116   2                       }
 117   1               if(i!=0)
C51 COMPILER V7.50   CLOCK_SHOW_TIME_DATA                                                  07/25/2007 10:48:55 PAGE 3   

 118   1                       {
 119   2                        do
 120   2                         {
 121   3                          LCD_SEND_DATA(' ');            //让LCD的相应位置显示空格
 122   3                         }while(--i!=0);
 123   2           }
 124   1       }
 125          //*************************************************
 126          //函数功能:向LCD发送命令
 127          //输入变量:COMMAND
 128          //输出变量:无
 129          //调用模块:LCD_WAIT()
 130          //*************************************************
 131          void LCD_SEND_COMMAND(uchar COMMAND)
 132          {
 133   1        LCD_WAIT();    //等待空闲
 134   1        LCD_RS=0;              //命令方式
 135   1        LCD_RW=0;              //写方式
 136   1        LCD_E=1;
 137   1        SEND_IN=COMMAND;//写实际的命令到LCD
 138   1        LCD_E=0;
 139   1      }
 140          //*************************************************
 141          //函数功能:向LCD发送数据
 142          //输入变量:DATA
 143          //输出变量:无
 144          //调用模块:LCD_WAIT()
 145          //*************************************************
 146          void LCD_SEND_DATA(uchar DATA)
 147          {
 148   1        LCD_WAIT();  //等待空闲
 149   1        LCD_RS=1;        //数据方式
 150   1        LCD_RW=0;        //写方式
 151   1        LCD_E=1;
 152   1        SEND_IN=DATA;//写实际的数据到LCD
 153   1        LCD_E=0;
 154   1      }
 155          //*************************************************
 156          //函数功能:等待LCD空闲
 157          //输入变量:无
 158          //输出变量:无
 159          //调用模块:LCD_GET_FLAG()
 160          //*************************************************
 161          void LCD_WAIT(void)
 162          {
 163   1       uchar i;
 164   1       i=1000;  //定义等待时间,可以防止由于LCD损坏而使程序死循环
 165   1       do
 166   1         {
 167   2              if((LCD_GET_FLAG()&0x80)==0) //判断BF是否为0
 168   2             {
 169   3                  break; 
 170   3                       }
 171   2               }while(--i!=0); 
 172   1      
 173   1      }
 174          //*************************************************
 175          //函数功能:检查LCD状态
 176          //输入变量:无
 177          //输出变量:LCD显示的当前状态
 178          //调用模块:无

⌨️ 快捷键说明

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