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

📄 ds1302+lcd1602-c51.lst

📁 基于C51实现多功能钟,一键多功能,友好的液晶显示,人机界面,同时能播放音乐.绝对原创!
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE DS1302_LCD1602_C51
OBJECT MODULE PLACED IN DS1302+LCD1602-C51.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE DS1302+LCD1602-C51.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************/
   2          /*                                                                 */
   3          /*  - DS1302时钟显示与定时控制                                     */
   4          /*                                                                 */
   5          /* LCD1602显示                                                     */
   6          /*---------------------湖北汽车工业学院----------------------------*/
   7          /*--------------------------电信系---------------------------------*/
   8          /******************************************************************/                                      
             -          
   9          #include<reg51.h>
  10          #include<intrins.h>
  11          #include"AT2402.H"
  12          
  13          #define ALARM_NUM  8
  14          #define uchar unsigned char  
  15          #define uint  unsigned int      
  16          sbit LCD_RS = P2^0;      //REST的信号       
  17          sbit LCD_RW = P2^1;              //
  18          sbit LCD_EN = P2^2;
  19          
  20          sbit  K1 = P1^4;         //开关
  21          sbit  K2 = P1^5;
  22          sbit  K3 = P1^6;
  23          sbit  K4 = P1^7;
  24          
  25          //*******************************************
  26          sbit reset = P1^2;       //DS1302的复位信号
  27          sbit sclk  = P1^0;       //DS1302的时钟信号
  28          sbit io    = P1^1;        //IO口信号 数据线
  29          //*******************************************
  30          
  31          /////****************************************
  32          //24c04的定义****************************
  33          //sbit sclk;
  34          //******************************************
  35          sbit BEEP = P3^7;
  36          bit flag=1,  hour=0,  min=0,  sec=0,   num=0;
  37          bit year=0,  month=0, day=0,  week=0;
  38          bit alarm_flag=0;
  39          uchar  timecount=0,   count=0; 
  40          uchar k=0;
  41          
  42          uchar str1[]="  -  -   Week:  ";
  43          uchar str2[]="Time:           ";
  44          uchar str3[]="Alarm:          ";
  45          uchar str4[]="Alarm_num:      ";
  46          uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //
  47          uchar init1[] ={0x00,0x00};
  48          uchar init2[] ={0x00,0x59,0x23,0x01,0x05,0x01,0x06}; //星期0x01
  49                         //秒, 分, 时, 日, 月,星期,年
  50          
  51          //******************************************
  52          
  53          struct  alarm
  54          {    
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 2   

  55                 char s;   //秒
  56                 char m;   //分   
  57                     char h;  // 时     
  58          }alarm2={0x00,0x00,0x00};    //定义结构数组
  59          
  60          //********************************************************************************
  61          
  62          uchar code  mytab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};  //小喇叭
  63          
  64          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};    //延时作用
  65          
  66          void  Set_W1302(uchar addr);             // 设定值写入DS1302
  67          void  Set_Flash(uchar row,uchar col);   // 被设置数据闪动
  68          void  Set_place(uchar row,uchar col);   // 指定位置显示
  69          void  Play_nowtime();                     // 显示当前时间
  70          void  key_set(uchar num,uchar row,uchar col );  // 键设定函数
  71          void  alarm_time();               // 报警时间设定
  72          void  Play_alarmtime();  // 报警时间显示
  73          void  Time_compare();    // 时间比较
  74          void  write_byte(uchar inbyte);
  75          void init_24c02(void);  //初始化24c02
  76          /******************************************************************/
  77          void delay1(int ms)                     //延时函数
  78          {
  79   1      unsigned char y;
  80   1      while(ms--)
  81   1       {
  82   2        for(y = 0; y<250; y++)
  83   2        {
  84   3         _nop_();
  85   3         _nop_();
  86   3         _nop_();
  87   3         _nop_();
  88   3        }
  89   2       }
  90   1      }
  91          
  92          /**********以下为读写24c02的函数***********************************************/
  93          /**********************************************************/
  94          //写的子函数
  95          /**********************************************************/
  96          void write_byte(uchar inbyte)
  97          {
  98   1         uchar i;
  99   1         for(i=0;i<8;i++)
 100   1         {
 101   2          sclk=0;             //写的时候低电平改变数据
 102   2          if(inbyte&0x01)
 103   2          io=1;                        //数据线
 104   2          else
 105   2          io=0; 
 106   2          sclk=1;            //写的时候高电平,把数据写入ds1302
 107   2          _nop_();
 108   2          inbyte=inbyte>>1;
 109   2         }
 110   1      }
 111          
 112          /******************************************************************/
 113          /*                                                                */
 114          /*检查LCD忙状态                                                   */
 115          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。     */
 116          /*                                                                */
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 3   

 117          /******************************************************************/ 
 118          
 119          bit lcd_busy()
 120           {                          
 121   1          bit result;
 122   1          LCD_RS = 0; //指令寄存器
 123   1          LCD_RW = 1; //读数据
 124   1          LCD_EN = 1; //使能信号
 125   1          delayNOP();
 126   1          result = (bit)(P0&0x80);//读取信号
 127   1          LCD_EN = 0;
 128   1          return(result); 
 129   1       }
 130          
 131          /*********************************************************/
 132          /*                                                       */
 133          /*写指令数据到LCD                                        */
 134          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                   */
 135          /*                                                       */
 136          /*********************************************************/
 137          
 138          void lcd_wcmd(uchar cmd)
 139          {                          
 140   1         while(lcd_busy());
 141   1          LCD_RS = 0;
 142   1          LCD_RW = 0;//写数据
 143   1          LCD_EN = 0; //不动作
 144   1          _nop_();
 145   1          _nop_(); 
 146   1          P0 = cmd;  //指令数据
 147   1          delayNOP();
 148   1          LCD_EN = 1; //高位使能
 149   1          delayNOP();
 150   1          LCD_EN = 0;  
 151   1      }
 152          
 153          /*********************************************************/
 154          /*                                                       */
 155          /*写显示数据到LCD                                        */
 156          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                     */
 157          /*                                                       */
 158          /*********************************************************/
 159          void lcd_wdat(uchar dat)
 160          {                          
 161   1         while(lcd_busy());
 162   1          LCD_RS = 1;   //写入数据寄存器
 163   1          LCD_RW = 0;
 164   1           LCD_EN = 0;
 165   1          P0 = dat;   //写入数据
 166   1          delayNOP();
 167   1          LCD_EN = 1;
 168   1          delayNOP();
 169   1          LCD_EN = 0; 
 170   1      }
 171          
 172          /*********************************************************/
 173          /*                                                       */
 174          /*  LCD初始化设定                                        */
 175          /*                                                       */
 176          /*********************************************************/
 177          
 178          void init_lcd()
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 4   

 179          { 
 180   1          delay1(15);   
 181   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 182   1                  
 183   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 184   1          delay1(5);
 185   1          lcd_wcmd(0x38);         
 186   1          delay1(5);
 187   1          lcd_wcmd(0x38);         
 188   1          delay1(5);
 189   1      
 190   1          lcd_wcmd(0x0c);      //显示开,关光标
 191   1          delay1(5);
 192   1          lcd_wcmd(0x06);      //移动光标
 193   1          delay1(5);
 194   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 195   1          delay1(5);
 196   1      }
 197          
 198          /*********************************************************/
 199          //延时函数 
 200          /*********************************************************/
 201          void delay()
 202          {
 203   1         uchar j;
 204   1         for(j=250;j>0;j--);
 205   1      }
 206          
 207          /*********************************************************/
 208          /*                                                       */
 209          /*  写字符串函数                                         */
 210          /*                                                       */
 211          /*********************************************************/
 212          void write_str(uchar addr,uchar *p)
 213          {
 214   1         uchar i=0; 
 215   1         lcd_wcmd(addr); //写入指令数据
 216   1         while(p[i]!='\0')
 217   1         {
 218   2          lcd_wdat(p[i]);//写入数据
 219   2          i++;
 220   2         }
 221   1      }
 222          
 223          /*********************************************************/
 224          /*                                                       */
 225          /*  设定显示位置                                         */
 226          /*                                                       */
 227          /*********************************************************/
 228          void write_position(uchar row,uchar col)
 229           {
 230   1         uchar place;
 231   1         if(row==1)
 232   1         {
 233   2           place=0x80+col-1;
 234   2           lcd_wcmd(place); //位置指令数据
 235   2         }
 236   1         else
 237   1         {
 238   2           place=0xc0+col-1;
 239   2           lcd_wcmd(place);
 240   2         }
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 5   

 241   1       }
 242          
 243          /*********************************************************/
 244          /*                                                       */
 245          /*自定义字符写入CGRAM                                    */
 246          /*                                                       */
 247          /*********************************************************/
 248          void  writetab()  
 249          {  
 250   1          unsigned char i;
 251   1          lcd_wcmd(0x40);            //写CGRAM
 252   1          for (i = 0; i< 8; i++)       
 253   1          lcd_wdat(mytab[i]);        
 254   1      }
 255          
 256          /**********************************************************/
 257          /**********************************************************/

⌨️ 快捷键说明

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