钻石会员
主题
回帖0
积分12399
阅读权限50
注册时间2011-3-13
最后登录1970-1-1
在线时间 小时
|
刚开了“LED照明技术交流区”版块
共阴的,数码之家发过,程序在这- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit led=P2^0;
- sbit CLK=P2^5;
- sbit IO=P2^6;
- sbit RST=P2^7;
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- sbit key1=P2^1;
- sbit key2=P2^2;
- sbit gnd=P2^3;
- static uchar mode=0, set=0;
- unsigned char hour,sec,min,add,count,count1;
- bit flag;
- unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0,0x76};
- void delay(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=125;y>0;y--);
- }
- void timer_init()
- {
- TMOD=0x11;
- TH0 =(65536-5000)/256;
- TL0=(65536-5000)%256;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- TH1 =0;
- TL1=0;
- EA=1;
- ET1=1;
- ET0=1;
- TR0=1;
- }
- void dis(unsigned char x,y)
- {
- static unsigned char i;
- unsigned char qian,bai,shi,ge;
- qian=x/16;
- bai=x%16;
- shi=y/16;
- ge=y%16;
- switch(i)
- {
- case 0: if(qian){P0=tab[qian]; P1=0xfe;}else{P0=tab[10];P1=0xfe;} break;
- case 1: P0=tab[bai]; P1=0xfd; break;
- case 2: P0=tab[shi]; P1=0xfb; break;
- case 3: P0=tab[ge]; P1=0xf7; break;
- }
- i++;
- if(i==4)i=0;
- }
- void inputbyte(uchar ucDa)
- {
- uchar i;
- ACC = ucDa;
- for(i=8; i>0; i--)
- {
- IO = ACC0; //相当于汇编中的 RRC
- CLK = 1;
- CLK = 0;
- ACC = ACC >> 1;
- }
- }
- /********************************************************************
- *
- * 名称: uchar uc_RToutputbyte
- * 说明:
- * 功能: 从DS1302读取1Byte数据
- * 调用:
- * 输入:
- * 返回值: ACC
- ***********************************************************************/
- uchar outputbyte(void)
- {
- uchar i;
- for(i=8; i>0; i--)
- {
- ACC = ACC >>1; //相当于汇编中的 RRC
- ACC7 = IO;
- CLK = 1;
- CLK = 0;
- }
- return(ACC);
- }
- /********************************************************************
- *
- * 名称: v_W1302
- * 说明: 先写地址,后写命令/数据
- * 功能: 往DS1302写入数据
- * 调用: v_RTinputbyte()
- * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
- * 返回值: 无
- ***********************************************************************/
- void write(uchar ucAddr, uchar ucDa)
- {
- RST = 0;
- CLK = 0;
- RST = 1;
- inputbyte(ucAddr); //地址,命令
- inputbyte(ucDa); //写1Byte数据
- CLK = 1;
- RST =0;
- }
- /********************************************************************
- *
- * 名称: uc_R1302
- * 说明: 先写地址,后读命令/数据
- * 功能: 读取DS1302某地址的数据
- * 调用: v_RTinputbyte() , uc_RToutputbyte()
- * 输入: ucAddr: DS1302地址
- * 返回值: ucDa :读取的数据
- ***********************************************************************/
- uchar read(uchar ucAddr)
- {
- uchar ucDa;
- RST = 0;
- CLK = 0;
- RST = 1;
- inputbyte(ucAddr); //地址,命令
- ucDa = outputbyte(); //读1Byte数据
- CLK = 1;
- RST =0;
- return(ucDa);
- }
- void DS1302_init()
- {
- if(read(0xc1)!=0x88) //2011/12/15 13:58:08
- {
- write(0x8e,0x00);//关闭写保护
- write(0x80,0x08); //设置秒
- write(0x82,0x58);//设置分钟
- write(0x84,0x13); // 小时
- write(0x8c,0x11);//年
- write(0x88,0x12);//月
- write(0x86,0x15);//日
- write(0x90,0xa5);//涓流充电
- write(0xc0,0x88);//标志位
- write(0x8e,0x80);//打开写保护
- }
- }
- void keyscan()
- {
- if(!key1||!key2)
- {
- delay(15);
- if(!key1)
- {
- delay(15);
- while(!key1);
- if(mode)write(0x8e,0x00);//关闭写保护
- switch(mode)
- {
- case 0:set++;if(set==3) set=0;break;
- case 1:add=(read(0x8d))/16*10+read(0x8d)%16; // 年
- add++;if(add==21)add=11,set=0;
- write(0x8c,(add/10)*16+add%10);break;
- case 2:add=(read(0x89)/16)*10+read(0x89)%16; //月
- add++;if(add==13)add=1;
- write(0x88,(add/10)*16+add%10);break;
- case 3:add=(read(0x87)/16)*10+read(0x87)%16; //日
- add++;if(add==32)add=1;
- write(0x86,(add/10)*16+add%10);break;
- case 4:add=(read(0x85)/16)*10+read(0x85)%16; //时
- add++;if(add>=24)add=0;
- write(0x84,(add/10)*16+add%10);break;
- case 5:add=(read(0x83)/16)*10+read(0x83)%16; //分
- add++;if(add==60)add=0;
- write(0x82,(add/10)*16+add%10);break;
- }
- write(0x8e,0x80);//打开写保护
- }
- if(!key2)
- {
- delay(15);
- while(!key2);
- if(set==2)
- {
- write(0x8e,0x00);//关闭写保护
- write(0x80,0x00);
- write(0x8e,0x80);//打开写保护
- }
- else{mode++; if(mode==6) mode=0;}
- }
- }
- }
- void key_init()
- {
- gnd=0;
- key1=1;
- key2=1;
- }
- void main()
- {
- timer_init();
- DS1302_init();
- key_init();
- while(1)
- {
- if(flag)
- {
- flag=0;
- switch(mode)
- {
- case 0:
- switch(set)
- {
- case 0: dis(read(0x85),read(0x83));
- if(count>=100){count=0;count1=0;TR1=0;led=!led;}
- break;
- case 1: dis(read(0x89),read(0x87));
- led=1;
- TR1=1;
- if(count1>=60) set=0;
- break;
- case 2: dis(0xaa,read(0x81));
- led=0;
- count1=0;TR1=0;
- break;
- }
- break;
- case 1:dis(0x20,read(0x8d));led=1;break;
- case 2:dis(read(0x89),0xaa);led=1;break;
- case 3:dis(0xaa,read(0x87));led=1;break;
- case 4:dis(read(0x85),0xab);led=0;break;
- case 5:dis(0xaa,read(0x83));led=0;break;
- }
- }
- keyscan();
- }
- }
- void timer() interrupt 1
- {
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- flag=1;
- count++;
- }
- void timer1() interrupt 3
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- count1++;
- }
复制代码 |
|