任务11 控制秒表的启停与清零
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned char scan(void)
//1 扫描键盘函数
{ unsigned
char i,j,tmp,keyval;//2 i:行号,j:列号,keyval:键值
keyval=0xff;
//3 键值赋初值:无键按下(0xff)
for(j=0;j<4;j++)
//4 从第列0列开始检查,直至4列查完
上图中,S0键未按下时,P0.0=1,S0按下后,P0.0=0。
3、独立式键盘接口
⑵键盘处理程序
开始
键盘处理需要注意的问题是,要 防止一次按键按下被多次解释执行(连 击键除外)。
系统中软硬件初始化 Keytreated=0
N
有键按下?
Y 延时10ms去抖动
பைடு நூலகம்
在main函数中处键盘流程如图所示
图中,keytreated为按键已处理 标志位,keytreated标志位与按键是 否按下控制按键解释的执行,防止一 次按键事件被多次解释处理。 流程图对应的程序代码如下:
1、循环结构中的break语句与continue语句
⑴break语句 break语句常用在循环结构的循环体中,用来结束循环,使程序跳转 至循环结构之后的语句上。while语句的循环程序的一般形式:
while(表达式1)
{ 语句块1; if(表达式2) 语句块2;
} 语句块3;
break;
表达式1 假 真
keyport=0xff;
//4 键盘控制口写1,准备读键盘输入
keyval=keyport;
//5 读按键输入
if(~keyval)
//6 判断是否有键按下,取反方便判断
{
if(down&&!keytreated)
//7 若10ms前键按下且键按下没处理
{ keyval=scan(); //8 扫描键盘,获取按键的键值
{ keyval=scan(); //14 扫描键盘,获取按键的位置(键值)
keyexplain(keyval);
//15 对按键进行解释处理
keytreated=1; //16 置键按下已处理标志,阻止按键被重复处理
}
//17 键按下处理结束
}}
//第2次、第1次检测到有键按下处理结束
else
keytreated=0;
}
//16 行线检查结束
keyval=i*4+j;
//17 根据键的行、列号确定键值
break;
//18 跳出循环
}
//19 if语句结束
}
//20 for循环体结束
return keyval;
//21 返回键值。大于251的键值无效
}
//22 函数体结束
任务实施: 1、搭建硬件电路
电路图如下:
VCC U1 STC89C51
} 语句块3;
continue;
表达式1 假 真
语句块1 表达式2 真
假 语句块2
语句块3
continue流程图
1、循环结构中的break语句与continue语句
【例】统计1~100之间能被7整除的数的个数。
void main(void)
{
unsigned char i,j;
j=0;
for(i=1;i<=100;i++)
3、独立式键盘接口
重置计数初值:10ms
N 有键按下?
Y
N
10ms前键按下过?
(down=1?)
Y
N
键没处理?
(keytreated=0)
置键未按下标志 (down=0)
Y 确定按键的位置 (确定按键键值)
按键功能解释
置键未处理标志 (keytreated=0)
置键已处理标志:keytreated=1
keyexplain(keyval);
//9 解释按键的功能
keytreated=1; //10 置按键已处理标志
}
//11
down=1;
//12 置键按下标志
}
//13 有键按下处理结束
else
//14 无键按下时,进行15~17处理
{
down=0;
//15 置键没按下标志
keytreated=0;
//2 定义按键已处理标志位
void
main(void)
//3 main函数
{ unsigned
char
keyval; //4 keyval:按键的键值
//系统中软硬件初始化
5
keytreated=0;
//6 键按下未处理
while(1)
//7 死循环,循环体为语句8~语句21
{
keyport=0ff;
⑵矩阵式键盘的处理程序 矩阵式键盘的处理流程与独立式键盘的框架结构一样,仅仅只是判断 是否有键按下、确定按键的位置的方法不同而已。
1)判断是否有键按下 判断矩阵式键盘是否有键按下的方法是,列线输出全0后读行线输入, 若行线输入为全1,则无键按下,否则有键按下。
判断是否有键按下的程序段:
P1=0x00;
按下 抖动
稳定按下期
释放 抖动
2、键盘处理的流程
去抖动的方法:硬件去抖动和软件去抖动 硬件去抖动:采用R-S触发器组成的闩锁电路来去抖动。 软件去抖动:采取延时的方法来回避抖动期。具体方法是,检测到有 键按下或者有键释放后,延时5ms~15ms左右的时间,再去读按键输 入情况,此时抖动期已过,所读的按键输入是按键稳定按下或释放状 态。
3、独立式键盘接口
在定时中断服务函数中进行键盘处理 在main函数中处理键盘的主要缺陷是,程序中采用了10ms软件延时 去抖动,增加了CPU的负担,不利于采用CPU睡眠技术抗干扰。 键盘处理可以放在10ms定时中断服务函数中,利用定时时差延时去 抖动。采用这种方式处理键盘,需要用一个全局位变量down来标识10ms 前按键是否按下过。 在10ms定时中断服函数中处理按键的流程图如下:
2、键盘处理的流程
软件去抖动的方法
开始 N 有键按下?
Y 延时10ms N 有键按下?
Y 确定按键的位置(确定按健的键值)
按键功能解释
结束
3、独立式键盘接口
⑴接口电路
VCC STC89C51
P10
S0
P11
S1
P12
S2
P13
S3
电路的特点
按键的一端接地,另一端接并 行口的某一根I/O口线,I/O口线 外接上拉电阻。若并行口内部 有上拉电阻(如单片机的P1口), 可不接上拉电阻。采用这种电 路时,若某个键按下,则对应 的I/O口线输入为0。 左图中,S0键未按下时, P0.0=1,S0按下后,P0.0=0。
P2=0xff;
tmp=P2;
if(~tmp)
{
//有键按下处理 }
else
{
//无键按下处理 }
//列线输出全0 //P2口写1,准备读P2口 //读P2口的行线输入 //判断行线的输入是否为全1 //非全1,则为有键按下
//为全1,则无键按下
4、矩阵式键盘接口
2)确定按键的位置 确定按键位置的方法是,列线逐列输出低电平,然后检查行线输入, 若行线输入为全1,则继续下一列输出。若第j列输出0时,行输入不为全1, 则查输入为0的行线号。
Q1 18 Q2 17 Q3 16 Q4 15 Q5 14 Q6 13 Q7 12 Q8 11
C2 30P
18 XTAL2
Y
C3
30P
19
11.0592MHz
XTAL1
U3A 7407 P21 22 1 2 P20 21
34
U3B 7407
U4
7a 6b 4c 2d 1e 9f 10 g 5 dp
置键按下未处理标志 (keytreated=0)
有键按下?
N
Y
按键未处理?
N
(Keytreated=0)
Y
确定键按下的位置 (确定键值)
按键功能解释
置键按下已处理标志 (keytreated=1)
系统中其他功能处理
#defined keyport P1
//1 P1为键盘控制口
bit
keytreated;
{ switch(tmp)
//10 查是哪一根行线为0
{ case 1: i=0;break;
case 2: i=1;break;
case 4: i=2;break;
4、矩阵式键盘接口
2)确定按键的位置
case 8: i=3;break;
default: i=63;break;
//15 若为其他值,则行号设为无效值。
{ P1=~(0x01<<j);
//5 j列输出低电平,其他列输出高电平
P2=0xff;
//6 P2口写1,准备读P2口(准备读行输入)
tmp=P2;tmp=~tmp; //7 读行输入,并按位取反,方便程序处理
tmp=tmp&0x0f;
//8 高4位(无效位)清0
if(tmp)
//9 j列有键按下(tmp是否非0)。
置键按下标志:down=1 10ms定时中断中其他事务处理
3、独立式键盘接口
在T0定时中断服务函数中处理键盘的程序:
void
tim0() interrupt 1
using 1
//1 T0定时中断服务函数
{ unsigned
char
keyval; //2 定义局部变量keyval
//重置T0的计数初值(10ms) 3
//20 第1次检测到无键按下,置键按下未处理标志
//系统中其他处理
21
}
//22 死循环的循环体结束
}
//23 main函数结束
3、独立式键盘接口
【说明】 ①本程序为键盘处理通用结构,也适合于后面介绍的矩阵式键盘处
理。不同的键盘其获取键值和按键功能解释不同,在实际使用中需要根 据具体情况作适当变换。
//8 键输入口写1,准备读按键输入
if(~keyport)
//9 有键按下吗?
{ delay();
//10 延时10ms去抖动
keyport=0ff;
//11 键输入口写1,准备读按键输入
if(~keyport)
//12 有键按下吗?
{
if(!keytreated)
//13 键按下未处理吗,是则进行以下处理
语句块1 表达式2 真
假 语句块2
语句块3
break流程图
1、循环结构中的break语句与continue语句
⑵continue语句
continue语句只能用在循环结构的循 环体中,用来结束本次循环,使程序跳转 到循环条件判断处。while语句的循环程序 的一般形式如下
while(表达式1)
{ 语句块1; if(表达式2) 语句块2;
//16 置键没处理标志
}
//17 无键按下处理结束
//10ms定时中断中的其他功能处理 18
}
//19 中断服务函数结束
4、矩阵式键盘接口
⑴矩阵式键盘的接口电路
由P2.0~P2.3、P1.0~P1.3口线与外部16个按键构成的矩阵式键盘 电路如下图。
P2.0
S0 S1 S2 S3
P2.1 P2.2
②在独立式键盘中,按键的输入值中包含了按键的键值信息,即按 键的输入值实际上就是按键的编码值。输入值的某位为0,则表示对应 的按键按下。对于图5-15的电路,若P0口输入值为11111010B,则是S0、 S2键按下。程序中可以不单独使用scan函数获取键值。
③在独立式键盘中,常用switch/case语句实现依键值进行按键功能 解释。
U2 74HC541
R2 R3 R4
S0
3×10K 10 P30
S1
11 P31
S0
12 P32
VCC
C1 10μF 9 RST
R1 8.2K
P10 1 P11 2 P12 3 P13 4 P14 5 P15 6 P16 7 P17 8
VCC EA 31
2 D1 3 D2 4 D3 5 D4 6 D5 7 D6 8 D7 9 D8 1 E1 19 E2
行 S4 线 S8
S5 S6 S7 S9 S10 S11
P2.3 S12 S13 S14 S15
P1.0
P1.1
列 线
P1.2
P1.3
VCC
矩阵式键盘采用行列电路 结构,行线为输入口(图中 P2口),外接有上拉电阻, 列线为输出口,按键位于 行线与列线的交叉处,一 端接行线,另一端接列线。
4、矩阵式键盘接口
新世纪高职高专电子信息类课程规划教材
书号:978-7-5611-8470-7
主编:李文华
大连理工大学出版社
控制秒表的启停与清零
大连理工大学出版社
任务要求
在任务10的基础上增加S0、S1、S2三个按键。S0键作启动键, 按S0键,启动秒表走时,秒表在当前显示秒数的基础上计时。例如, 当前数码管显示的是05,按S0键后,秒表在5秒的基础上计时,依次 显示06,07,……。S1键为停止键,按S1键,秒表停止走时,显示 时间一直保持不变。S2键为清0键,按S2键,秒表停止走时,显示数 值为0。上电时,秒表停止计时,数码管显示0秒。
{
if(i%7!=0)
j++;
}
}
continue;
2、键盘处理的流程
单片机系统中所用的键盘有独立式键盘和矩阵式键盘两种。键盘接口 的基本任务主要有4个方面:⑴判断是否有键按下;⑵去抖动;⑶确定所 按下键的键值,即确定是何键按下;⑷对按键功能进行解释。
在一次按键操作中,由于按键的机械特性的原因,键按下或释放都 有一个弹跳的抖动过程,抖动的时间一般为5~15ms,其波形如下: