[整理]一键多功能按键识别.
按键扫描程序(4)

else if(key == D_key)
........//点亮B_LED,关闭A_LED和C_LED
else if(key == S_key)
key_time_1 = 0; // 第1次单击,不返回,到下个状态判断后面是否出现双击
key_m = key_state_1;
}
else
特别操作情况定义:
1。短按操作和长按操作间隔<0.5s,以及,长按操作和短按操作间隔<0.5s,均不产生双击事件
2。连续n次(n为奇数)短按操作,且间隔均<0.5s,产生(n-1)/2次双击事件+1次单击事件
3。连续n次(n为偶数)短按操作,且间隔均<0.5s,产生n/2次双击事件
题目:多功能按键设计。利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按。
============================================================================
用户基本操作定义:
1。短按操作:按键按下,按下时间<1s,属于一次短按操作
if (!key_press)
{
key_time = 0; //
key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。
4.3 键盘键值的识别与分析(下)

3.1.3 键值分析程序键值分析程序的任务是对键盘的操作做出识别并调用相应的功能程序模块完成预定的任务。
仪器系统键盘中的按键可分为单义键和多义键。
单义键即一键一义,CPU只需要根据键码执行相应的程序,主要适用于功能比较简单的仪器系统。
对于功能比较复杂的仪器系统,如果采用单义键,不仅增加费用,而且面板很难布置,此时宜采用多义键。
多义键即一键具有两个或两个以上的含义,需要进行键语分析,按照规定的键语语法,把由键序组合成的输入序列的含义译出后再执行相应的键盘处理程序。
1、单义键的键值分析程序设计单义键就是根据当前按键的键值,把控制程序转到相应处理程序的入口,而无须知道在此之前的按键情况。
其优点是简明直观,程序处理方便。
图3-12所示为单义键值分析程序流程图。
微处理器周而复始地扫描键盘,当有键按下时,首先判断是命令键还是数字键。
若是数字键,则把按键读数存入缓冲区备用;若为命令键,则根据键值查找键处理入口地址表,以获得按键处理子程序的入口地址,子程序执行完成后继续扫描键盘。
图3-12 单义键键值分析程序流程图2、多义键的键值分析程序设计(1)双义键的键值分析程序设计为了节省命令键的数量,经常采用双功能键,即双义键。
这时可以设置一个模式键,当模式键的键值分析为“0”和“1”时,按键具有不同的两种功能。
双义键键值分析程序流程图如图3-13所示。
图中,模式键用来把控制方向引向不同的键处理入口地址表,以区别按键的两种含义。
(2)多义键的键值分析程序设计在一键多义的情况下,一个完整的命令通常不是由一次按键操作完成,而是需要按两次以上的键才能完成,且这几个键的操作要遵守一定的顺序,称为按键序列。
在组成一个命令的按键序列中,除了取决于以前按了什么键,还取决于当前按了什么键。
因此,多义键的键盘管理程序,首先要判断一个按键序列(而不是一次按键)是否已构成一个合法命令,若已构成合法命令,则执行命令,否则等待新的按键键入。
图3-13 双义键键值分析程序流程图。
一键多功能按键识别技术

1.实验任务如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。
2.电路原理图图4.9.13.系统板上硬件连线(1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;(2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。
4.程序设计方法(1.设计思想由来在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。
(2.设计方法从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。
下面给出有关程序设计的框图。
5.程序框图图4.9.2 6.汇编源程序ID EQU 30HSP1 BIT P3.7L1 BIT P1.0L2 BIT P1.1L3 BIT P1.2L4 BIT P1.3ORG 0MOV ID,#00HSTART: JB K1,RELLCALL DELAY10MSJB K1,RELINC IDMOV A,IDCJNE A,#04,RELMOV ID,#00HREL: JNB K1,$MOV A,IDCJNE A,#00H,IS0CPL L1LCALL DELAYSJMP STARTIS0: CJNE A,#01H,IS1CPL L2LCALL DELAYSJMP STARTIS1: CJNE A,#02H,IS2CPL L3LCALL DELAYSJMP STARTIS2: CJNE A,#03H,IS3CPL L4LCALL DELAYSJMP STARTIS3: LJMP START DELAY10MS: MOV R6,#20LOOP1: MOV R7,#248DJNZ R7,$DJNZ R6,LOOP1RETDELAY: MOV R5,#20LOOP2: LCALL DELAY10MSDJNZ R5,LOOP2RETEND7.C语言源程序#include <AT89X51.H>unsigned char ID;void delay10ms(void){unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}void delay02s(void){unsigned char i;for(i=20;i>0;i--){delay10ms();}}void main(void){while(1){if(P3_7==0){delay10ms();if(P3_7==0){ID++;if(ID==4){ID=0;}while(P3_7==0); }}switch(ID){case 0:P1_0=~P1_0;delay02s();break;case 1:P1_1=~P1_1; delay02s(); break;case 2:P1_2=~P1_2; delay02s(); break;case 3:P1_3=~P1_3; delay02s(); break;}}。
AT89S51单片机实验系统的开发与应用

AT89S51单片机实验系统的开发与应用高玉萍【摘要】针对传统单片机实验系统依赖于仿真器调试,实验成本高且效率低,不适应现代科技的开发要求的问题,为改善单片机实验系统的性能,采用在系统编程(ISP)的方法,利用AT89S51芯片设计了一种单片机实验系统.实验表明系统结构简单,实用性强,达到了工科类高职生快速掌握单片机的基础知识的预期效果.%Aiming at the traditional experiment systems which depend on simulators, have high price and low efficiency,and do not adapt to the needs of modern scientific and technological development, an experiment system based on AT89S51 single chip was designed with the method of ISP to improve performance of experiment system. Tests show that the system features simple structure and practicality, and achieves ideal results that engineering students in vocational colleges master hasic the knowledge of single chip quickly.【期刊名称】《现代电子技术》【年(卷),期】2011(034)010【总页数】4页(P199-202)【关键词】AT89S51;实验系统;ISP;74LS164【作者】高玉萍【作者单位】阿克苏职业技术学院机电系,新疆阿克苏,843000【正文语种】中文【中图分类】TN911-34;TP311目前单片机应用已渗透到各个领域,单片机技术的发展也因此日新月异。
09 案例九 一键多功能按键识别技术

一键多功能按键识别技术1.实验任务如图1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。
2.电路原理图图13.系统板上硬件连线(1).把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;(2).把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。
4.程序设计方法(1).设计思想由来在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。
(2).设计方法从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。
下面给出有关程序设计的框图。
5.程序框图如图2所示。
图26.汇编源程序 ID EQU 30H SP1 BIT P3.7 L1 BIT P1.0 L2 BIT P1.1 L3 BITP1.2 L4 BIT P1.3 ORG 0MOV ID,#00HSTART: JB K1,REL LCALL DELAY10MS JB K1,REL INC ID MOV A,IDCJNE A,#04,REL MOV ID,#00H REL: JNB K1,$ MOV A,IDCJNE A,#00H,IS0 CPL L1LCALL DELAY SJMP STARTIS0: CJNE A,#01H,IS1 CPL L2LCALL DELAY SJMP STARTIS1: CJNE A,#02H,IS2 CPL L3LCALL DELAY SJMP STARTIS2: CJNE A,#03H,IS3 CPL L4LCALL DELAY SJMP STARTIS3: LJMP STARTDELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$DJNZ R6,LOOP1 RETDELAY: MOV R5,#20LOOP2: LCALL DELAY10MS DJNZ R5,LOOP2 RET END7. C语言源程序#include <AT89X51.H> unsigned char ID; void delay10ms(void) {unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }void delay02s(void) {unsigned char i; for(i=20;i>0;i--) {delay10ms(); } }void main(void) { while(1) { if(P3_7==0) {delay10ms(); if(P3_7==0) { ID++;if(ID==4) { ID=0; }while(P3_7==0); } }switch(ID) { case 0: P1_0=~P1_0; delay02s(); break; case 1:P1_1=~P1_1; delay02s(); break; case 2: P1_2=~P1_2; delay02s(); break; case 3: P1_3=~P1_3; delay02s(); break; } } }。
单片机应用技术项目教程教案全套教案.doc

3.完成P0口外接 上拉电阻的技能 训练
2
(开关 控制
LED循
环点 亮)
教学内容:
用P3.0作输入接开关SW, P1口作输出接8个LED,通过开关SW控制LED循环点亮。控制要求: 开关SW打开,LED循环点亮; 开关SW合上,LED停止循环点亮。能力目标:
1.能完成单片机的输入输出电路设 计与制作;
教学内容:
使用STC89C52单片机,P1口 引脚接8个LED的阴极,通过程序 按一定的规律向P1口的引脚输出 低电平和高电平,控制八只发光二 极管循环点亮。
能力目标:
1.能完成单片机的输入输出电路设 计与制作;
2.能应用C语言程序完成单片机输 入输出控制,实现对LED循环点亮 控制的设计、运行及调试。
2.具有决策能力, 能记录、收集、处 理、保存各类专业 技术的信息资料。
能 力 训 练 任 务
任务一:点亮一个LED
使用STC89C52单片机,P1.0引脚接发光二极管(LED)的阴极,通过C语言程序控制,从P1.0引脚输出低电平,使发光二极管点亮; 任务二:LED闪烁控制
P1.0引脚接发光二极管(LED)的阴极,通过程序控制,使P1.0引脚交 替输出高电平和低电平,使发光二极管闪烁。
任务二:多个数码管动态扫描显示
显示器由6个共阴极LED数码管构成,使用STC89C52单片机,P0口输出 显示段码,经由一片74LS245驱动输出给LED数码管,P1口输出位码(片选) 给LED数码管。通过动态扫描程序使6个数码管显示“123456”。
任务三:0-99计数显示
利用STC89C52单片机来制作一个0〜99计数器。要求使用一个手动计数 按钮,实现0〜99的计数,并且通过两个共阴数码管显示计数结果,数码管 显示采用静态显示方式。
第三章4键盘设计

矩阵式键盘电路
R1
R2
R3
R4
10k
10k
10k
10k
VCC
C3
10uF
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6
GND
R9
10k
C1 30pF X1
CRYSTAL
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6
U2
18 17 16 15 14 13 12 11
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
10 11 12 13 14 15 16 17
R10
10k
R11
10k
R12
10k
R13
10k
R14
10k
R15
10k
R16
10k
R17
10k
独立式键盘程序设计
#include <AT89X52.H> //包含AT89X52.H头文件
void delay10ms(void) // 10ms延时子程序
x=P0; //读键盘状态
x=~x; //键盘状态取反
}
delay10ms(); //延时10ms去抖动
x=P0;
//再次读键盘状态
x=~x;
//键盘状态取反
if(x==0) continue;//如果无键按下则认为是按键抖动,重新扫描键
盘
switch(x)
//根据键值点亮对应的发光二极管
{
case 0x01: P1=0xfe; break; //点亮第一个发光二极管
在闪烁,再按下按键的时候,接在P1.3 管脚上的发光 二极管D4在闪烁,再按下按键的时候,又轮到D1 在闪 烁了,如此轮流下去。
一键多功能按键识别技术

一键多功能按键识别技术1.实验任务如图所示,开关SP1接在RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此连番下去。
2.电路原理图图3.系统板上硬件连线(1.把“单片机系统”区域中的RD端口连接到“独立式键盘”区域中的SP1端口上;(2.把“单片机系统”区域中的-端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,连接到L1,连接到L2,连接到L3,连接到L4上。
4.程序设计方式(1.设计思想由来在咱们生活中,咱们很容易通过那个叫张三,那个叫李四,另外一个是王五;那是因为每一个人有不同的名子,咱们就专门快认出,一样,关于要通过一个按键来识别每种不同的功能,咱们给每一个不同的功能模块用不同的ID号标识,如此,每按下一次按键,ID的值是不相同的,因此单片机就很容易识别不同功能的身份了。
(2.设计方式从上面的要求咱们能够看出,L1到L4发光二极管在每一个时刻的闪烁的时刻是受开关SP1来操纵,咱们给L1到L4闪烁的时段概念出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,别离给出不同的ID号咱们就能够够完成上面的任务了。
下面给出有关程序设计的框图。
5.程序框图图6.汇编源程序ID EQU 30HSP1 BIT PL1 BIT PL2 BIT PL3 BIT PL4 BITORG 0MOV ID,#00HSTART: JB K1,REL LCALL DELAY10MSJB K1,RELINC IDMOV A,IDCJNE A,#04,RELMOV ID,#00HREL: JNB K1,$MOV A,IDCJNE A,#00H,IS0CPL L1LCALL DELAYSJMP STARTIS0: CJNE A,#01H,IS1 CPL L2LCALL DELAYSJMP STARTIS1: CJNE A,#02H,IS2 CPL L3LCALL DELAYSJMP STARTIS2: CJNE A,#03H,IS3 CPL L4LCALL DELAYSJMP STARTIS3: LJMP START DELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$DJNZ R6,LOOP1RETDELAY: MOV R5,#20 LOOP2: LCALL DELAY10MS DJNZ R5,LOOP2RETEND7. C语言源程序#include <> unsigned char ID; void delay10ms(void) {unsigned char i,j; for(i=20;i>0;i--)for(j=248;j>0;j--); }void delay02s(void) {unsigned char i;for(i=20;i>0;i--) {delay10ms();}}void main(void){ while(1){ if(P3_7==0) {delay10ms();if(P3_7==0){ID++;if(ID==4){ID=0;}while(P3_7==0);}}switch(ID){ case 0:P1_0=~P1_0;delay02s();break;case 1:P1_1=~P1_1;delay02s();break;case 2:P1_2=~P1_2;delay02s();break;case 3:P1_3=~P1_3; delay02s(); break;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一键多功能按键识别
1.实验任务
如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。
2.电路原理图
图4.9.1
3.系统板上硬件连线
(1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”
区域中的SP1端口上;
(2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,
P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到
L4上。
4.程序设计方法
(1.设计思想由来
在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。
(2.设计方法
从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。
下面给出有关程序设计的框图。
5.程序框图
图4.9.2
6.汇编源程序
ID EQU 30H
SP1 BIT P3.7
L1 BIT P1.0
L2 BIT P1.1
L3 BIT P1.2
L4 BIT P1.3
ORG 0
MOV ID,#00H
START: JB K1,REL LCALL DELAY10MS
JB K1,REL
INC ID
MOV A,ID
CJNE A,#04,REL
MOV ID,#00H
REL: JNB K1,$
MOV A,ID
CJNE A,#00H,IS0
CPL L1
LCALL DELAY
SJMP START
IS0: CJNE A,#01H,IS1 CPL L2
LCALL DELAY
SJMP START
IS1: CJNE A,#02H,IS2 CPL L3
LCALL DELAY
SJMP START
IS2: CJNE A,#03H,IS3 CPL L4
LCALL DELAY
SJMP START
IS3: LJMP START DELAY10MS: MOV R6,#20 LOOP1: MOV R7,#248 DJNZ R7,$
DJNZ R6,LOOP1
RET
DELAY: MOV R5,#20 LOOP2: LCALL DELAY10MS DJNZ R5,LOOP2
RET
END
7. C语言源程序
#include <AT89X51.H> unsigned char ID;
void delay10ms(void) {
unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }
void delay02s(void) {
unsigned char i;
for(i=20;i>0;i--) {delay10ms();
}
}
void main(void) { while(1)
{ if(P3_7==0) {delay10ms();
if(P3_7==0)
{
ID++;
if(ID==4)
{
ID=0;
}
while(P3_7==0);
}
}
switch(ID)
{ case 0:
P1_0=~P1_0;
delay02s();
break;
case 1:
P1_1=~P1_1;
delay02s();
break;
case 2:
P1_2=~P1_2;
delay02s();
break;
case 3:
P1_3=~P1_3;
delay02s();
break;
} } }。