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

📄 newds1302.lst

📁 非常经典~~的 一个~~~~ds1302液晶时钟
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE NEWDS1302
OBJECT MODULE PLACED IN .\Newds1302.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\Newds1302.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include<reg52.h>
   2          #define uint unsigned int
   3          #define uchar unsigned char
   4          /*lcd管脚定义*/
   5          sbit lcdrs=P2^0;
   6          sbit lcden=P2^1;
   7          sbit lcdrw=P3^2;
   8          bit lcdzt;
   9          
  10          /*ds1302管脚定义*/
  11          sbit dsce=P2^2;
  12          sbit dsclk=P2^3;
  13          sbit dsdata=P2^4;
  14          /*ACC的定义*/
  15          sbit a0=ACC^0;
  16          sbit a7=ACC^7;
  17          
  18          sbit key1=P2^5;
  19          sbit key2=P2^6;
  20          sbit key3=P2^7;
  21          
  22          uchar kk=0,adda=0,yueb;
  23          uchar *weekda[]={"","777","111","222","333","444","555","666"};
  24          
  25          
  26          uchar  ds_time[]={0,0,0,0,0,0,0};
  27          
  28          uchar code ds_data_init[]={0x08,0x08,0x8,0x01,0x08,0x01,0x08};
  29          
  30          //uchar code ds_write_add[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
  31          
  32          void delay(uchar);			//延时,C最少=90 a=5
  33          //void delay1(uint a);				//长时间延时用于键盘检测
  34          /**ds1302的驱动*/
  35          void ds_write(uchar); 						//往ds1302中写入一字节的数据或地址 ,aa=数据或地址
  36          void  ds_write_b(uchar,uchar);				//往ds1302中写一字节数据
  37          void ds_write_bs(uchar *time);				//写字令,多字节
  38          void ds_write_reg(uchar ,uchar *pwrite);	//写寄存器指令,多字节
  39          
  40          uchar ds_read(); 					//往ds1302中读取一字节数据,放在ACC中
  41          uchar ds_read_b(uchar);				//往ds1302中读取一字节数据, 地址为cc 读出的数据放在ee中
  42          void ds_read_bs(uchar *time1);		//读字令,多字节
  43          void dsread_reg(uchar ,uchar *preg);	//读寄存器 ,多字节
  44          
  45          //void ds_bcdzh();					//把BCD码转换成十六进制的
  46          void ds_bcdzh(uchar *p);	//把BCD码转换成十六进制的
  47          uchar dectobcd(uchar);//bcd转十六进,
  48          void time_dec_bcd();//把ds_time数组里的值转换成bcd码并放在数组里
  49          void runyear();//判断是否润年,并返回相应的月份天数
  50          /*LCD的驱动*/
  51          void lcd_com(uchar);		//向lcd发指令
  52          void lcd_data(uchar);		//向lcd发送数据
  53          void lcd_init();			//lcd初始化
  54          
  55          /*关于显示*/
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 2   

  56          void lcd_dfs(uchar,uchar);//	用来刷新分秒天 aa=数据 bb=LCD地址
  57          void lcd_yydw();			//显示年月日天星期
  58          void week(uchar);			//星期的处理
  59          
  60          void jbsm(uchar *p2);		//键盘扫描
  61          /*结构体typedef
  62           struct sys
  63          {
  64          uchar miao;
  65          uchar  fen;
  66          uchar  shi;
  67          uchar  day;
  68          uchar  yue;
  69          uchar  week;
  70          uchar  year;
  71          }dssj,dssja={0x05,0x05,0x22,0x25,0x11,0x01,0x08}; */ 
  72          
  73          
  74          
  75          void delay(uchar a)		//延时,C最少=90 a=5
  76          {
  77   1      uchar b,c;
  78   1      for(b=a;b>0;b--)
  79   1      for(c=90;c>0;c--);
  80   1      }
  81          
  82          void delay1(uint a)		//长时间延时用于键盘检测
  83          {
  84   1      uint b,c;
  85   1      for(b=a;b>0;b--)
  86   1      for(c=150;c>0;c--);
  87   1      }
  88          
  89          void ds_write(uchar aa) 	//往ds1302中写入一字节的数据或地址 ,aa=数据或地址
  90          {
  91   1      	uchar i;
  92   1      	ACC = aa;
  93   1      	for(i=8; i>0; i--)
  94   1      		{	
  95   2      		dsdata = a0;//相当于汇编中的 RRC 
  96   2      		dsclk = 1;
  97   2      		dsclk = 0;
  98   2      		ACC=ACC>>1;
  99   2      		}
 100   1      }
 101          
 102          uchar ds_read()		//往ds1302中读取一字节数据,放在ACC中
 103          {
 104   1      	uchar i;	
 105   1      		for(i=8; i>0; i--)
 106   1      		{
 107   2      		ACC = ACC >>1;//相当于汇编中的 RRC 
 108   2      		a7 = dsdata;
 109   2      		dsclk = 1;
 110   2      		dsclk = 0;
 111   2      		}
 112   1      	return(ACC);
 113   1      }
 114          
 115          uchar ds_read_b(uchar cc)	//往ds1302中读取一字节数据, 地址为cc 读出的数据放在ee中
 116          {
 117   1      	uchar ee;
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 3   

 118   1      	dsce=0;
 119   1      	dsclk=0;
 120   1      	dsce=1;
 121   1      
 122   1      	ds_write(cc);
 123   1      	ee=ds_read();
 124   1      
 125   1      	dsclk=1;
 126   1      	dsce=0;
 127   1      	return ee;
 128   1      }
 129          
 130          void  ds_write_b(uchar ff ,uchar gg)	//往ds1302中写一字节数据, 地址为ff 要写入的数据放在gg中
 131          {
 132   1      	dsce=0;
 133   1      	dsclk=0;
 134   1      	dsce=1;
 135   1      
 136   1      	ds_write(ff);
 137   1      	ds_write(gg);
 138   1      
 139   1      	dsclk=1;
 140   1      	dsce=0;
 141   1      }
 142          
 143          void ds_write_bs(uchar *time)    //写字令,多字节 ,格式为: 秒 分 时 日 月 星期 年
 144          {
 145   1      	uchar i;
 146   1      	ds_write_b(0x8e,0x00);// 控制命令,WP=0,写操作
 147   1      	dsce = 0;
 148   1      	dsclk = 0;
 149   1      	dsce = 1;
 150   1      	ds_write(0xbe);//0xbe:时钟多字节写命令 
 151   1      	
 152   1      		for (i = 8; i>0; i--)//8Byte = 7Byte 时钟数据 + 1Byte 控制
 153   1      		{
 154   2      		ds_write(*time); // 写1Byte数据
 155   2      		time++;	
 156   2      		}
 157   1      		
 158   1      	dsclk = 1;
 159   1      	dsce = 0;
 160   1      }
 161          
 162          void ds_read_bs(uchar *time1)    //读字令,多字节,格式为: 秒 分 时 日 月 星期 年
 163          {
 164   1      	uchar i;
 165   1      	dsce = 0;
 166   1      	dsclk = 0;
 167   1      	dsce = 1;
 168   1      	ds_write(0xbf);// 0xbf:时钟多字节读命令 
 169   1      		for (i=8; i>0; i--)	
 170   1      		{
 171   2      		*time1 = ds_read();//读1Byte数据 
 172   2      		time1++;
 173   2      		}
 174   1      	dsclk = 1;
 175   1      	dsce = 0;
 176   1      }
 177          
 178          
 179          void lcd_com(uchar aa)	//向lcd发指令
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 4   

 180          {
 181   1      	lcdrs=0;
 182   1      	P0=aa;
 183   1      	delay(5);
 184   1      	lcden=1;
 185   1      	delay(5);
 186   1      	lcden=0;
 187   1      	delay(1);
 188   1      	lcdrs=1;
 189   1      }
 190          
 191          void lcd_readzt()		//LCD读状态
 192          {
 193   1      uchar lcdzta;
 194   1      lcdrs=0;
 195   1      lcdrw=1;
 196   1      lcden=1;
 197   1      P0=0xff;
 198   1      lcdzta=P0;
 199   1      lcdzta<<1;
*** WARNING C275 IN LINE 199 OF .\NEWDS1302.C: expression with possibly no effect
 200   1      lcdzt=CY;
 201   1      }
 202          
 203          void lcd_init()			//lcd初始化
 204          {
 205   1      	lcden=0;
 206   1      	lcd_com(0x38);
 207   1      	lcd_com(0x0c);
 208   1      	lcd_com(0x06);
 209   1      	lcd_com(0x01);
 210   1      	lcd_com(0x80);
 211   1      
 212   1      		ds_write_bs(&ds_data_init);	//往ds1302中写入多字节
 213   1      		ds_read_bs(&ds_time);		//往ds1302中读出多字节
 214   1      		ds_bcdzh(&ds_time);		//把BCD码转换成十六进制的
 215   1      		
 216   1      		lcd_dfs(ds_time[2],0xc4);		//时
 217   1      		lcd_data(':');
 218   1      		lcd_dfs(ds_time[1],0xc7);		//分
 219   1      		lcd_data(':');
 220   1      		lcd_dfs(ds_time[0],0xca);	//秒
 221   1      
 222   1      		lcd_com(0x80);
 223   1      		lcd_data('2');
 224   1      		lcd_data('0');
 225   1      		lcd_dfs(ds_time[6],0x82);	//年
 226   1      		lcd_data('-');
 227   1      		lcd_dfs(ds_time[4],0x85);		//月
 228   1      		lcd_data('-');
 229   1      		lcd_dfs(ds_time[3],0x88);		//天
 230   1      		lcd_com(0x8b);
 231   1      		week(ds_time[5]);			//星期
 232   1      }
 233          
 234          void lcd_data(uchar bb)			//向lcd发送数据
 235          {
 236   1      	lcdrs=1;
 237   1      	P0=bb;
 238   1      	delay(5);
 239   1      	lcden=1;
 240   1      	delay(5); 
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 5   

⌨️ 快捷键说明

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