基于定时器的时钟程序设计
矩阵键盘
逻辑很简单,共四行0 1 2 3,每次只开启单独一行,共四列,4 5 6 7对应按键
unsigned char Key_Read()
{
unsigned char temp = 0;
P3_0 = 0;P3_1 = 1;P3_2 = 1;P3_3 = 1;
if(P3_4 == 0) temp = 1;
if(P3_5 == 0) temp = 2;
if(P3_6 == 0) temp = 3;
if(P3_7 == 0) temp = 4;
P3_0 = 1;P3_1 = 0;P3_2 = 1;P3_3 = 1;
if(P3_4 == 0) temp = 5;
if(P3_5 == 0) temp = 6;
if(P3_6 == 0) temp = 7;
if(P3_7 == 0) temp = 8;
P3_0 = 1;P3_1 = 1;P3_2 = 0;P3_3 = 1;
if(P3_4 == 0) temp = 9;
if(P3_5 == 0) temp = 10;
if(P3_6 == 0) temp = 11;
if(P3_7 == 0) temp = 12;
P3_0 = 1;P3_1 = 1;P3_2 = 1;P3_3 = 0;
if(P3_4 == 0) temp = 13;
if(P3_5 == 0) temp = 14;
if(P3_6 == 0) temp = 15;
if(P3_7 == 0) temp = 16;
return temp;
}
时钟后缀点的实现
按位或的用法
0110 1001
| 1000 0000
------------
1110 1001
//按位或的用法 两个二进制比较,有1 0 = 1 , 1 1 = 1 ,0 0 = 0
通过**point[ ]**中0101的选择来控制那几位后面点亮
if(point)
P0 = Seg_Dula[dula] | 0x80;
else
P0 = Seg_Dula[dula];
三元运算符
int result = (condition) ? value1 : value2;
a = 1 ? 2 : 3 = 2
a = 0 ? 2 : 3 = 3
三元运算符的用法很有逻辑性
本项目闪烁部分利用三元运算符的逻辑来简化实
for(i=0;i<3;i++)//先让设置界面全显示不闪烁
{
Seg_Buf[2*i] = Clock_Set[i] / 10 % 10;
Seg_Buf[2*i + 1] = Clock_Set[i] % 10;
}
//利用从上至下的运行逻辑来完成覆盖进行闪烁
Seg_Buf[2*Clock_Set_Index] = Set_Flag ? Clock_Set[Clock_Set_Index] / 10 % 10 : 10;
Seg_Buf[2*Clock_Set_Index + 1] = Set_Flag ? Clock_Set[Clock_Set_Index] % 10 : 10;
从上至下的运行逻辑,再次覆盖方式来实现闪烁
任意键关闭闹钟
if(Key_Down)//或者(Key_Down != 0),Key_Down不按下时为0
Alarm_Enable_Flag = 0;//按任意键位关闹钟
指针Clock_Set_Index用法
unsigned char Clock_Set_Index;//闪烁用的指针 0-时 1-分 2-秒
if(Seg_Disp_Mode == 1)
{
if(++Clock_Set[Clock_Set_Index] == (Clock_Set_Index ? 60 : 24))//里面要加个括号
Clock_Set[Clock_Set_Index] = 0;
}
利用Clock_Set_Index为0是时和分秒不一样的特点来实现上下限的区分
闹钟响起前四个led和后四个led闪烁的逻辑实现
主体
if(Alarm_Flag == 1)
{
if(Clock_Disp[0] == Alarm[0] && Clock_Disp[1] == Alarm[1] && Clock_Disp[2] == Alarm[2])
Alarm_Enable_Flag = 1;
if(Alarm_Enable_Flag == 1)
{
P2_3 = 0;
P1 = Led_Shan;
}
else
{
P2_3 = 1;
P1 = 0xff;
}
}
else
{
P2_3 = 1;
P1 = 0xff;
}
关于Led_Shan在中段的运用
if(++Timer_500ms == 500)
{
Timer_500ms = 0;//总是忘记这个归零操作
Set_Flag ^= 1;
if(Clock_Disp[0] >= 12)
Led_Shan ^= 0xf0;
else
Led_Shan ^= 0x0f;
}
基于定时器的电子种(带闹钟功能)