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

📄 104-1602ʦ

📁 104-1602液晶显示DS1302时钟 含定时
💻
字号:
C51 COMPILER V9.01   MAIN                                                                  05/13/2012 00:36:50 PAGE 1   


C51 COMPILER V9.01, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <REG51.H>
   2          #include <intrins.h>
   3          //#include "LCD1602.h"
   4          //#include "DS1302.h"
   5          #define uint unsigned int
   6          #define uchar unsigned char
   7          sbit  DS1302_CLK = P1^7;              //实时时钟时钟线引脚
   8          sbit  DS1302_IO  = P1^6;              //实时时钟数据线引脚
   9          sbit  DS1302_RST = P1^5;              //实时时钟复位线引脚
  10          sbit  wireless_1 = P3^0;
  11          sbit  wireless_2 = P3^1;
  12          sbit  wireless_3 = P3^2;
  13          sbit  wireless_4 = P3^3;
  14          sbit  beep=P3^4;
  15          sbit  ACC0 = ACC^0;
  16          sbit  ACC7 = ACC^7;
  17          char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year,hide_m,hide_f,hide_h;
  18          sbit Set = P2^0;       //模式切换键
  19          sbit Up = P2^1;        //加法按钮
  20          sbit Down = P2^2;      //减法按钮
  21          sbit out = P2^3;       //立刻跳出调整模式按钮
  22          sbit dd=P2^4;                    // 定时
  23          
  24          sbit DQ = P1^0;        //温度传送数据IO口
  25          
  26          char done,count,temp,flag,up_flag,down_flag,key;
  27          uchar temp_value;      //温度值
  28          uchar m,f,h,mo,d,y,w,kaiguan,h=12,f=30;
  29          uchar TempBuffer[5],week_value[2],nao[8];
  30          void naotime();
  31          uchar code tone[]={212,212,190,212,159,169,212,212,190,212,142,159,
  32          212,212,106,126,159,169,190,119,119,126,159,142,159,0};
  33          
  34          uchar code lon[]={9,3,12,12,12,24,9,3,12,12,12,24,
  35          9,3,12,12,12,12,12,9,3,12,12,12,24,0};
  36          
  37          void delay(uint z)
  38          {
  39   1      uint x,y;
  40   1      for(x=z;x>0;x--)
  41   1      for(y=110;y>0;y--);
  42   1      }
  43          void music()
  44          {
  45   1      uint i,j,k=0,m;
  46   1      for(m=0;m<26;m++)
  47   1      {
  48   2      for(i=0;i<lon[k]*20;i++)
  49   2      {
  50   3      beep=~beep;
  51   3      for(j=0;j<tone[k]/3;j++);
  52   3      }
  53   2      delay(10);
  54   2      k++;
  55   2      }
C51 COMPILER V9.01   MAIN                                                                  05/13/2012 00:36:50 PAGE 2   

  56   1      }
  57          void show_time();   //液晶显示程序
  58          /***********1602液晶显示部分子程序****************/
  59          
  60          
  61          //Port Definitions**********************************************************
  62          sbit LcdRs              = P2^5;
  63          sbit LcdRw              = P2^6;
  64          sbit LcdEn      = P2^7;
  65          sfr  DBPort     = 0x80;         //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
  66          
  67          //内部等待函数**************************************************************************
  68          unsigned char LCD_Wait(void)
  69          {
  70   1      LcdRs=0;
  71   1      LcdRw=1;        _nop_();
  72   1      LcdEn=1;        _nop_();
  73   1      
  74   1      LcdEn=0;
  75   1      return DBPort;
  76   1      }
  77          //向LCD写入命令或数据************************************************************
  78          #define LCD_COMMAND                     0      // Command
  79          #define LCD_DATA                        1      // Data
  80          #define LCD_CLEAR_SCREEN        0x01      // 清屏
  81          #define LCD_HOMING              0x02      // 光标返回原点
  82          void LCD_Write(bit style, unsigned char input)
  83          {
  84   1      LcdEn=0;
  85   1      LcdRs=style;
  86   1      LcdRw=0;                _nop_();
  87   1      DBPort=input;   _nop_();//注意顺序
  88   1      LcdEn=1;                _nop_();//注意顺序
  89   1      LcdEn=0;                _nop_();
  90   1      LCD_Wait();
  91   1      }
  92          
  93          //设置显示模式************************************************************
  94          #define LCD_SHOW                        0x04    //显示开
  95          #define LCD_HIDE                        0x00    //显示关
  96          
  97          #define LCD_CURSOR                      0x02    //显示光标
  98          #define LCD_NO_CURSOR           0x00    //无光标
  99          
 100          #define LCD_FLASH                       0x01    //光标闪动
 101          #define LCD_NO_FLASH            0x00    //光标不闪动
 102          
 103          void LCD_SetDisplay(unsigned char DisplayMode)
 104          {
 105   1      LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
 106   1      }
 107          
 108          //设置输入模式************************************************************
 109          #define LCD_AC_UP                       0x02
 110          #define LCD_AC_DOWN                     0x00      // default
 111          
 112          #define LCD_MOVE                        0x01      // 画面可平移
 113          #define LCD_NO_MOVE                     0x00      //default
 114          
 115          void LCD_SetInput(unsigned char InputMode)
 116          {
 117   1      LCD_Write(LCD_COMMAND, 0x04|InputMode);
C51 COMPILER V9.01   MAIN                                                                  05/13/2012 00:36:50 PAGE 3   

 118   1      }
 119          
 120          //初始化LCD************************************************************
 121          void LCD_Initial()
 122          {
 123   1      LcdEn=0;
 124   1      LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
 125   1      LCD_Write(LCD_COMMAND,0x38);
 126   1      LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
 127   1      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
 128   1      LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
 129   1      }
 130          
 131          //液晶字符输入的位置************************
 132          void GotoXY(unsigned char x, unsigned char y)
 133          {
 134   1      if(y==0)
 135   1      LCD_Write(LCD_COMMAND,0x80|x);
 136   1      if(y==1)
 137   1      LCD_Write(LCD_COMMAND,0x80|(x-0x40));
 138   1      }
 139          
 140          //将字符输出到液晶显示
 141          void Print(unsigned char *str)
 142          {
 143   1      while(*str!='\0')
 144   1      {
 145   2      LCD_Write(LCD_DATA,*str);
 146   2      str++;
 147   2      }
 148   1      }
 149          /*void printc(unsigned char lcd_data)
 150          {
 151            LCD_Write(LCD_DATA,lcd_data); 
 152          }*/
 153          
 154          
 155          
 156          
 157          
 158          /***********DS1302时钟部分子程序******************/
 159          typedef struct __SYSTEMTIME__
 160          {
 161          unsigned char Second;
 162          unsigned char Minute;
 163          unsigned char Hour;
 164          unsigned char Week;
 165          unsigned char Day;
 166          unsigned char Month;
 167          unsigned char  Year;
 168          unsigned char DateString[12];
 169          unsigned char TimeString[10];
 170          }SYSTEMTIME;    //定义的时间类型
 171          SYSTEMTIME CurrentTime;
 172          
 173          
 174          #define AM(X)   X
 175          #define PM(X)   (X+12)                    // 转成24小时制
 176          #define DS1302_SECOND   0x80          //时钟芯片的寄存器位置,存放时间
 177          #define DS1302_MINUTE   0x82
 178          #define DS1302_HOUR             0x84
 179          #define DS1302_WEEK             0x8A
