我用51单片机做了一个时钟,我想添加一个使用键盘调时的功能,请问该怎么实现呢?

我用51单片机做了一个时钟,我想添加一个使用键盘调时的功能,请问该怎么实现呢?,第1张

最简单的是两个PIO引脚,直接做成键盘的按键,可先不做消抖程序.可以用外中断0和1来做键盘的输入引脚.

完成硬件的连接后,用仿真器打断点,看键盘按下后,能否进入中断地址,通常是低电平有效作为键盘按下后的标志,平时信号线是高电平,某些机型需要外接上拉10K电阻到VCC

键盘能进入中断入口后,写中断服务程序,用一个寄存器作为状态标志,比如寄存器R3,上电时钟工作后,将R3置零,表示正常工作状态,

主程序中用switch语句或类似的思想,判断R3的值,以便程序进入不同的状态.

中断处理程序中,比如用外中断0作为模式键,外中断1作为调整键.在INT0的中断入口写程序,让状态标志R3加一后结束中断处理程序

主函数中每当判断状态标志R3的值为1时,离开正常工作状态,进入小时调整状态,

中断处理程序INT1的代码,先判断主机处于什么状态,若是正常工作状态,就忽略按键,直接结束中断处理程序.若是R3标志处于1,即小时调整状态,就将小时的值取出,加一,再写回去.

同理可假设R3的值为2,是分钟调整状态,主程序仍然停止计时,中断处理程序INT1仍然将分钟加一

其他的你自己可以想出来了

你这个思路不对,

中断是每到一定时间进一次中断程序的吧,你想光靠中断实现那么长时间,是不行的。。

还有,既然是中断了,你不用等他的到来,时间到了,它自然就近了中断程序了。

先要好好研究研究中断是怎么个流程,中断后怎么处理,等等。。。。

sbit key_st=P3^6

void main (void)

{

u8 flagqt=0x5a

u16 tcnt=0

while(tcnt<3000)

    {

    tcnt++

    delay(1)

    if(key_st!=0)tcnt=0

    }

i = 0

aa = 0

//fang1 = 1

IO_Init()

tomd ()

tcnt=0

while(1)

{

key_i ()

EC ()

}

if(key_st==0)

    {

    tcnt++

    delay(1)

    if(tcnt>=3000) ((void(code *)(void))0x0000)()

    }

    else tcnt=0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/bake/11893960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存