基于定时器的时钟程序设计

基于定时器的时钟程序设计

矩阵键盘

逻辑很简单,共四行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;
	}

基于定时器的电子种(带闹钟功能)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值