C51 COMPILER V9.01   MAIN                                                                  05/13/2012 00:36:50 PAGE 4   

 180          #define DS1302_DAY              0x86
 181          #define DS1302_MONTH    0x88
 182          #define DS1302_YEAR             0x8C
 183          
 184          void DS1302InputByte(unsigned char d)   //实时时钟写入一字节(内部函数)
 185          {
 186   1      unsigned char i;
 187   1      ACC = d;
 188   1      for(i=8; i>0; i--)
 189   1      {
 190   2      DS1302_IO = ACC0;               //相当于汇编中的 RRC
 191   2      DS1302_CLK = 1;
 192   2      DS1302_CLK = 0;
 193   2      ACC = ACC >> 1;
 194   2      }
 195   1      }
 196          
 197          unsigned char DS1302OutputByte(void)    //实时时钟读取一字节(内部函数)
 198          {
 199   1      unsigned char i;
 200   1      for(i=8; i>0; i--)
 201   1      {
 202   2      ACC = ACC >>1;                          //相当于汇编中的 RRC
 203   2      ACC7 = DS1302_IO;
 204   2      DS1302_CLK = 1;
 205   2      DS1302_CLK = 0;
 206   2      }
 207   1      return(ACC);
 208   1      }
 209          
 210          void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要写的数据
 211          {
 212   1      DS1302_RST = 0;
 213   1      DS1302_CLK = 0;
 214   1      DS1302_RST = 1;
 215   1      DS1302InputByte(ucAddr);        // 地址,命令
 216   1      DS1302InputByte(ucDa);          // 写1Byte数据
 217   1      DS1302_CLK = 1;
 218   1      DS1302_RST = 0;
 219   1      }
 220          
 221          unsigned char Read1302(unsigned char ucAddr)    //读取DS1302某地址的数据
 222          {
 223   1      unsigned char ucData;
 224   1      DS1302_RST = 0;
 225   1      DS1302_CLK = 0;
 226   1      DS1302_RST = 1;
 227   1      DS1302InputByte(ucAddr|0x01);        // 地址,命令
 228   1      ucData = DS1302OutputByte();         // 读1Byte数据
 229   1      DS1302_CLK = 1;
 230   1      DS1302_RST = 0;
 231   1      return(ucData);
 232   1      }
 233          
 234          
 235          
 236          void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
 237          {
 238   1      unsigned char ReadValue;
 239   1      ReadValue = Read1302(DS1302_SECOND);
 240   1      Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 241   1      ReadValue = Read1302(DS1302_MINUTE);
C51 COMPILER V9.01   MAIN                                                                  05/13/2012 00:36:50 PAGE 5   

 242   1      Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 243   1      ReadValue = Read1302(DS1302_HOUR);
 244   1      Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 245   1      ReadValue = Read1302(DS1302_DAY);
 246   1      Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 247   1      ReadValue = Read1302(DS1302_WEEK);
 248   1      Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 249   1      ReadValue = Read1302(DS1302_MONTH);
 250   1      Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 251   1      ReadValue = Read1302(DS1302_YEAR);
 252   1      Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
 253   1      }
 254          
 255          void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
 256          {   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2
             -007/07/22
 257   1      {
 258   2      Time->DateString[0] = '2';
 259   2      Time->DateString[1] = '0';
 260   2      Time->DateString[2] = Time->Year/10 + '0';
 261   2      Time->DateString[3] = Time->Year%10 + '0';
 262   2      }
 263   1      else
 264   1      {
 265   2      Time->DateString[0] = ' ';
 266   2      Time->DateString[1] = ' ';
 267   2      Time->DateString[2] = ' ';
 268   2      Time->DateString[3] = ' ';
 269   2      }
 270   1      Time->DateString[4] = '/';
 271   1      if(hide_month<2)
 272   1      {
 273   2      Time->DateString[5] = Time->Month/10 + '0';
 274   2      Time->DateString[6] = Time->Month%10 + '0';
 275   2      }
 276   1      else
 277   1      {
 278   2      Time->DateString[5] = ' ';
 279   2      Time->DateString[6] = ' ';
 280   2      }
 281   1      Time->DateString[7] = '/';
 282   1      if(hide_day<2)
 283   1      {
 284   2      Time->DateString[8] = Time->Day/10 + '0';
 285   2      Time->DateString[9] = Time->Day%10 + '0';
 286   2      Time->DateString[10] =' ';
 287   2      Time->DateString[11] =' ';
 288   2      }
 289   1      else
 290   1      {
 291   2      Time->DateString[8] = ' ';
 292   2      Time->DateString[9] = ' ';
 293   2      Time->DateString[10] =' ';
 294   2      Time->DateString[11] =' ';
 295   2      }
 296   1      if(hide_week<2)
 297   1      {
 298   2      week_value[0] = Time->Week%10 + '0';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等

⌨️ 快捷键说明

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