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

📄 newds1302.lst

📁 非常经典~~的 一个~~~~ds1302液晶时钟
💻 LST
📖 第 1 页 / 共 2 页
字号:
 241   1      	lcden=0;
 242   1      	delay(1);
 243   1      	lcdrs=0;
 244   1      }
 245          
 246          
 247           void lcd_dfs(uchar aa,uchar bb)//	用来刷新分秒天 aa=数据 bb=LCD地址
 248          {
 249   1      	uchar a=0,b=0;
 250   1      	a=aa%10;
 251   1      	b=aa/10;
 252   1      		lcd_com(bb);
 253   1      		lcd_data(b+0x30);
 254   1      		lcd_data(a+0x30);
 255   1      }
 256          
 257          void lcd_sfm()//显示时分秒
 258          {
 259   1      	lcd_dfs(ds_time[2],0xc4);//时
 260   1      	lcd_dfs(ds_time[1],0xc7);//分
 261   1      	lcd_dfs(ds_time[0],0xca);//秒
 262   1      }
 263          
 264          void lcd_yydw()//显示年月日天星期
 265          {
 266   1      	lcd_dfs(ds_time[6],0x82);//年
 267   1      	lcd_dfs(ds_time[5],0x85);//月
 268   1      	lcd_dfs(ds_time[4],0x88);//天
 269   1      	lcd_com(0x8b);
 270   1      	week(ds_time[3]);//星期
 271   1      }
 272          
 273          void week(uchar cc)//星期的处理
 274          {
 275   1      	uchar a,f;
 276   1      	a=cc%10;
 277   1      	for (f=0;f<3;f++)
 278   1      	lcd_data(*weekda[a]); 
 279   1      }
 280          
 281          void dsread_reg(uchar rbs ,uchar *preg)//寄存器多字节读取
 282          {
 283   1      	uchar i;
 284   1      	dsce = 0;
 285   1      	dsclk = 0;
 286   1      	dsce = 1;
 287   1      	ds_write(0xff);//0xbf:时钟多字节读命令 
 288   1      		for (i=rbs; i>0; i--)
 289   1      		{
 290   2      		*preg = ds_read();/* 读1Byte数据 */
 291   2      		preg++;
 292   2      		}
 293   1      	dsclk = 1;
 294   1      	dsce = 0;
 295   1      } 
 296          
 297          void ds_write_reg(uchar wbs ,uchar *pwrite)    //寄存器写指令,多字节
 298          {
 299   1      	uchar i;
 300   1      	ds_write_b(0x8e,0x00);/* 控制命令,WP=0,写操作*/
 301   1      	dsce = 0;
 302   1      	dsclk = 0;
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 6   

 303   1      	dsce = 1;
 304   1      	ds_write(0xfe);/* 0xbe:时钟多字节写命令 */
 305   1      	
 306   1      		for (i = wbs; i>0; i--)/*共31字节*/	
 307   1      		{
 308   2      		ds_write(*pwrite); /* 写1Byte数据*/	
 309   2      		pwrite++;	
 310   2      		}
 311   1      	dsclk = 1;
 312   1      	dsce = 0;
 313   1      }
 314          
 315          void ds_bcdzh(uchar *p)//把BCD码转换成十六进制的,用指针方式,并放在ds_time中
 316          {
 317   1      	uchar i,ee=*p;
 318   1      	for(i=0;i<7;i++)
 319   1      		{
 320   2      		*p=(((*p)&0x70)>>4)*10+((*p)&0x0f);
 321   2      		p++;
 322   2      		ee=*p;
 323   2      		}
 324   1      }
 325          
 326          /*void ds_bcdzh()//把BCD码转换成十六进制的
 327          {
 328          dssj.miao=(((dssj.miao&0x70)>>4)*10)+(dssj.miao&0x0f);
 329          dssj.fen=(((dssj.fen&0x70)>>4)*10)  + (dssj.fen&0x0f);
 330          dssj.shi=(((dssj.shi&0x70)>>4)*10)  + (dssj.shi&0x0f);
 331          dssj.day=(((dssj.day&0x70)>>4)*10)  + (dssj.day&0x0f);
 332          dssj.yue=(((dssj.yue&0x70)>>4)*10)  + (dssj.yue&0x0f);
 333          dssj.week=(((dssj.week&0x70)>>4)*10)+(dssj.week&0x0f);
 334          dssj.year=(((dssj.year&0x70)>>4)*10)+(dssj.year&0x0f);
 335          }*/
 336          
 337          //bcd转十六进,注意DEC数值,比如日大于了相应月的最大日期,DS1302将会错乱。
 338          uchar dectobcd(uchar dec)//bcd转十六进,
 339          {
 340   1       uchar bcd;
 341   1       bcd=0;
 342   1       while(dec>=10)              
 343   1      {
 344   2        dec-=10;                         
 345   2        bcd++;
 346   2       } 
 347   1       bcd<<=4;
 348   1       bcd|=dec;
 349   1       return bcd;
 350   1      }
 351          
 352          void time_dec_bcd()//把ds_time数组里的值转换成bcd码并放在数组里
 353          {
 354   1      uchar dtb;
 355   1      for(dtb=0;dtb<7;dtb++)
 356   1      ds_time[dtb]=dectobcd(ds_time[dtb]);
 357   1      //ds_write_bs(&ds_time);    //写字令,多字节 把数组里的bcd码写入ds1302k ,格式为: 秒 分 时 日 月 星期 年
 358   1      }
 359          
 360          void runyear()//判断是否润年,并返回相应的月份天数
 361          {
 362   1      bit yeara=0;
 363   1      uchar yuea=ds_time[4];
 364   1      uint ryear;
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 7   

 365   1      ryear=2000;
 366   1      ryear=ryear+ds_time[6];
 367   1      if((ryear%100!=0)&&(ryear%4==0)||(ryear%400==0))		{yeara=1;}
 368   1      
 369   1      if(yeara==0&&yuea==2)	{yueb=28;}
 370   1      if(yeara==1&&yuea==2)	{yueb=29;}
 371   1      	if(yuea!=2)
 372   1      	{
 373   2      	if((yuea%2!=0&&yuea<8)||(yuea%2==0&&yuea>7)) {yueb=31;}
 374   2      	if((yuea%2!=0&&yuea>8)||(yuea%2==0&&yuea<7)) {yueb=30;}
 375   2      	}
 376   1      //return yueb;
 377   1      }
 378          
 379          void jbsm()				//键盘扫描
 380          {
 381   1      uchar *p; uchar ds_wadd;
 382   1      	key1=1;
 383   1      	key2=1;
 384   1      	key3=1;
 385   1      	runyear();
 386   1      	if(key1==0)
 387   1      	{
 388   2      		delay1(100);		//功能键
 389   2      		if(key1==0)
 390   2      		{
 391   3      			while(!key1);
 392   3      			kk++;
 393   3      			lcd_com(0x0f);							//发送LCD命令,开启光标,并闪烁
 394   3      			switch(kk)
 395   3      			{//add--液晶地址 adat=秒分时......
 396   4      			case 1: adda=0xca; *p=ds_time[0]; ds_wadd=0;break;//秒位
 397   4      			case 2: adda=0xc7; *p=ds_time[1]; ds_wadd=1; break;//分位
 398   4      			case 3: adda=0xc4; *p=ds_time[2]; ds_wadd=2; break;//时位
 399   4      			case 4: adda=0x8b; *p=ds_time[5]; ds_wadd=5;break;//星期
 400   4      			case 5: adda=0x88; *p=ds_time[3]; ds_wadd=3;break;//天
 401   4      			case 6: adda=0x85; *p=ds_time[4]; ds_wadd=4; break;//月
 402   4      			case 7: adda=0x82; *p=ds_time[6]; ds_wadd=6; break;//年
 403   4      			case 8: kk=0; 
 404   4      			time_dec_bcd();			//转换成bcd码
 405   4      			ds_write_bs(&ds_time);	//往ds1302中写入多字节时钟
 406   4      			lcd_com(0x0c);
 407   4      			break;					//结束调时操作
 408   4      			}
 409   3      			lcd_com(adda);			//让光标在指定地址闪烁
 410   3      			
 411   3      		}
 412   2      	}
 413   1      
 414   1      	if(kk!=0)		//按键加一
 415   1      	{
 416   2      		if(key2==0)
 417   2      		{
 418   3      			delay1(100);
 419   3      			if(key2==0)
 420   3      			{
 421   4      			while(!key2);
 422   4      			(*p)++;
 423   4      			if(((kk==1)||(kk==2))&&((*p)==60)) 	{*p=0;}//秒分加一
 424   4      			if((kk==3)&&(*p)==24)	{*p=00;}//小时加一
 425   4      
 426   4      			if((kk==5)&&(*p)==yueb+1)	{*p=1;}//日期加一
C51 COMPILER V6.12  NEWDS1302                                                              09/27/2008 14:21:13 PAGE 8   

 427   4      			if((kk==6)&&(*p)==13)	{*p=1;}//月份加一
 428   4      			if((kk==7)&&(*p)==100)	{*p=0;}//年份加一
 429   4      			lcd_dfs(*p,adda);
 430   4      			lcd_com(adda);
 431   4      			if(kk==4){if((kk==4)&&(*p)==8) *p=1; week(*p);lcd_com(adda);}//星期加一
 432   4      			}
 433   3      			ds_time[ds_wadd]=*p;
 434   3      		}
 435   2      		
 436   2      		if(key3==0)//按键减一
 437   2      		{
 438   3      			delay1(100);
 439   3      			if(key3==0)
 440   3      			{
 441   4      			while(!key3);
 442   4      			(*p)--;
 443   4      			if(((kk==1)||(kk==2))&&((*p)==255)) 	{*p=59;}//秒分减一
 444   4      			if((kk==3)&&(*p)==255)	{*p=23;}//小时减一
 445   4      			if((kk==5)&&(*p)==0)	{*p=yueb;}//日期减一
 446   4      			if((kk==6)&&(*p)==0)	{*p=12;}//月份减一
 447   4      			if((kk==7)&&(*p)==0)	{*p=99;}//年份减一
 448   4      			lcd_dfs(*p,adda);
 449   4      			lcd_com(adda);
 450   4      			if(kk==4){if((kk==4)&&(*p)==0) *p=7; week(*p);lcd_com(adda);}//星期加一
 451   4      			}
 452   3      		}ds_time[ds_wadd]=*p;
 453   2      	}
 454   1      }
 455          
 456          void main()
 457          {
 458   1      lcd_init();
 459   1      
 460   1      		while(1)
 461   1      		{		
 462   2      			if(kk==0)
 463   2      			{
 464   3      			ds_read_bs(&ds_time);	//读取ds1302时钟信号---突发模式
 465   3      			ds_bcdzh(&ds_time);	//BCD转换,指针方式
 466   3      			//ds_bcdzh();			//另一种方式BCD转换
 467   3      			lcd_sfm();			//时分秒刷新
 468   3      			//lcd_yydw();
 469   3      			}
 470   2      		jbsm();
 471   2      			/*	ds_write_reg(8 ,&dssja);
 472   2      			dsread_reg(8 ,&dssj);
 473   2      			lcd_sfm();
 474   2      			while(1);*/
 475   2      		}
 476   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1589    ----
   CONSTANT SIZE    =     36    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     34      22
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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