搜档网
当前位置:搜档网 › 倒计时LCD显示程序

倒计时LCD显示程序

倒计时LCD显示程序
倒计时LCD显示程序

倒计时显示程序

程序:

#include //52单片机头文件,一般不要改动,里面包含特殊功能寄存器的定义

#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[]="0123456789";

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]%10;

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%10;

Write_Ds1302(0x8c,nian);//年

break;}

case 2:{yue=num/10*16+num%10;

Write_Ds1302(0x88,yue); //月

break;}

case 3:{ri=num/10*16+num%10;

Write_Ds1302(0x86,ri); //日

break;}

case 4:{shi=num/10*16+num%10;

Write_Ds1302(0x84,shi); //时

break;}

case 5:{fen=num/10*16+num%10;

Write_Ds1302(0x82,fen); //分

break;}

}

}

void display()

{

uchar nians,niang,yues,yueg,ris,rig;

uchar shis,shig,fens,feng,miaos,miaog;

uchar qian1,bai1,shi1,ge1;

nians=l_tmpdate[6]/16;

niang=l_tmpdate[6]&0x0f;

yues=l_tmpdate[4]/16;

yueg=l_tmpdate[4]&0x0f;

ris=l_tmpdate[3]/16;

rig=l_tmpdate[3]&0x0f;

shis=l_tmpdate[2]/16/10;

shig=l_tmpdate[2]&0x0f;

fens=l_tmpdate[1]/16;

feng=l_tmpdate[1]&0x0f;

miaos=l_tmpdate[0]/16;

miaog=l_tmpdate[0]&0x0f;

if(shis==0&&shig==0&&fens==0&&feng==0&&miaos==0&&miaog==0)number--;

if(number==0) D=0;

write_com(0x80+4);

write_date(wendu[nians]);

write_com(0x80+5);

write_date(wendu[niang]);

write_com(0x80+7);

write_date(wendu[yues]);

write_com(0x80+8);

write_date(wendu[yueg]);

write_com(0x80+10);

write_date(wendu[ris]);

write_com(0x80+11);

write_date(wendu[rig]);

write_com(0x80+0x40);

write_date(wendu[shis]);

write_com(0x80+0x40+1); write_date(wendu[shig]);

write_com(0x80+0x40+3); write_date(wendu[fens]);

write_com(0x80+0x40+4); write_date(wendu[feng]);

write_com(0x80+0x40+6); write_date(wendu[miaos]);

write_com(0x80+0x40+7); write_date(wendu[miaog]);

qian1=number/1000;

bai1=number%1000/100;

shi1=number%1000%100/10;

ge1=number%10;

write_com(0x80+0x40+10); write_date(wendu[qian1]);

write_com(0x80+0x40+11); write_date(wendu[bai1]);

write_com(0x80+0x40+12);

write_date(wendu[shi1]);

write_com(0x80+0x40+13);

write_date(wendu[ge1]);

}

void Init()

{

EA=1; //首先开启总中断

EX0=1; //开启外部中断 0

IT0=1; // 设置成下降沿触发方式

EX1=1; //开启外部中断 0

IT1=1;

}

/***************************键盘*************************************/

uchar saomiao()

{

P0=0xfe;

if(H1==0){key=1;} //按键盘S1,显示"0"

if(H2==0){key=2;} //按键盘S2,显示"1"

if(H3==0){key=3;} //按键盘S3,显示"2"

if(H4==0){key=4;} //按键盘S4,显示"3"

P0=0xfd;

if(H1==0){key=5;} //按键盘S5,显示"4"

if(H2==0){key=6;} //按键盘S6,显示"5"

if(H3==0){key=7;} //按键盘S7,显示"6"

if(H4==0){key=8;} //按键盘S8,显示"7"

P0=0xfb;

if(H1==0){key=9;} //按键盘S9,显示"8"

if(H2==0){key=0;} //按键盘S10,显示"9"

P0=0xf0;

if((H1==1)&&(H2==1)&&(H3==1)&&(H4==1))

{key=100;}

return(key);

}

/**************************键盘扫描***************************************/

uchar jianpan()

{

num=0;

if(m==1)

{

if(j<=5)

{

n=j;

if(j==1)write_com(0x80+4);

if(j==2)write_com(0x80+7);

if(j==3)write_com(0x80+10);

if(j==4)write_com(0x80+0x40);

if(j==5)write_com(0x80+0x40+3);

while((saomiao()==100)&&m==1&&(j-n==0));

while((saomiao()!=100)&&m==1&&(j-n==0))

{

shi=saomiao();

if(j==1)

{

write_com(0x80+4);

write_date(wendu[shi]);

}

if(j==2)

{

write_com(0x80+7);

write_date(wendu[shi]);

}

if(j==3)

{

write_com(0x80+10);

write_date(wendu[shi]);

}

if(j==4)

{

write_com(0x80+0x40);

write_date(wendu[shi]);

}

if(j==5)

{

write_com(0x80+0x40+3);

write_date(wendu[shi]);

}

}

while((saomiao()==100)&&m==1&&(j-n==0)); while((saomiao()!=100)&&m==1&&(j-n==0)) {

ge=saomiao();

if(j==1)

{

write_com(0x80+5);

write_date(wendu[ge]);

write_com(0x80+4);

}

if(j==2)

{

write_com(0x80+8);

write_date(wendu[ge]);

write_com(0x80+7);

}

if(j==3)

{

write_com(0x80+11);

write_date(wendu[ge]);

write_com(0x80+10);

}

if(j==4)

{

write_com(0x80+0x40+1);

write_date(wendu[ge]);

write_com(0x80+0x40);

}

if(j==5)

{

write_com(0x80+0x40+4);

write_date(wendu[ge]);

write_com(0x80+0x40+3);

}

num=shi*10+ge;

}

}

if(j==6)

{

write_com(0x80+0x40+10);

while((saomiao()==100)&&m==1);

while((saomiao()!=100)&&m==1)

{

qian2=saomiao();

write_com(0x80+0x40+10);

write_date(wendu[qian2]);

}

while((saomiao()==100)&&m==1);

while((saomiao()!=100)&&m==1)

{

bai2=saomiao();

write_com(0x80+0x40+11);

write_date(wendu[bai2]);

}

while((saomiao()==100)&&m==1);

while((saomiao()!=100)&&m==1)

{

shi2=saomiao();

write_com(0x80+0x40+12);

write_date(wendu[shi2]);

}

while((saomiao()==100)&&m==1);

while((saomiao()!=100)&&m==1)

{

ge2=saomiao();

write_com(0x80+0x40+13);

write_date(wendu[ge2]);

}

number=qian2*1000+bai2*100+shi2*10+ge2;

}

}

return(num);

}

void main()

{ D=1;

Init();

init_lcd();

Set_RTC();

number=1234;

j=0;m=0;

while(1)

{

num=jianpan();

jiaoshi();

if(m==0)

{

Read_RTC();

display();

delay1(10);

}

}

}

void INTI0() interrupt 0

{

m=0;j=0;

Write_Ds1302(0x80,0x00);

Write_Ds1302(0x8e,0x80); //写保护,禁止写

write_com(0x0c);

delay(50);

}

void INTI1() interrupt 2

{

Write_Ds1302(0x8e,0x00); //1302写保护,允许写Write_Ds1302(0x80,0x80);

m=1;j++;

write_com(0x0f);

if(j==7)

{

j=1;

}

delay(50);

}

相关主题