?? zsp.c
字號:
/*****************************************************
4字LED點(diǎn)陣屏+DS1302萬年歷電子鐘 C 程序【改模對換/反顯】
******************************************************
聲明:
本程序中DS1302讀寫部分是直接引用網(wǎng)上網(wǎng)友提供的共享程序,
本程序供大家學(xué)習(xí)之用,用勿用于商業(yè)用途。尊重作者版權(quán)。
編寫:鄧椿薪
時(shí)間:2006年6月9日 晚
郵箱:love2151@xinhuanet.com
網(wǎng)址:www.89s51diy.com
*******************************************************
DS1302 接線圖
Vcc2 CLK I/O /RST
| | | |
-------------------
| 8 7 6 5 |
| DS1302 |
| |
| 1 2 3 4 |
-------------------
| | | |
VCC1 GND
1 腳接+5V 2,3腳32768HZ晶振 4腳接地 5腳接S51的P02 6腳接S51的P01 7接S51的P00
8腳接后備電源,可以接老計(jì)算機(jī)主板上的3.6V電池,也可以通過二級管隔離接一個(gè)大容量電解電容
電壓在2.5V以上即可維持
595連級輸出數(shù)據(jù),138行驅(qū)動(dòng)。*/
#include <AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
#define light 3 //定義亮度
uchar code hanzi[]; //漢字字模
uchar code timer[12][16]; //0~9數(shù)字
uchar code sw[]; //138驅(qū)動(dòng)數(shù)據(jù)
void Show_word(); //待機(jī)顯示按三秒間隔分別顯示年、月日、星期、時(shí)分秒。
void Show_pass(); //不顯示一個(gè)字
void Send_data(unsigned char *d); /*串口發(fā)送一行*/
/******************************************/
sbit resget=P0^2; //時(shí)鐘復(fù)位
sbit key_moda=P0^3; //模式轉(zhuǎn)換
sbit key_up=P0^4; //時(shí)鐘加
sbit key_Down=P0^5; //時(shí)鐘減
sbit T_CLK=P2^3; //DS1302引腳連接
sbit T_IO =P2^2;
sbit T_RST=P2^1;
sbit ACC0=ACC^0; //1bit數(shù)據(jù)存儲位
sbit ACC7=ACC^7;
sbit STR=P1^7; //鎖存
sbit CLK=P3^1; //時(shí)鐘
sbit Data= P3^0; //數(shù)據(jù)
sbit E=P1^4;
uchar starts_time[7]={0x00,0x10,0x22,0x11,0x06,0x07,0x06}; //初始化后設(shè)置
uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; //時(shí)間變量
uchar a,b,f,h,msec,id,x; //標(biāo)志計(jì)數(shù)器 a為自動(dòng)轉(zhuǎn)換顯示時(shí)間,b為手動(dòng)與自動(dòng)標(biāo)志
uint zimuo; //字模計(jì)數(shù)器
uchar BUFF[10]; //緩存
void RTInputByte(uchar); /* 輸入 1Byte */
uchar RTOutputByte(void); /* 輸出 1Byte */
void W1302(uchar, uchar); // 向DS1302寫入一個(gè)字節(jié)
uchar R1302(uchar); // 從DS1302讀出一個(gè)字節(jié)
void Set1302(uchar *); // 寫DS1302時(shí)間
void du1302(); // 讀時(shí)間
void DelayMs(void); // 延時(shí)
void Set(uchar,uchar ); // 變量調(diào)整
void in_data(); // 調(diào)整移動(dòng)數(shù)據(jù)
void rxd_data(); // 串口發(fā)送移動(dòng)數(shù)據(jù)
/*主函數(shù)*/
void main()
{
Move=0;
zimuo=0;
TMOD=0x01; //16位定時(shí)
TH0=0x3c; //25ms晶振為24M
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
SCON=0; //初始化串口為工作方式0(同步通信方式,TxD輸出同步脈沖)
while(zimuo<512)
{
while(Move<16) //數(shù)據(jù)移位。
{
for(Speed=0;Speed<10;Speed++) //移動(dòng)速度
{
for(line=0;line<16;line++)
{
in_data(); //調(diào)整移動(dòng)數(shù)據(jù)
rxd_data();
P1=sw[line];
STR=1;STR=0;
P1_7=1;
DelayMs(); //延時(shí),等待一段時(shí)間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
}
}
Move++; //移動(dòng)一步
}
Move=0;
zimuo=zimuo+32;
}
zimuo=0;
while(1) //重復(fù)循環(huán)顯示
{
if(resget==0)
{ DelayMs();
if(resget==0)
Set1302(starts_time); //初始化
W1302(0x8e,0x00); //控制命令,WP=0,寫操作
W1302(0x90,0xa5); //打開充電二級管 一個(gè)二級管串聯(lián)一個(gè)2K電阻
}
du1302(); //讀取 秒 分 時(shí) 日 月 星期 年
if (key_moda==0) //設(shè)置和選擇項(xiàng)目鍵
{ DelayMs();
if(key_moda==0)
{
if(id++==9) {id=0;}
h=0;msec=0; //清閃爍標(biāo)志
while(key_moda==0){ Show_word();}
}
}
if(id!=0)
{
if (key_up==0) //增加
{
DelayMs();
if(key_up==0)
{
while(key_up==0)
{Show_word();} //調(diào)用顯示
h=0;msec=0; //清閃爍標(biāo)志
Set(id,0); //調(diào)用時(shí)間調(diào)調(diào)整
}
}
if (key_Down==0) //減少
{
DelayMs();
if(key_Down==0)
{
while(key_Down==0)
{Show_word();} //調(diào)用顯示
h=0;msec=0; //清閃爍標(biāo)志
Set(id,1); //調(diào)用時(shí)間調(diào)調(diào)整
}
}
}
else
{
if (key_up==0) //增加
{
DelayMs();
if(key_up==0)
{
while(key_up==0)
{Show_word();} //調(diào)用顯示
h=0;msec=0; //清閃爍標(biāo)志
if(b!=0) //手動(dòng)調(diào)整顯示的內(nèi)容
{
if(f++==3) //f為顯示轉(zhuǎn)換標(biāo)志
f=0;
}
}
}
}
Show_word(); //待機(jī)顯示按三秒間隔分別顯示年、月日、星期、時(shí)分秒。
}
}
/************************************************/
void Show_word() //串行輸出顯示
{ uchar h;
for(h=0;h<16;h++)
{
if((id==0)&(f==0)|(id==1)) //f為三秒轉(zhuǎn)換顯示
{
Send_data(&timer[0][0]); //不顯示
if((Flicker==1)&(id==1)) //閃爍標(biāo)志為1時(shí)不亮,為零時(shí)亮
{ Show_pass(); //不顯示一個(gè)字
Show_pass();
}
else
{
Send_data(&timer[2][h]); //20年
Send_data(&timer[0][h]);
Send_data(&timer[Year/16][h]); //年值
Send_data(&timer[Year%16][h]);
}
Send_data(&hanzi[h*2+641]); //年字符
Send_data(&hanzi[h*2+640]);
Send_data(&timer[0]); //不顯示
}
if((id==0)&(f==1)|(id==2)|(id==3))
{
if((Flicker==1)&(id==2)) //閃爍標(biāo)志為1時(shí)不亮,為零時(shí)亮
{ Show_pass(); //不顯示一個(gè)字
}
else
{
if(Month/16<1)
Send_data(&timer[0]); //月十位為零時(shí)不顯示
else
Send_data(&timer[Month/16][h]); //月值
Send_data(&timer[Month%16][h]);
}
Send_data(&hanzi[h*2+673]); //月字符
Send_data(&hanzi[h*2+672]);
if((Flicker==1)&(id==3)) //閃爍標(biāo)志為1時(shí)不亮,為零時(shí)亮
{ Show_pass(); //不顯示一個(gè)字
}
else
{
Send_data(&timer[Day/16][h]); //日值
Send_data(&timer[Day%16][h]);
}
Send_data(&hanzi[h*2+961]); //日字符
Send_data(&hanzi[h*2+960]);
}
if((id==0)&(f==2)|(id==4)) //f為三秒轉(zhuǎn)換顯示
{
Send_data(&timer[0]); //不顯示
Send_data(&hanzi[h*2+705]); //星字符
Send_data(&hanzi[h*2+704]);
Send_data(&hanzi[h*2+737]); //期字符
Send_data(&hanzi[h*2+736]);
if((Flicker==1)&(id==4)) //閃爍標(biāo)志為1時(shí)不亮,為零時(shí)亮
{ Show_pass(); //不顯示一個(gè)字
}
else
{
Send_data(&hanzi[Week%16*32+h*2+737]); //星期值
Send_data(&hanzi[Week%16*32+h*2+736]);
}
Send_data(&timer[0][0]); //不顯示
}
if((id==0)&(f==3)|(id>4)) //f為三秒轉(zhuǎn)換顯示
{
if((Flicker==1)&(id==5)) //閃爍標(biāo)志為1時(shí)不亮,為零時(shí)亮
{
Show_pass(); //不顯示一個(gè)字
}
else
{
if(Hour/16<1)
Send_data(&timer[0][0]); //時(shí)十位小于1時(shí)不顯示
else
Send_data(&timer[Hour/16][h]); //時(shí)值
Send_data(&timer[Hour%16][h]);
}
Send_data(&timer[10][h]); //兩個(gè)點(diǎn)
if((Flicker==1)&(id==6)) //閃爍標(biāo)志為1時(shí)不亮,為零時(shí)亮
{
Show_pass(); //不顯示一個(gè)字
}
else
{
Send_data(&timer[Cent/16][h]);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -