📄 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 + -