} }
while (1) { readkey();
display(); // 显示扫描,执行时间12ms time[2] = 00; time[1] = 00; time[0] = 00; // 时间初值00:00:00 time_to_disbuffer(); if(KEY==1) {
if (++time_counter >= 40) {
time_counter = 0; point_on = ~point_on; if (++time[0] >= 60) {
time[0] = 0;
if (++time[1] >= 60) {
time[1] = 0;
if (++time[2] >= 24) time[2] = 0; } }
time_to_disbuffer();
} }
else if(readkey()==2) time_to_disbuffer();
delay_ms(13); // 延时13ms,可进行其它处理 }; }
(2)在按键的处理过程中,除了要进行消抖处理,还要判别按键的释放,如果不进行按键释放的判别,将会发生什么现象?
由于按键是机械结构,人手在按键的时候,由于抖动和按键触点的原因会产生多个上升沿和下降沿,导致单片机误认为按键受到了多次操作。因此要进行消抖处理和检测按键释放。
如果没有消抖处理,按键一次会响应多次。如果没有按键释放,单片机误认为已经完成一次按键操作便进行下一次,只要按键未放开就会一直当做有按键事件进行处理,因此也会响应多次。
32
七、遇到的问题及解决方法
1、一开始按键时示数并不是加一或者减一,纳闷为什么会这样,就检查源程序是不是出错了,后来就想起学数电时设计模拟电路时都要进行消抖处理,于是反应过来,程序中也要加入消抖处理的程序。
八、心得体会
通过实验,学习了对按键的查询读取方式,实现了显示的修改功能:按键控制数码管显示0 — 9,每按一次按键KEY1,数码管显示的数值加1;每按一次按键KEY2,数码管显示的数值减1。根据电路图,完成实物连接。
编写代码时要注意考虑按键消抖,软件方式消抖的基本原理是在软件中对按键进行两次测试确认,既在第一次检测到按键按下后,间隔10ms左右再次检测该按键是否按下,只有在两次都测到按键按下时才最终确认有键按下,从而消除了抖动的影响。除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放以后,才能确定为一次完整的按键动作完成。
33
34
——INT1)
四、实验步骤
二、实验内容
一、实验目的
新建项目实现实验内容
实验六 外部中断实验
(1)了解中断的作用。
三、实验所用仪表及设备
硬件连接如图6-2所示。
(2)了解ATMega16中断系统和中断源。
硬件:PC机一台、AVR_StudyV1.1实验板
(4)掌握CodeVision AVR中断程序的编写。
(3)掌握ATMega16的外部中断的使用方法。
软件:CodeVision AVR集成开发软件、SLISP下载软件
值加1;每按一次按键KEY2,数码管显示的数值减1。(KEY1——INT0;KEY2
(2)外部中断唤醒CPU实验,使用外部中断0唤醒掉电模式下的CPU。
(1)按键控制数码管显示0 — 9,每按一次按键KEY1,数码管显示的数
35
图6-2
建议使用CodeVision AVR中的程序生成向导功能(CodeWizardAVR)来
帮助你建立中断程序的框架,图6-3为CVAVR中利用程序生成向导功能配置产生外部中断初始化部分的界面。
图6-3
外部中断初始化部分:使能INT0和INT1,都是下降沿产生中断。 // External Interrupt(s) initialization // INT0: On
// INT0 Mode: Falling Edge // INT1: On
// INT1 Mode: Falling Edge // INT2: Off GICR|=0xC0; MCUCR=0x0A; MCUCSR=0x00; GIFR=0xC0;
INT0中断服务函数:
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) {
// Place your code here if(++count > 9) count = 0; }
INT1中断服务函数:
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void) {
36