📄 mainclockwws.c
字号:
}
}
/*********************************************************************
初始化函数:void initial()
功能:对端口定义和T1的控制器设置
*********************************************************************/
void initial()
{
T1CON=0x0f;
/////////////////////////////外接32K晶振,工作模式为计数器
TRISB=0x8f;
/////////////////////////////RB3为按键寻找位设置为输入口,RB7电平变化中断11001111
TRISC=0x00;
/////////////////////////////RC5连接LED显示闪烁功能脚.RC2连接蜂明器都为输出格式
TRISD=0X00;
////////////////////////////////////////////
//第一段数码管段选位RD5.共阳极,高电平显示///
//第二段数码管段选位RD4.共阳极,高电平显示///
//第三段数码管段选位RD3.共阳极,高电平显示///
//第四段数码管段选位RD3.共阳极,高电平显示///
////////////////////////////////////////////
PORTB=0X08;
/////////////////////////////键盘的行线送低电平,为寻键作准备RB3=1,当RB3=0则响应中断
PORTD=0X00;
/////////////////////////////关断每一段数码管显示
RC5=1;
}
/*******************************************************************
蜂鸣器函数void speaker(char x)和LED闪烁程序void twinkle(char x)
功能:提供蜂明器的响应函数和开机工作指示灯作用闪烁数次
*******************************************************************/
void speaker(char x)
{
for(k=0;k<x;k++) //执行响应次数x
{
RC2=1; //高电平响应,低电平关闭
DELAY1(); //长延时
RC2=0; //关闭蜂明器
DELAY1(); //长延时
}
}
void twinkle(char x)
{
for(k=0;k<x;k++) //执行闪烁次数x
{
RC5=0; //低电平闪烁,高电平关闭
DELAY1(); //长延时
RC5=1; //熄灭LED
DELAY1(); //长延时
}
}
/********************************************************************
检测闹钟时间与时钟是否相等程序 void checkclock()
功能: 检测闹钟时间是否已经到了
调用情况: 主程序循环调用
*********************************************************************/
void checkclock()
{
time=0; ///////////////主循环次数清零//次操作与本函数没有关系,为后面程序服务。清零计时值
if(wakeup1[3]==clock[3]&&wakeup1[2]==clock[2]&&wakeup1[1]==clock[1]&&wakeup1[0]==clock[0])
///////////////////////////////闹钟1数组与时间常数数组小时分钟数相等,等待响应
{speaker(1);}
///////////////////////////////当时钟时间与闹钟时间相等的时候.蜂明器响一声.持续一分钟
if(wakeup2[3]==clock[3]&&wakeup2[2]==clock[2]&&wakeup2[1]==clock[1]&&wakeup2[0]==clock[0])
///////////////////////////////闹钟2数组与时间常数数组小时分钟数相等,等待响应
{speaker(1);}
///////////////////////////////当时钟时间与闹钟时间相等的时候.蜂明器响一声.持续一分钟
}
/******************************************************************
时间更新函数:void clkcf()
功能:当时间到达一分钟时.主循程序调用一次.对时间数组clock[4]的更新
******************************************************************/
void clkcf()
{
clock[0]=clock[0]+1; //当分钟时间到加一
if(clock[0]==10) //当分钟时间到10时则分钟十位加一
{
clock[0]=0; //当分钟个位满十则清零
clock[1]=clock[1]+1; //当分钟时间到10时则分钟十位加一
if(clock[1]==6) //当分钟十位为6时则小时个位加一
{
clock[1]=0; //分钟十位清零
clock[2]=clock[2]+1; //当分钟十位为6时则小时个位加一
if(clock[2]==10) //当小时个位时间到10时则小时十位加一
{ clock[2]=0; //小时个位清零
clock[3]=clock[3]+1;} //小时十位加一
if(clock[3]==2&&clock[2]==4) //当时间加为24小时时清零
{ clock[2]=0; //小时个位清零
clock[3]=0;} //小时十位清零
}
}
}
/*********************************************************
数码管显示函数: void yw1641(char z) 第一段数码管显示函数
void yw1642(char z) 第二段数码管显示函数
void yw1643(char z) 第三段数码管显示函数
void yw1644(char z) 第四段数码管显示函数
功能:显示每一段数码管,以利于动态扫描显示
*********************************************************/
void yw1641(char z)
{
RD5=0;RD4=0;RD3=0;RD2=0; //显示前关闭每一段的显示
tab=led[z]; //取数码管显示段码,无小数点
for(k=0;k<8;k++) //164的8位移位循环
{ RD1=0; //164移位时钟至低
tab=tab<<1; //段码数据移位送入溢出位CARRY
RD0=CARRY; //164AB断口取溢出位CARRY
RD1=1; //164移位时钟至高,产生时钟
}
RD5=1; //打开显示段
}
void yw1642(char z)
{
RD5=0;RD4=0;RD3=0;RD2=0;
tab=led1[z]; //取数码管显示段码,无小数点
for(k=0;k<8;k++)
{ RD1=0;
tab=tab<<1;
RD0=CARRY;
RD1=1;
}
RD4=1; //打开显示段
}
void yw1643(char z)
{
RD5=0;RD4=0;RD3=0;RD2=0;
tab=led[z]; //取数码管显示段码,有小数点的显示
for(k=0;k<8;k++)
{ RD1=0;
tab=tab<<1;
RD0=CARRY;
RD1=1;
}
RD3=1; //打开显示段
}
void yw1644(char z)
{
RD5=0;RD4=0;RD3=0;RD2=0;
tab=led[z]; //取数码管显示段码,无小数点
for(k=0;k<8;k++)
{ RD1=0;
tab=tab<<1;
RD0=CARRY;
RD1=1;
}
RD2=1; //打开显示段
}
/***************************************************************
键盘服务程序: void keyscanw() 内部时间闹钟按键调整服务程序返回key值
void keyscan() 外部模式进入时间闹钟调整按键选择程序返回mode值
功能: 返回key值和mode值,选择调整时间闹钟和选择进入调整值
*****************************************************************/
void keyscanw() //内部时间闹钟按键调整服务程序返回key值
{
RD5=0;RD4=0;RD3=0;RD2=0;
tab=0xff; //先送入11111111关断数码管每一位,为按键程序服务.防止误判
for(k=0;k<8;k++)
{ RD1=0;
tab=tab<<1;
RD0=CARRY;
RD1=1;
}
tab=0x7f; //送入01111111,送入一位为0,即当有一个按键按下时即有反应
number=0;
for(k=0;k<8;k++)
{
RD1=0;
tab=tab<<1;
RD0=CARRY;
RD1=1;
number++;
DELAY3(); //每一位移位完成延时一定时间.有充分的低电平等待按键响应
if(RB3==0) //当有按键时进入
{ DELAY3(); //延时防止颤抖
if(RB3==0) //再次判断如果真有按键则进入
{
switch(number) //判断number的值当为某一位时有按键时响应
{ case 3: key=3; break;
case 4: key=2; break;
case 5: key=1; break;
case 8: key=4; break;
default: key=0; //如果没有则返回0
}
while(1)
{
if(RB3==1) break; //当按键弹起的时候则退出
}
}
}
}
}
void keyscan() //外部模式进入时间闹钟调整按键选择程序返回mode值
{
RD5=0;RD4=0;RD3=0;RD2=0;
tab=0xff; //先送入11111111关断数码管每一位,为按键程序服务.防止误判
for(k=0;k<8;k++)
{ RD1=0;
tab=tab<<1;
RD0=CARRY;
RD1=1;
}
tab=0x7f; //送入01111111,送入一位为0,即当有一个按键按下时即有反应
number=0;
for(k=0;k<8;k++)
{
RD1=0;
tab=tab<<1;
RD0=CARRY;
RD1=1;
number++; //判断b的值当为某一位时有按键时响应
DELAY3();
if(RB3==0)
{ DELAY3();
if(RB3==0)
{
switch(number)
{ case 3: mode=3; break;
case 4: mode=2; break;
case 5: mode=1; break;
case 8: mode=4; break;
default: mode=0;
}
while(1)
{
if(RB3==1) break;
}
}
}
}
}
/*************************************************************************
延时函数: void DELAY1() void DELAY2() void DELAY3()///////////////
/*功能: 延时函数.DELAY1()在蜂明器和闪烁程序中调用/////////////////////////
/* DELAY2()在循环显示中的显示段延时 ////////////////////////
/* DELAY3()在寻键中的位移判断调用//////////////////////////
/************************************************************************/
void DELAY1()
{
for(i=12000;i>0;i--);
}
void DELAY2()
{
for(i=635;i>0;i--);
}
void DELAY3()
{
for(i=135;i>0;i--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -