(2.9.1)-1-8按键模块开发_第1页
(2.9.1)-1-8按键模块开发_第2页
(2.9.1)-1-8按键模块开发_第3页
(2.9.1)-1-8按键模块开发_第4页
(2.9.1)-1-8按键模块开发_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

按键模块开发按键模块开发1.认识开关与按键2.明确开关器件参数3.设计按键电路4.了解按键类别及识别原理5.结构体、共用体和位段结构6.指针7.设计按键程序1.认识开关与按键

开关或者按键可以通过人为控制处于闭合或者断开状态1.认识开关与按键

通过电路设计可以使得相应位置电位为高或者低电平1.认识开关与按键

大多数控制电路都会采用开关或者按键,用以切换电路的工作状态、获取用户的控制信息1.认识开关与按键

自锁开关(self-lockingswitch)在开关按钮第一次按时,开关接通并保持按下状态,在开关按钮第二次按时,开关断开,同时开关按钮弹起1.认识开关与按键

拨动开关(toggleswitch)通过拨动开关柄使电路接通或断开,从而达到切换电路的目的1.认识开关与按键点动开关(按键、轻触开关)(tactswitch)使用时以按下按键开关功能闭合接通,当撤销压力时开关即断开1.认识开关与按键机械力通过传动元件将力作用于动作簧片上,当动作簧片位移到临界点时产生瞬时动作,使动作簧片末端的动触点与定触点快速接通或断开。1.认识开关与按键

船型开关(rockerswitch)船型开关也称翘板开关。其结构与拨动开关相同,只是把钮柄换成船型。1.认识开关与按键也叫DIP开关、拨动开关、超频开关、地址开关、拨拉开关、数码开关、指拨开关,是一款用来操作控制的地址开关,采用的是0/1的二进制编码原理。2.明确开关器件参数额定电压、电流:开关接通时所允许通过的最大安全电压、电流绝缘电阻:开关的导体部分与绝缘部分的电阻值,绝缘电阻值应在100MΩ以上接触电阻:开关在开通状态下,每对触点之间的电阻值,一般要求在0.1-0.5Ω以下,此值越小越好耐压:额定绝缘电压,超过该值器件将击穿损坏寿命:是指开关在正常工作条件下,能操作的次数操作力和行程2.明确开关器件参数3.设计按键电路直读键电路工作原理分析由若干个开关直接与控制芯片I/O口相连,读I/O口电平状态和消抖处理即可识别出相应的按键是否被按下。通常采用上拉电阻接法,开关一端接低电平,另一端接控制芯片I/O口线通过上拉电阻与VCC相连,如果控制芯片内部已经有上拉电阻,则外电路的上拉电阻可以省去。有内部上拉没有内部上拉3.设计按键电路矩阵式按键电路工作原理分析键盘由行线和列线组成,行线列分别连入芯片引脚,按键位于行、列线的交叉点逐行扫描,轮流给行线输出低电平来对矩阵键盘进行扫描,当列线接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下有内部上拉没有内部上拉4.了解按键类别及识别原理击键类型类型说明应用领域单键单次短击(短击、单击)用户快速按下单个按键,然后立即释放。基本类型,应用非常广泛,大多数地方都有用到。单键单次长击(长击)用户按下按键并延时一定时间再释放。1.用于按键的复用。2.某些隐藏功能。3.某些重要功能单键连续按下(连击、连按)用户按下按键不放,此时系统要按一定的时间间隔连续响应。用于调节参数,达到连加或连减的效果(如“UP”和“DOWN”键)。单键连按多次(双击、多击)相当于在一定的时间间隔内两次或多次单击。1.用于按键的复用。2.某些隐藏功能。无键按下(无键、无击)当用户在一定时间内未执行任何按键时需要执行某些特殊功能1.用于按键的复用。2.自动进入待机或睡眠模式。5.结构体、共用体和位段结构结构体类型能将具有内在联系的不同类型的数据组合在一起,形成用户自定义的数据类型struct是结构类型关键字定义结束后的分号不能少struct

