设计与开发

单片机 模拟键盘 单片机模拟PS2键盘实现(1)

小编 2024-11-25 设计与开发 23 0

单片机模拟PS2键盘实现(1)

很多控制项目中会用到小型的工控机,有时还需要用到键盘的部分功能。如果配一个全功能的键盘有些浪费资源,空间也不允许,这时,我们可以用单片机来实现模拟出键盘的部分功能。

小型工控机

常用的键盘有两种接口,PS/2和USB,今天先介绍一下PS/2接口的相关情况。

首先先要弄清楚PS/2的传输协议,然后用单片机管脚直接模拟它的时序就可以了。

从设备发送时序

这是从设备键盘的发送时序,可以看到,每个数据由11个bit组成,1个起始位(0),8个数据位,1个校验位(奇校验)和一个结束位(1);时钟频率控制在10-20K之间,下降沿有效。

从设备接收时序

这是主设备的发送,从设备的接收时序,时序基本和上面的一致,但是要注意,当主设备发送数据时,从设备就不能发送数据。只有当时钟线为高电平时,也就是主设备没有动作,这时从设备才可以发送数据。

熟悉单片机编程的朋友大都了解IIC吧?乍一看,PS/2协议是不是跟IIC很像呢?所以编程也就简单多了。了解时序之后,我们还要知道键盘上字符所对应的"通码"和"断码",按照码表传输对应的字符就可以了。下面就是部分字符的码表:

部分字符码表

如果我们想要给电脑发送一个"G",那么,就先发通码"0x33",再发断码"0xF0"和"0x33"就可以了。

好了,理论的东西先讲到这里,下次,我们结合代码,详细的分析PS/2键盘的实现。

教你玩单片机之矩阵键盘(附程序)

以下所有内容,仅适合新手,大神请绕道。

原理图解析:

组成结构:

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵键盘扫描原理

方法一:

逐行扫描: 我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。

方法二:

行列扫描: 我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。

51单片机矩阵键盘实验程序:

使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3

#include<reg51.h>

#define GPIO_DIG P0

#define GPIO_KEY P1

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4; // 138译码器接入端

unsigned char code DIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsigned char KeyValue;

//用来存放读取到的键值

void Delay10ms(); //延时10ms

void KeyDown(); //检测按键函数

void main(void)

{

LSA=0; //给一个数码管提供位选

LSB=0;

LSC=0;

while(1)

{

KeyDown();

GPIO_DIG=DIG_CODE[KeyValue];

}

}

void KeyDown(void)

{

char a=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!=0x0f)//读取按键是否按下

{

Delay10ms();//延时10ms进行消抖

if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

{

//测试列

GPIO_KEY=0X0F;

switch(GPIO_KEY)

{

case(0X07):KeyValue=0;break;

case(0X0b):KeyValue=1;break;

case(0X0d): KeyValue=2;break;

case(0X0e):KeyValue=3;break;

}

//测试行

GPIO_KEY=0XF0;

switch(GPIO_KEY)

{

case(0X70):KeyValue=KeyValue;break;

case(0Xb0):KeyValue=KeyValue+4;break;

case(0Xd0): KeyValue=KeyValue+8;break;

case(0Xe0):KeyValue=KeyValue+12;break;

}

while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测

{

Delay10ms();

a++;

}

}

}

}

void Delay10ms(void) //误差 0us

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

相关问答

单片机 4*4按键扫描看不懂第3句key_l=P1& 0xf0;//11100000key_...

[最佳回答]key_l=P1&0xf0;//读出高四位,行,检测某行有按键key_l=key_l|0x0f;//把高四位的数据或上0x0fP1=key_l;//把P1口置成输出口(除了有按键的那一...

单片机 的程序中,为什么按键要去抖动?

人手在按下按键的时候,由于抖动和按键触点的原因会产生多个上升沿和下降沿,导致单片机误认为按键受到了多次操作,所以要进行去抖处理,软件的处理方法一般是加...

51 单片机 矩阵 键盘 如何实现两个键同时按下的时候显示其他数字,用c语言程序实现?

定义一个按键缓冲区用普通的按键扫描程序,当扫描到有按键按下的时候。按键键的值写入缓冲区。继续扫描直到完成。然后返回缓冲区地址就可以得到多个按键的数...

请问 单片机 怎么用独立按键按一下实现一个功能,按另一个按键实现另一个功能,这个代码要怎么写啊?

如果这两个功能都是一个死循环,可以考虑用中断,这样就不必在两个独立的功能中插入按键检测了while(1){while(flag==1){死循环1}while(flag==2){死循环2}}....

单片机 按键功能实现原理?

单片机按键功能的实现原理是通过将按键连接到单片机的某个引脚,在程序中进行相应的输入输出操作。当按键按下时,引脚会被拉低,单片机便会对该引脚的电平状态进...

单片机 按键去抖啥意思?

单片机按键去抖,就是单片机的按键在正常操作中在按压过程时不能一下完全接通,就是按压抖动,单片机在接收这种信息时会判断错误,所有要去掉这种抖动因...

单片机 独立按键控制流水灯的C语言程序怎么写?

首先选择一款单片机学习。推荐使用51单片机:简单好用资料多。网上随便找一套入门视频教程就行了。如果c语言不会的话,先学c语言。如果c语言已经入门了,就可...

单片机 按键开关是什么?

单片机按键开关是一种应用于单片机系统的输入设备,通常由按键和额外的元器件(如电容器和电阻器等)组成。其作用是在按键被按下之后,产生一个由0到1的状态转变...

这是 单片机 4X4的 键盘 识别程序,请帮我解释,最好每句执行操作...

你这个程序写的真够麻烦的,4*4的矩阵键盘哪用这么复杂啊。我写个给你吧,我这个程序是检测按键,然后通过运算直接输出0-15的值。原理就是通过检测按键处于第几...

单片机 矩阵 键盘 怎么赋值?

单片机矩阵键盘赋值需要通过扫描矩阵的方式来实现,首先需要设置矩阵键盘的行和列,然后通过循环扫描每一个按键的状态,当检测到按键按下时,就可以为该按键赋予...

猜你喜欢