?? 6416+1302電子鐘.c
字號:
{
Send_data(&timer[Cent/16][h]);
Send_data(&timer[Cent%16][h]); //分值
}
Send_data(&timer[10][h]); //兩個點
if((Flicker==1)&(id==7)) //閃爍標(biāo)志為1時不亮,為零時亮
{
Show_pass(); //不顯示一個字
}
else
{
Send_data(&timer[Sec/16][h]); //秒
Send_data(&timer[Sec%16][h]);
}
}
if(id>7) //id大于7時為對顯示轉(zhuǎn)換模式設(shè)置
{ if((Flicker==1)&(id==8))
{ Show_pass();
Show_pass();
Show_pass();
Show_pass();
}
else if(b==0)
{
Send_data(&hanzi[h*2+993]); //顯示漢字 “自”
Send_data(&hanzi[h*2+992]);
Send_data(&hanzi[h*2+1057]); //顯示漢字“動”
Send_data(&hanzi[h*2+1056]);
Send_data(&hanzi[h*2+1089]); //顯示漢字“?!? Send_data(&hanzi[h*2+1088]);
Send_data(&hanzi[h*2+1121]); //顯示漢字“式”
Send_data(&hanzi[h*2+1120]);
}
else
{
Send_data(&hanzi[h*2+1025]); //顯示漢字“手”
Send_data(&hanzi[h*2+1024]);
Send_data(&hanzi[h*2+1057]); //顯示漢字“動”
Send_data(&hanzi[h*2+1056]);
Send_data(&hanzi[h*2+1089]); //顯示漢字“模”
Send_data(&hanzi[h*2+1088]);
Send_data(&hanzi[h*2+1121]); //顯示漢字“式”
Send_data(&hanzi[h*2+1120]);
}
if(id==9)
{
if(b==1) //手動模式
{
id=0;f=0;
}
else
{
Send_data(&hanzi[h*2+993]); //顯示漢字“自”
Send_data(&hanzi[h*2+992]);
Send_data(&hanzi[h*2+1057]); //顯示漢字“動”
Send_data(&hanzi[h*2+1056]);
if(Flicker==1)
{
Show_pass();
}
else
{
Send_data(&timer[a/16][h]); //轉(zhuǎn)換時間
Send_data(&timer[a%16][h]);
}
Send_data(&hanzi[h*2+1153]); //顯示漢字“秒”
Send_data(&hanzi[h*2+1152]);
}
}
}
P2_4=1; //關(guān)閉顯示
DelayMs();
P2_7=1; //鎖存為高,595鎖存信號
P2=sw[h]; //輸出行信號
DelayMs(); //延時,等待一段時間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
}
}
void timer_1(void) interrupt 1 //中斷入口,閃爍
{
TH0=0x3C; //25ms定時 晶振24M
TL0=0xB0;
if(msec++==40) //1000ms
{ msec=0;
x++;
if(x>=a)
{ x=0;
if(b==0) //自動模式
{if(f++==3)
f=0; //f顯示轉(zhuǎn)換計數(shù)器 ,d為用戶設(shè)置的自動轉(zhuǎn)換時間的值。
}
}
if(h++==4) //5秒后進(jìn)入正常走時。
{id=0;h=0;}
}
if(msec<20)
Flicker=0; //閃爍標(biāo)志反轉(zhuǎn)
else
Flicker=1;
}
/***********************輸出一個字的不顯示數(shù)據(jù)。*****************/
void Show_pass()
{
Send_data(&timer[0][0]); //不顯示
Send_data(&timer[0][0]); //不顯示
}
/**********************************************************/
void in_data(void) //調(diào)整數(shù)據(jù)
{
char s;
for(s=4;s>=0;s--) //i為向后先擇字節(jié)計數(shù)器,zimuoo為向后先字計數(shù)器
{
BUFF[2*s+1]=hanzi[zimuo+32*s+2*line]; //把第一個字模的第一個字節(jié)放入BUFF0中,第二個字模和第一個字節(jié)放入BUFF2中
BUFF[2*s]=hanzi[zimuo+1+32*s+2*line]; //把第一個字模的第二個字節(jié)放入BUFF1中,第二個字模的第二個字節(jié)放入BUFF3中
}
}
/***********************發(fā)送移動的數(shù)據(jù)****************************/
void rxd_data(void) //串行發(fā)送數(shù)據(jù)
{
uchar s;
uchar inc,tempyid,temp;
if(Move<8)
inc=0;
else
inc=1;
for(s=0+inc;s<8+inc;s++) //發(fā)送8字節(jié)數(shù)據(jù)
{
if(Move<8)
tempyid=Move;
else
tempyid=Move-8;
temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數(shù)據(jù)。
SBUF=temp; //把BUFF中的字節(jié)從大到小移位相或后發(fā)送輸出。
while(TI==0); //等待發(fā)送完畢
TI=0;
}
}
/*******************************************************/
void Send_data(unsigned char *d) /*從串口發(fā)送數(shù)據(jù)*/
{
SBUF=*d;
while(TI==0); //等待發(fā)送完畢
TI=0;
}
//根據(jù)選擇調(diào)整相應(yīng)項目
void Set(uchar sel,uchar sel_1)
{
uchar address,time;
uchar max,min;
if(sel==9) {address=0xc2; max=20;min=1;} //自動轉(zhuǎn)換時間時最大為20秒。
if(sel==8) {address=0xc0; max=1;min=0;} //顯示自動轉(zhuǎn)換或手動轉(zhuǎn)換。為零自動,為1手動。
if(sel==7) {address=0x80; max=0;min=0;} //秒
if(sel==6) {address=0x82; max=59;min=0;} //分鐘
if(sel==5) {address=0x84; max=23;min=0;} //小時
if(sel==4) {address=0x8a; max=7; min=1;} //星期
if(sel==3) {address=0x86; max=31;min=1;} //日
if(sel==2) {address=0x88; max=12;min=1;} //月
if(sel==1) {address=0x8c; max=99;min=0;} //年
time=R1302(address+1)/16*10+R1302(address+1)%16;
if (sel_1==0) time++; else time--;
if(time>max) time=min;
if(time<min) time=max;
W1302(0x8e,0x00);
W1302(address,time/10*16+time%10);
W1302(0x8e,0x80);
}
/**************************延時***********************/
void DelayMs(void)
{
uchar TempCyc;
for(TempCyc=100;TempCyc>1;TempCyc--)
{;}
}
//********DS1302讀寫程序***************//
/********************************************************************
函 數(shù) 名:RTInputByte()
功 能:實時時鐘寫入一字節(jié)
說 明:往DS1302寫入1Byte數(shù)據(jù) (內(nèi)部函數(shù))
入口參數(shù):d 寫入的數(shù)據(jù)
返 回 值:無
***********************************************************************/
void RTInputByte(uchar d)
{
uchar h;
ACC = d;
for(h=8; h>0; h--)
{
T_IO = ACC0; /*相當(dāng)于匯編中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 數(shù) 名:RTOutputByte()
功 能:實時時鐘讀取一字節(jié)
說 明:從DS1302讀取1Byte數(shù)據(jù) (內(nèi)部函數(shù))
入口參數(shù):無
返 回 值:ACC
設(shè) 計:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar RTOutputByte(void)
{
uchar h;
for(h=8; h>0; h--)
{
ACC = ACC >>1; /*相當(dāng)于匯編中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 數(shù) 名:W1302()
功 能:往DS1302寫入數(shù)據(jù)
說 明:先寫地址,后寫命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)
返 回 值:無
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 寫1Byte數(shù)據(jù)*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 數(shù) 名:R1302()
功 能:讀取DS1302某地址的數(shù)據(jù)
說 明:先寫地址,后讀命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址
返 回 值:ucData :讀取的數(shù)據(jù)
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 讀1Byte數(shù)據(jù) */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 數(shù) 名:Set1302()
功 能:設(shè)置初始時間
說 明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
調(diào) 用:W1302()
入口參數(shù):pClock: 設(shè)置時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年
7Byte (BCD碼)1B 1B 1B 1B 1B 1B 1B
返 回 值:無
***********************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -