① 单片机中的键盘模块是什么
单片机中的键盘模块是什么,就是矩阵键盘比如下图的4*4= 16个按键,用单片机低4位IO口驱动4行,高4位IO口驱动4列,比如你会问为啥要用矩阵键盘,很简单比如你写一个计算器程序,需要数字0-9,加、减、乘、除、等于,很多运算符的时候,需要用到矩阵键盘,如果不用矩阵键盘,像我们平常设计按键那样,一个IO口控制一个按键,按键多了就会占用单片机IO口资源,这样单片机的IO就不够用了,希望我的回答对你有帮助!
② 如何用单片机模拟键盘控制电脑
接口协议原理
PS/2键盘接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制键盘的发送。方法是把时钟线一直拉低,键盘就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由键盘产生,即主机不产生通信时钟信号。
如果主机要发送数据,它必须控制键盘产生时钟信号。方法如下:主机首先下拉时钟线至少100μs抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时序控制键盘产生时钟信号。当键盘检测到这个时序状态,会在10ms内产生时钟信号。如图3中 A 时序段。主机和键盘之间,传输数据帧的时序如图2、图3所示。2.2 数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收键盘数据。但该方案有一点不足,由于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。
/*-----------------------------------------------
ps2鼠标的基本原理应用
说明:此程序使用标准PS2键盘输入。此样例仅作测试使用
晶振使用12M或者11.0592M,本键盘使用部分字母和数字测试,其他按键不能使用,用
户可以自行扩展。由于开发板和程序的各种参数,程序中没有使用奇偶校验,不保证没有
误码,校验程序请自行添加。
-------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit Key_Data = P3^3 ; //定义Keyboard引脚
sbit Key_CLK = P3^2; //使用中断
bit BF=0;
bit Shift; //定义上档键标志
bit Key_UP; //定义通码断码标志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;
/*-----------------------------------------------
外部中断读入信息
-----------------------------------------------*/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data)
KeyV = KeyV | 0x80; //当键盘数据线为1时到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高
if (IntNum > 10)
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完了
EA = 0; //关中断等显示完后再开中断
}
}
/*-----------------------------------------------
解码信息
注意:如SHIFT+G为12H 34H F0H 34H F0H 12H
也就是说shift的通码+G的通码+shift的断码+G的断码
-----------------------------------------------*/
void Decode(unsigned char ScanCode) //
{
unsigned char TempCyc,Val;
if (!Key_UP) //当键盘按下时
{
switch (ScanCode)
{
case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
Key_UP = 1;
break;
case 0x12 : // 左 SHIFT
Shift = 1;
break;
case 0x59 : // 右 SHIFT
Shift = 1;
break;
default:
if(!Shift) //如果SHIFT没按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (UnShifted[TempCyc][0] == ScanCode)
{
Val= UnShifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重头写数据
}
}
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
if (Shifted[TempCyc][0] == ScanCode)
{
Val= Shifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重头写数据
}
}
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;
case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
BF = 0; //标识字符处理完了
}
/*-----------------------------------------------
ps2初始化(实际初始化外部中断)
-----------------------------------------------*/
void PS2_Init(void)
{
IT1 = 0; //设外部中断1为低电平触发
EA = 1; //外部中断开
EX0 = 1; //开中断
}
/*-----------------------------------------------
读取键盘值
-----------------------------------------------*/
void Read_KeyBoard(void)
{
if (BF)
Decode(KeyV);
else
EA = 1; //开中断
}
③ 如何进行单片机键盘电路的设计
其实比较好写的..
行是,P3.0-P3.3,例是,P3.4-P3.7,最后得到的键值存在,KEYS中数为,0-15,
有什么问题可以再问...
START:
MOV P1,#00H
MOV P2,#0FH
CLR KEYCARD
LOOP:
ACALL KEY_CHECK
JNB KEYCARD,LOOP ;为0从重新扫描
ACALL KEY_MARK ;为1有按键,调用KEY_MARK
AJMP LOOP
KEY_CHECK: ;键盘扫描
MOV P3,#0FH
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_C1
CLR KEYCARD
RET
KEY_C1:
ACALL DELAY ;有键接下,消抖
SETB KEYCARD
RET
KEY_MARK:
MOV A,#0EFH ;第一例,行扫描,
KEY_M1: ;键值扫描
MOV P3,A
MOV KEYS,A
MOV A,P3
ANL A,#0FH ;取与
CJNE A,#0FH,KEY_M2 ;在第一例则跳,KEY_M2
MOV A,KEYS ;并非在第一例刚移位
SETB C
RLC A
JC KEY_M1 ;C=1,重新扫描..
CLR KEYCARD ;扫完一圈后,完成..
RET
KEY_M2: ;键值计算
MOV R0,#KEYS ;将KEYS的地址装入R0
XCH A,@R0 ;交换KEYS,A
XCHD A,@R0 ;交换低4位..
MOV KEYS,A
MOV R0,#0
LCALL KEY_ZHI
KEY_MX: ;等待按键释放
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_MX
CLR KEYCARD
RET
KEY_ZHI:
MOV A,R0
INC R0
MOV DPTR,#KEY_VALUE
MOVC A,@A+DPTR
CJNE A,KEYS,KEY_ZHI ;查找键值.
DEC R0
MOV KEYS,R0
MOV P1,KEYS ;KEYS中的数为:0-15
RET
DELAY:
MOV R7,#20 ;延时大约2ms
D1: MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
KEY_VALUE: DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH,0EBH,0DBH,0BBH,07BH,07EH,07DH,077H
END
④ 51单片机键盘电路的两种方式,各自的优缺点
独立按键优点:可以直接读取,检测占用时间较少,不受其他因素影响
缺点:占用IO口资源较多,每一个按键都独占一个IO口。
矩阵键盘优点:占用IO口资源较少。
缺点:必须扫描检测按键情况,程序复杂,占用时间较多。
⑤ 单片机与键盘的连接方法有 和 两种
这里拿独立按键来说吧,其它是相通的,我见过并用过的有三种连接方式。
1 按键一端接单片机IO,另一端接GND. 当你按下按键不松时,IO口就为低电平。松开时,IO悬空
2 按键一端接单 片机IO,不过同时也要有个上拉电阻接VCC ,另一端仍然接GND.这样的话,你按下键时,IO口为低电平,而松开的时候,IO被拉为高电平。
3 按键一端接IO,另一端串个电阻接到VCC. 当按下键时,IO为高电平,松开IO悬空
⑥ 单片机的键盘接口连接分为哪几类说明各自的工作原理。键盘消抖是什么有哪几种方法
一般而言,单片机与键盘接口有3种方式:1、静态接口方式;2、动态矩阵扫描方式;3、采用键盘管理芯片方式;第一种方式最简单,主要用于按键不多的情况,每个按键占用一条口线,第二种方式多用于按键较多的情况,比如用一个8位口就可以实现4x4键盘扫描,这种方式的优点是节省口线,缺点是占用了较多的MCU资源,第三种方式是把管理键盘的任务交给了专用芯片,效率较高适用于按键多MCU处理任务重的应用场合。
键盘消抖顾名思义就是要消除键盘按下或抬起瞬间由于触点抖动引起的不确定状态,主要有软件和硬件消抖两种方法,软件消抖就是监测到有键按下时并不立即响应,而是延时一段时间后再次判键把不确定状态躲过去,硬件消抖是通过RS触发器或施密特触发器将键盘与单片机接口隔离,使得单片机读取的是经过硬件滤波后的确定状态。