结构类型名{

//成员列表;数据类型成员1;数据类型成员2;...数据类型成员n;};

结构体5.结构体、共用体和位段结构//结构体定义structDate{//结构体成员intYear;intMonth;intDay;};

//结构体变量定义structDateToday;//结构体成员赋值Today.Year=2021;Today.Month=7;Today.Day=25;struct

结构类型名{

//成员列表;数据类型成员1;数据类型成员2;...数据类型成员n;};

struct结构类型结构体变量名;

结构体变量名.成员变量=表达式;

结构体5.结构体、共用体和位段结构//结构体定义structDate{//结构体成员intYear;intMonth;intDay;};

//结构体变量定义structDateToday;//结构体成员赋值Today.Year=2021;Today.Month=7;Today.Day=25;struct结构类型结构体变量名;

结构体变量名.成员变量=表达式;

struct

结构类型名{

//成员列表;数据类型成员1;数据类型成员2;...数据类型成员n;};

结构体5.结构体、共用体和位段结构共用体union是共用体类型关键字定义结束后的分号不能少union共用体类型名{

//成员列表;数据类型成员1;数据类型成员2;...数据类型成员n;};

共同体的定义类似结构体,不过所有成员都在同一段内存中存放,起始地址一样,同一时刻只能使用其中的一个成员变量,使用覆盖技术,几个变量相互覆盖,从而使几个不同变量共占同一段内存的结构5.结构体、共用体和位段结构//共用体类型定义unionHuman{charAge;//字符型成员intNumber;//整型成员};//共用体变量定义unionHumanWang;//共用体成员赋值Wang.Age=2;Wang.Number=0x4756;

union共用体类型名{

//成员列表;数据类型成员1;数据类型成员2;...数据类型成员n;};

union共用体类型名

共用体变量名;

共用体变量名.成员变量=表达式;

共用体Number字节1

Age字节2

5.结构体、共用体和位段结构//结构体定义structDate{//结构体成员

intYear;intMonth;intDay;}; //定义一个共用体类型unionHuman{charAge;//字符型成员intNumber;//整型成员};voidmain(){/****初始化区****///定义结构体变量structDateToday;//定义共用体变量unionHumanWang;

//共用体成员赋值Wang.Age=2; Wang.Number=0x4756; //结构体成员赋值Today.Year=2021;Today.Month=7;Today.Day=25;/******主循环*******/while(1){

}}5.结构体、共用体和位段结构位段结构定义struct[位段结构原型名]{

整型说明符

[位段名]:位宽;[整型说明符[位段名]:位宽;]}标识符[={初始值,初始值,…}];struct{unsigedcharrmtkey:1;//遥控标记unsigedchar:1;//无名段位unsigedcharbeep:1;//蜂鸣标记unsigedcharscankey:1;//按键扫描标记unsigedcharsecflg:1;//秒标记unsigedchar:3;//无名段位}TimeFlg={0,0,0,0,0};TimeFlg.beep=1;调用6.指针指针变量的定义:数据类型*指针变量名;表示该变量的类型为指针型变量unsignedchar*a;//a存放的是内存地址unsignedcharCnt=0;*a=Cnt;//a就是Cnt的地址变量地址变量的指针一种特殊类型的变量用于存放地址指针变量什么是指针6.指针&:取地址运算符。可以获取某个变量的地址*

:指针运算符,获取某个指针变量所值向的变量的值假设已执行pointer_1=&a;1)&*pointer_1含义是什么?

2)*&a的含义是什么?3)(*pointer_1)++相当于a++吗?4)*pointer_1++相当于a++吗?指针运算符6.指针&:取地址运算符。可以获取某个变量的地址*

:指针运算符,获取某个指针变量所值向的变量的值假设已执行pointer_1=&a;1)&*pointer_1含义是什么?&*pointer_1与&a相同,即变量a的地址。2)*&a的含义是什么?先进行&a运算,得a的地址,再进行*运算。*&a、*pointer_1及变量a等价3)(*pointer_1)++相当于a++吗?*pointer_1就是a因此二者等价4)*pointer_1++相当于a++吗?二者不等价,等价于*(pointer_1++),运算后pointer_1的值加1,pointer_1不再指向a指针运算符6.指针指针做函数参数voidmax(unsignedchara,unsignedcharb){unsignedchart;if(a>b){t=a;a=b;b=t;}}调用时,使用语句:x=5;y=4;max(x,y);x=5y=46.指针指针做函数参数voidmax(unsignedchar*a,unsignedchar*b){unsignedchar*t;if(*a>*b){

*t=*a;

*a=*b;

*b=*t;}}voidmax(unsignedchara,unsignedcharb){unsignedchart;if(a>b){t=a;a=b;b=t;}}调用时,使用语句:x=5;y=4;max(x,y);调用时:x=5;y=4;max(&x,&y);x=5y=4x=4y=56.指针数组指针unsignedchara[10];a为指向数组的指针a也是第一个数组元素的地址a[3]相当于*(a+3)数组的指针是指数组的起始地址数组元素的指针是数组元素的地址引用数组元素可以用下标法,也可以用指针法通过指向数组元素的指针找到所需的元素使用指针法能使目标程序质量高占内存少、运行速度快7.设计按键程序按键过程7.设计按键程序多次读键法:在单片机获得端口为低电平的信息后,在一段时间内如20毫秒,多次检测按键的状态,只有当每次读到的状态都是低电平时才认为有按键按下。用这种方法,不会存在误判的情况。有一点必须注意,多次检测持续的时间应该比闭合抖动的时间长。7.设计按键程序消抖:按键端口发生变化时,连续多次读取端口状态均发生,才确认按键生效多读取端口状态,做消抖处理,按键状态发生变化才做按键的处理直读键7.设计按键程序直读键案例:按下S1显示键码1,按下S2显示键码2,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码//设置P34P35为输入脚常量定义#defineP3_INIT0x30//P34P35数据寄存器必须设置1才是输入脚#defineP3M1_INIT0x00#defineP3M0_INIT0x00//P3设置为0x00和0x30均可//初始化函数P3=P3_INIT; P3M1=P3M1_INIT;P3M0=P3M0_INIT; 7.设计按键程序直读键案例:按下S1显示键码1,按下S2显示键码2,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码//按键变量定义unsignedcharKey_Buffer=1;//按键缓冲变量unsignedcharKey_Effect=1;//有效按键变量unsignedcharKey_Cnt=0;

//按键消抖变量unsignedcharKey_Code=0; //键码struct{unsignedchardsp_flg:1;//显示标记unsignedcharread_key:1;//按键标记unsignedchar:1;unsignedchar:1;unsignedchar:1;unsignedchar:3;}TimeFlg={0};TimeFlg.read_key=1;7.设计按键程序直读键案例:按下S1显示键码1,按下S2显示键码2,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码voidReadKey(void) //读键函数{Key_Buffer=P3&0x30;//读端口状态if(Key_Buffer==Key_Effect)//按键不放不处理{Key_Cnt=0;}else{Key_Cnt++;if(Key_Cnt==5)//读键5次消抖{Key_Cnt=0;Key_Effect=Key_Buffer;//送有效键值,后续处理KeyOpt();//有效键处理}}}voidKeyOpt(void) //按键处理函数{ switch(Key_Effect)

{

case0x30:

Key_Code=0;

break;

//没有按下按键

case0x20:

Key_Code=1;

break;//按下按键S1

case0x10:

Key_Code=2;

break;//按下按键S2

}}7.设计按键程序直读键案例:按下S1显示键码1,按下S2显示键码2,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码if(TimeFlg.read_key==1)//2ms扫描按键{TimeFlg.read_key=0;ReadKey();}//显示函数voidDsp_LED(){ Dsp_Table[2]=Dsp_Seg[16]; //不显示Dsp_Table[1]=Dsp_Seg[16]; //不显示Dsp_Table[0]=Dsp_Seg[Key_Code];//显示键码}7.设计按键程序直读键案例:按下S1显示键码1,按下S2显示键码2,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码7.设计按键程序01需要在中断处按键行线片选切换,为了提高读键的准确性,扫描频率须为毫秒级,选中行线输出低电平、其它行线输出高电平02在主程序中按照片选读取按键端口状态03当所有端口状态读取完毕,再进行有效按键确认和处理矩阵键7.设计按键程序矩阵键案例:按下按键后分别显示键码1、2、3、4,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志和切换片4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码//设置P34P35为输入脚 P32P33为输出脚#defineP3_INIT0x3C#defineP3M1_INIT0x00#defineP3M0_INIT0x3C

P3=P3_INIT; P3M1=P3M1_INIT;P3M0=P3M0_INIT;

7.设计按键程序矩阵键案例:按下按键后分别显示键码1、2、3、4,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志和切换片选4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码//按键变量定义//按键片选端口表unsignedcharconstKey_Scan_Table[2]={0xFB,0xF7};unsignedcharKey_Buffer=1;//按键缓冲变量unsignedcharKey_Effect=1;//有效按键变量unsignedcharKey_Cnt=0;

//按键消抖变量unsignedcharKey_Code=0;

//键码unsignedcharScan_Key=0;

//按键片选变量struct{unsignedchardsp_flg:1;//显示标记unsignedcharread_key:1;//按键标记unsignedchar:1;unsignedchar:1;unsignedchar:1;unsignedchar:3;}TimeFlg={0};

TimeFlg.read_key=1;

Scan_Key++;if(Scan_Key>=2)Scan_Key=0;P3=P3|0x0C;P3=P3&Key_Scan_Table[Scan_Key];7.设计按键程序矩阵键案例:按下按键后分别显示键码1、2、3、4,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志和切换片4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码voidReadKey(void) //读键函数{if(Scan_Key==0)Key_Buffer=(P3&0x30)>>4;//读端口状态else{Key_Buffer=Key_Buffer|((P3&0x30)>>2);//读端口状态

if(Key_Buffer==Key_Effect)Key_Cnt=0;

else{

Key_Cnt++;

if(Key_Cnt==5)//读键5次消抖{

Key_Cnt=0;

Key_Effect=Key_Buffer;//送有效键值,后续处理

KeyOpt();//有效键处理}}

}}voidKeyOpt(void) //按键处理函数{ switch(Key_Effect)

{

case0x0F:

Key_Code=0;break;//没有按下按键

case0x0E:

Key_Code=1;

break;

//按下按键S1

case0x0D:

Key_Code=2;break;

//按下按键S2

case0x0B:

Key_Code=3;break;//按下按键S3

case0x07:

Key_Code=4;break;

//按下按键S4

}

}7.设计按键程序矩阵键案例:按下按键后分别显示键码1、2、3、4,没有按键时显示01按键参数初始化2定义变量和按键标志位段3每2ms设置按键标志和切换片4依照流程图,定义、声明读键和处理按键函数5主函数调用读键函数6修改显示函数显示按键码

if(TimeFlg.read_key==1)//2ms扫描按键{

TimeFlg.read_key=0;

ReadKey();}//显示函数voidDsp_LED(){ Dsp_Table[2]=Dsp_Seg[16];//不显示 Dsp_Table[1]=Dsp_Seg[16];//不显示 Dsp_Table[0]=Dsp_Seg[Key_Code];//显示键码}7.设计按键程序代码优化1定义键码查询表Key_Code_Table2在读键程序中只需依据有效按键变量Key_Effect查询该表,确认Key_Effect是表中的第几个元素即可确认键码3按键处理程序根据键码执行不同功能unsignedcharconstKey_Code_Table[5]={0x0F,0x0E,0x0D,0x0B,0x07};//键码查询表表中第N个元素为键码为N时有效按键变量值voidReadKey(void) //读键函数{unsignedchari;if(Scan_Key==0)Key_Buffer=(P3&0x30)>>4;//读端口状态else{Key_Buffer=Key_Buffer|((P3&0x30)>>2);//读端口状态

if(Key_Buffer==Key_Effect)

Key_Cnt=0;

//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论