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