独立键盘:
键盘:
v键盘分编码键盘(如PS2的键盘)和非编码键盘。
v键盘上按键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等。
v而靠软件编程来识别的称为非编码键盘;
v 在单片机组成的各种系统中,用的最多的是非编码键盘。非编码键盘又分为:独立式非编码键盘和行列式非编码键盘。
独立键盘:
符合线与概念:开关闭合之后,IO为低电平(一条线上,一端为0,另一端也为0)
线或:有一端为高组态,完全看另一端的表现。
防抖动:
硬件消抖:CPU太过繁忙
软件消抖:延时函数
如何检测键盘是否按下:
给IO口置为1,时刻检测IO,如果IO为0,说明按下。
举例:
利用key1控制数码管的数字变化:
#include #define uchar unsigned char #define uint unsigned int sbit key1=P3^2;//key1按键 sbit led0=P0^0; unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78}; //************************************************ //延时函数,在12MHz的晶振频率下 //大约50us的延时 //大约50ms的延时 //************************************************ void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } void delay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } void main() { uchar num; P3=0xff; while(1) { if(key1==0) { delay_50us(200); if(key1==0) { num++; led0=0;//led灯的反馈 亮 if(num==10) num=0; while(!key1); } delay_50us(200); while(!key1);//等待松手进入下一次循环 } else led0=1;//led灯的反馈 灭 P1=smg_du[num];//松手变数 } } 矩阵键盘: 如果开发的系统要用到很多的按键,为了节省I/O口,我们一般使用4*4键盘。 这样用一个8位的I/O口就可以驱动16个键盘。 原理图: 0-3:行线 4-7:列线 扫描按键的方法: 初始化P3= 1111 0000 k = P3 读取P3状态 k&1111 0000(获取高四位)(获得列位置) k= k|00001111(高四位+低四位全为1) P3 = k(可以获得行位置,线与) k2 = P3(获取状态) k2 = k2&00001111(屏蔽高四位)k = k&11110000(屏蔽低四位) a = k+k1(获取位置) switch语句判断 实例: #include #define uchar unsigned char #define uint unsigned int unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //************************************************ //延时函数,在12MHz的晶振频率下 //大约50us的延时 //************************************************ void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } //************************************************ //延时函数,在12MHz的晶振频率下 //大约50ms的延时 //************************************************ void delay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } void main() { uchar key_l,key_h; uchar key; while(1) { P3=0xf0; key_l=P3; key_l=key_l&0xf0; if(key_l!=0xf0) { delay_50us(100); if(key_l!=0xf0) { key_l=P3&0xf0; //11100000 key_l=key_l|0x0f;//11101111 P3=key_l; key_h=P3; key_h=key_h&0x0f;//00001110 key_l=key_l&0xf0;//11100000 key=key_h+key_l; //11101110 } } switch (key) { case 0xee:P1=smg_du[0];break; case 0xde:P1=smg_du[1];break; case 0xbe:P1=smg_du[2];break; case 0x7e:P1=smg_du[3];break; case 0xed:P1=smg_du[4];break; case 0xdd:P1=smg_du[5];break; case 0xbd:P1=smg_du[6];break; case 0x7d:P1=smg_du[7];break; case 0xeb:P1=smg_du[8];break; case 0xdb:P1=smg_du[9];break; case 0xbb:P1=smg_du[10];break; case 0x7b:P1=smg_du[11];break; case 0xe7:P1=smg_du[12];break; case 0xd7:P1=smg_du[13];break; case 0xb7:P1=smg_du[14];break; case 0x77:P1=smg_du[15];break; } } }
上一篇:51单片机定时器设置方式_51单片机定时器/计数器
下一篇:【C51入门笔记】IIC总线+E2PROM芯片(24C02)
推荐阅读最新更新时间:2024-11-13 10:25
推荐帖子
- CC1101只能发送一次数据
- 我使用CC1101+STM8,两个模块能够实现通信,但是只能收发一次,必须要复位一下接收端才能再收一次,无法连续接收数据,接收成功时,发送端收到ACKOK,之后就是ACKerror,为什么接收端只能收一次数据,怎么解决这个问题,求助大神解答CC1101只能发送一次数据检查程序吧,典型的程序错。 有没有遇到同样的问题?一般会是程序哪里出错 自己检查吧,没有“一般”之说,错误人人不同。默认情况下,接收端接收一次数据后就会进入空闲模式
- 书小叶 无线连接
- 基于单片机的汽车组合电子仪表
- 仪表是人和汽车的交互界面,为驾驶员提供所需的汽车运行参数、故障、里程等信息,是每一辆汽车必不可少的部件。仪表显示的直观与美观使得驾驶不但是代步之必需,也成为舒适生活的一部分,而参数传递的准确与可靠性则直接关系到汽车行驶的安全。现代仪表最突出的特点是功能的模块化,通常要组装一块仪表,只需将几个功能模块在定制PCB的基础上联合起来,就可以得到一个完整的系统。长安等经济型汽车的指针仪表一般为独立的模块,提示/报警功能由PCB上的小灯泡完成。SANTANA系列的指针由印刷电路板上的十字线圈驱动,
- frozenviolet 汽车电子
- 世界著名汽车品牌标识演化历史------雷诺
- 雷诺Renault雷诺的名字来自于他的创始人法国人路易斯·雷诺(LouisRenault)。路易斯·雷诺打造出自己的第一辆汽车的时候,只有21岁,那是1898年。这辆车诞生在父母家的后院,使用的是德席琳迪翁发动机(DeDion-engine),排量只有273毫升。随后,他和他的两个兄弟费尔南多(Fernand)、马塞尔(Marcel)一起成立了雷诺汽车公司,公司在塞纳河边的布伦城Billancourt,并很快就接到了订单。第一次世界大战期间,
- 1ying 汽车电子
- CC2530和STM32F103之间的串口通信问题
- 最近在写Zigbee网关通信程序,需要用到CC2530和STM32F103ZET6之间的串口通信。两者的串口配置都是一样的,CC2530之间可以进行通讯,STM32之间也可以进行通讯;STM32发CC2530收也可以正常通讯,但是CC2530发、STM32收就不能正常通讯,请问这是怎么回事?求大神指点,谢谢!我用万用表测了两者串口引脚的电平,STM32的TX端配置为推挽输出(电平为3.3V),RX端为浮空输入(电平为0.15V);CC2530串口0的两个引脚均为3.3V。是不
- fgh_asd RF/无线
- EEWORLD大学堂----直播回放: 大大通助你解锁新一代 ADAS 技术
- hi5 综合技术交流
- 51单片机能控制的TFT触摸屏
- 51单片机能控制的TFT触摸屏直接上一段源码大家看看,希望大家多多支持啊/************************************************TFT6448BS-5.7显示武汉谷鑫为您添光增彩www.mcutech.cn*************************************************/sfrAUXR=0x8e;//////////////////////////////////注意增加该语句。#in
- gxkj001 51单片机
设计资源 培训 开发板 精华推荐
- ICE3Axx65ELJ CoolSET-F3 锁存器抖动版设计指南
- STEVAL-STRKT01,LoRa 物联网跟踪器评估套件
- 立创鸿蒙智能开关
- AD8315ACP-EVALZ,用于 AD8315 50dB GSM PA 控制器的评估板
- NCP606 500mA、低 IGND、CMOS LDO 稳压器的典型应用,带/不带使能和可调版本的增强型 ESD 保护 (Vout = 1.25 V)
- 使用 Diodes Incorporated 的 PT8A 3519C 的参考设计
- 基于L7983PU50R稳压器的5.0V/0.3A降压DC / DC转换器(VIN = 5至60 V)
- 三款功放板 迷你贴片芯片
- 4455C-868-PDK,用于 Si4455 868-MHz 射频收发器的 EZRadio 双向链路开发套件
- [6电+2光]8口百兆交换机RTL8309N