倒计时显示程序
程序:
#include
#define uchar unsigned char //将unsigned char定义为uchar,简化输写。提高编程速度
#define uint unsigned int //将unsigned char定义为uint,简化输写。提高编程速度
sbit lcdrs=P1^0; //数据命令选择控制 sbit lcdrw=P1^1; //读/写选择控制 sbit lcden=P1^2; //使能信号
sbit SCL2=P1^3; //SCL2定义为P1口的第3位脚,连接DS1302SCL和ADC0831SCL脚
sbit SDA2=P1^4; //SDA2定义为P1口的第4位脚,连接DS1302SCL和ADC0831SDA脚
sbit RST = P1^5; // DS1302片选脚
sbit H1=P0^4; //高四位分别对应P04-P07 sbit H2=P0^5; sbit H3=P0^6; sbit H4=P0^7; sbit D=P1^7;
unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0}; unsigned char l_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0}; code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
uchar t0[]=%uchar t1[]=%uchar wendu[]=\
uchar shi,ge;
uchar nian,yue,ri,shi,fen; uchar key,num; long number; uchar j;
uchar flag,m,n;
uchar qian2,bai2,shi2,ge2; void delay1(uchar z) {
uchar x,y;
for(x=1000;x>1;x--) for(y=z;y>1;y--); }
void delay(uchar z) {
uchar x,y;
for(x=1000;x>1;x--) for(y=z;y>1;y--); }
void write_com(uchar com) {
lcdrs=0; P2=com; delay1(5); lcden=1; delay1(5); lcden=0; }
void write_date(uchar date) {
lcdrs=1; P2=date; delay1(5); lcden=1; delay1(5); lcden=0; }
void init_lcd() {
uchar i; lcden=0; lcdrw=0;
write_com(0x38); write_com(0x01);
write_com(0x0c); write_com(0x06);
write_com(0x80); for(i=0;i<16;i++) {
write_date(t0[i]); delay(0); }
write_com(0x80+0x40); for(i=0;i<16;i++) {
write_date(t1[i]); delay(0); } }
/**************************DS1302*************************************/
void Write_Ds1302_Byte(unsigned char temp) {
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据 {
SCL2=0;
SDA2=temp&0x01; //每次传输低字节 temp>>=1; //右移一位 SCL2=1; } }
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat ) {
RST=0; _nop_(); SCL2=0; _nop_(); RST=1; _nop_(); //启动
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据 RST=0; //恢复 }
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address ) {
unsigned char i,temp=0x00; RST=0; _nop_(); SCL2=0; _nop_(); RST=1; _nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据 {
if(SDA2)
temp|=0x80; //每次传输低字节 SCL2=0;
temp>>=1; //右移一位 SCL2=1; }
RST=0;
_nop_(); //以下为DS1302复位的稳定时间 RST=0; SCL2=0; _nop_(); SCL2=1; _nop_(); SDA2=0; _nop_(); SDA2=1; _nop_();
return (temp); //返回 }
/*读取 日历*/
void Read_RTC(void) {
unsigned char i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++) //分7次读取 年月日时分秒星期
{
l_tmpdate[i]=Read_Ds1302(*p); p++; } }
/*设定 日历*/
void Set_RTC(void) {
unsigned char i,*p,tmp; for(i=0;i<7;i++){
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]; l_tmpdate[i]=l_tmpdate[i]+tmp*16; }
Write_Ds1302(0x8e,0x00);
p=write_rtc_address; //传地址
for(i=0;i<7;i++) //7次写入 年月日时分秒星期 {
Write_Ds1302(*p,l_tmpdate[i]); p++; }
Write_Ds1302(0x80,0x00); }
void jiaoshi() {
switch(j) {
case 0:break;
case 1:{nian=num/10*16+num;
Write_Ds1302(0x8c,nian);//年 break;}
case 2:{yue=num/10*16+num;
Write_Ds1302(0x88,yue); //月 break;}
case 3:{ri=num/10*16+num;
Write_Ds1302(0x86,ri); //日 break;}
case 4:{shi=num/10*16+num;