?? rtc.c
字號:
}
/********************************************************************
函 數(shù) 名:ch451_write()
功 能:把12位的指令或數(shù)據(jù)寫入ch451
說 明:12位數(shù)據(jù)或指令的寫入順序是低位
調(diào) 用:
入口參數(shù):command
返 回 值:
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void ch451_write(unsigned int command)
{
unsigned char i;
#ifdef USE_KEY
EX1=0; /*禁止鍵盤中斷*/
#endif
ch451_load=0; /*命令開始*/
for(i=0;i<12;i++)
{ /*送入12位數(shù)據(jù),低位在前*/
ch451_din=command&1;
ch451_clk=0;
command>>=1;
ch451_clk=1; /*上升沿有效*/
}
ch451_load=1; /*加載數(shù)據(jù)*/
#ifdef USE_KEY
EX1=1;
#endif
}
/********************************************************************
函 數(shù) 名:ds1302主程序
功 能:讀取ds1302的時間值并通過數(shù)碼管進(jìn)行顯示
說 明:
調(diào) 用:
入口參數(shù):
返 回 值:
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void SET_RTC(void)
{
Get1302(&SClock); /*把當(dāng)前的時間值讀取到數(shù)組SClock[3]中去*/
SClock[0]|=0x80; /*使ds1302的時間停止運行*/
Set1302(SClock);
ch451_key = 0xff;
key_flag++;
if(key_flag==4)
{
key_flag = 0;
ch451_write(0x600);
SClock[0]&=0x7f;
Set1302(SClock);
}
switch(key_flag)
{
case 1:
ch451_write(0x6C0); /*讓秒顯示位進(jìn)行閃爍*/
break;
case 2:
ch451_write(0x618); /*讓分顯示位進(jìn)行閃爍*/
break;
case 3:
ch451_write(0x603); /*讓小時顯示位進(jìn)行閃爍*/
break;
default:break;
}
}
/********************************************************************
函 數(shù) 名:SET_TIME()
功 能:根據(jù)按鍵值&按鍵被按下的次數(shù)作相應(yīng)的處理
說 明:
調(diào) 用:
入口參數(shù):
返 回 值:
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void SET_TIME(void)
{
switch(key_flag)
{
case 1:
SClock[0]&=0x7f;
ch451_bcd(SClock[0]); /*將秒顯示位的十位和個位進(jìn)行分離*/
N++; /*秒值加一*/
if(N==10)
{
N = 0;
M++;
if(M==6)
{
M = 0;
}
}
M<<=4;
SClock[0] = M|N|0x80;
W1302(0x8e,0x00); /*控制命令,wp=0,可以進(jìn)行寫操作*/
W1302(0x80, SClock[0]); /*將修改過的秒值寫到ds1302中*/
ch451_key=0xff;
break;
case 2:
ch451_bcd(SClock[1]); /*將分顯示位的十位和個位進(jìn)行分離*/
N++; /*分值加一*/
if(N==10)
{
N = 0;
M++;
if(M==6)
{
M = 0;
}
}
M<<=4;
SClock[1] = M|N;
W1302(0x8e,0x00); /*控制命令,wp=0,可以進(jìn)行寫操作*/
W1302(0x82, SClock[1]); /*將修改過的分值寫到ds1302中*/
ch451_key=0xff;
break;
case 3:
ch451_bcd(SClock[2]); /*將小時顯示位的十位和個位進(jìn)行分離*/
N++; /*小時值加一*/
if(N==4)
{
if(M==2) /*小時十位為2時個位最大值不能超過3*/
{
M = 0;
N = 0;
}
}
if(N==10)
{
N = 0;
M++;
}
M<<=4;
SClock[2] = M|N;
W1302(0x8e,0x00); /*控制命令,wp=0,可以進(jìn)行寫操作*/
W1302(0x84,SClock[2]); /*將修改過的分值寫到ds1302中*/
ch451_key=0xff;
break;
default:break;
}
ch451_key = 0xff;
}
/********************************************************************
函 數(shù) 名:ch451中斷服務(wù)程序
功 能:獲取鍵值
說 明:
調(diào) 用:
入口參數(shù):
返 回 值:ch451_key
設(shè) 計:藍(lán)海微芯
***********************************************************************/
void ch451_inter() interrupt 2 using 1
{
unsigned char i; /*定義循環(huán)變量*/
unsigned char command,keycode; /*定義控制字寄存器,和中間變量定時器*/
command=0x07; /*讀取鍵值命令的高4位0111B*/
EX1 = 0;
ch451_load=0; /*命令開始*/
for(i=0;i<4;i++)
{
ch451_din=command&1; /*低位在前,高位在后*/
ch451_clk=0;
command>>=1; /*右移一位*/
ch451_clk=1; /*產(chǎn)生時鐘上升沿鎖通知CH451輸入位數(shù)據(jù)*/
}
ch451_load=1; /*產(chǎn)生加載上升沿通知CH451處理命令數(shù)據(jù)*/
keycode=0; /*清除keycode*/
for(i=0;i<7;i++)
{
keycode<<=1; /*數(shù)據(jù)作移一位,高位在前,低位在后*/
keycode|=ch451_dout; /*從高到低讀入451的數(shù)據(jù)*/
ch451_clk=0; /*產(chǎn)生時鐘下升沿通知CH451輸出下一位*/
ch451_clk=1;
}
ch451_key=keycode; /*保存上次的鍵值*/
EX1 = 1;
IE1=0; /*清中斷標(biāo)志*/
}
/********************************************************************
函 數(shù) 名:ds1302主程序
功 能:讀取ds1302的時間值并通過數(shù)碼管進(jìn)行顯示
說 明:
調(diào) 用:
設(shè) 計:藍(lán)海微芯
***********************************************************************/
main()
{
uchar WClock[3]={0x00,0x01,0x02};
uchar RClock[3];
uchar ds_hour;
uchar ds_min;
uchar ds_sec;
P1_3 = 1;
P1_5 = 1;
Set1302(WClock); /*對ds1302顯示的時間初值進(jìn)行設(shè)定*/
ch451_init(); /*對ch451進(jìn)行初始化*/
ch451_write(0x403); /*關(guān)看門狗開鍵盤顯示*/
ch451_write(0x580); /*以譯碼方式進(jìn)行顯示*/
ch451_write(CH451_DIG5|0x12); /*數(shù)碼管的第2位顯示"-"*/
ch451_write(CH451_DIG2|0x12); /*數(shù)碼管的第7位顯示"-"*/
ch451_key = 0xff;
key_flag = 0;
EA = 1;
EX1 =1;
while(1)
{
if(ch451_key==0x5A) /*判斷設(shè)置按鍵是否按下*/
{
SET_RTC();
}
if((key_flag!=0)&&(ch451_key==0x59))/*判斷修改時間鍵是否被按下*/
{
SET_TIME();
}
Get1302(&RClock); /*獲取當(dāng)前時間值*/
ds_sec = RClock[0]&0x7f; /*得到當(dāng)前時間秒值*/
ds_min = RClock[1]; /*得到當(dāng)前時間分值*/
ds_hour = RClock[2]; /*得到當(dāng)前時間小時值*/
ch451_bcd(ds_hour); /*對小時值進(jìn)行轉(zhuǎn)化*/
ch451_write(CH451_DIG0|M); /*寫小時高位*/
ch451_write(CH451_DIG1|N); /*寫小時低位*/
ch451_bcd(ds_min); /*對分鐘值進(jìn)行轉(zhuǎn)化*/
ch451_write(CH451_DIG3|M); /*寫分鐘高位*/
ch451_write(CH451_DIG4|N); /*寫分鐘低位*/
ch451_bcd(ds_sec); /*對秒值進(jìn)行轉(zhuǎn)化*/
ch451_write(CH451_DIG6|M); /*寫秒值高位*/
ch451_write(CH451_DIG7|N); /*寫秒值低位*/
}
}
/*********************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -