导航:首页 > 操作系统 > 单片机键盘扩展实验

单片机键盘扩展实验

发布时间:2022-09-27 20:02:21

‘壹’ 使用单片机的P1口扩展4*4键盘矩阵,实现在键盘上每按一个数字键用静态显示或动态显

P1.0~P1.3为列线,P1.4~P1.7为行线;列线和行线的交叉点接按键。先在列线上依次输出1,然后再在行线上读取;可根据行线的输入和列线的输出来判定是哪个按键按下。具体的显示部分,应该很简单吧。

‘贰’ at89s51单片机用扩展pc口接4*4矩阵键盘请问怎么用c语言编程

下面是在P1口接4X3矩阵键盘的驱动程序,供你参考。上拉电阻也可以不用.

codeU8kcode[]={0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7};
//反转码对应键值 0 1 2 3 4 5 6 7 8 9 A B
U8key(void)
{U8a,r=0xff;
delay_ms(20);//延时20毫秒,消除按键抖动
if(P1==0xf0)gotorn;
a=P1;
P1=a|0x0f;
delay_ms(20);
a=P1;
for(r=0;r<=11;r++)
{ if(a==kcode[r])break;
};
rn:P1=0xf0;
returnr;
}

‘叁’ 求单片机 4X4键盘及数码管显示实验 程序

我有这个视频教程!是PIC的C语言。其实都一样
有空了,给你一个视频和代码!

‘肆’ 51单片机做数字电子钟

这么复杂的东西给这么少分 晕死了 你也太小气了吧,分多的话还可能帮你动动脑

‘伍’ 51单片机的4*4键盘程序

/* 实验目的:1.掌握键盘扫描的原理以及十/十六进制的转换
* 2.了解单片机输入和输出的过程,以及如何对数据进行采集的
* 实验内容:键盘上对应有16个按键,从0到F,按下相应的键会在数码管上显示相应的数字,
* 其中K0到K15是采用4*4的方式连接的
*/
;******************************************************************
; 0 1 2 3 ---P30
; 4 5 6 7 ---P31
; 8 9 A B ---P32
; C D E F ---P33
; | | | |
; P34 P35 P36 P37
;******************************************************************

ORG 0000h
LJMP MAIN
ORG 0030h
MAIN:
MOV DPTR,#TAB ;将表头放入DPTR
LCALL KEY ;调用键盘扫描程序
MOVC A,@A+DPTR ;查表后将键值送入ACC
MOV P0,A ;将Acc值送入P0口
CLR P1.3 ;开显示
LJMP MAIN ;返回调用子程序反复循环显示

KEY: LCALL KS ;调用检测按键子程序
JNZ K1 ;有键按下继续
LCALL DELAY2 ;无键按下调用延时去抖动程序
AJMP KEY ;返回继续检测有无按键按下
K1: LCALL DELAY2
LCALL DELAY2 ;有键按下继续延时去抖动
LCALL KS ;再一次调用检测按键程序
JNZ K2 ;确认有按下进行下一步
AJMP KEY ;无键按下返回继续检测
K2: MOV R2,#0EFH ;将扫描值送入 R2暂存
MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列值。
K3: MOV P3,R2 ;将R2的值送入P3口
L6: JB P3.0,L1 ;P3.0等于1跳转到L1
MOV A,#00H ;将第一行的行值00H送入ACC
AJMP LK ;跳转到键值处理程序
L1: JB P3.1,L2 ;P3.1等于1跳转到L2
MOV A,#04H ;将第二行的行值送入ACC
AJMP LK ;跳转到键值理程序进行键值处理
L2: JB P3.2,L3 ;P1.2等于1跳转到L3
MOV A,#08H ;将第三行的行值送入ACC
AJMP LK ;跳转到键值处理程序
L3: JB P3.3,NEXT ;P3.3等于1跳转到NEXT处
MOV A,#0cH ;将第四行的行值送入ACC
LK: ADD A,R4 ;行值与列值相加后的键值送入A
PUSH ACC ;将A中的值送入堆栈暂存
K4: LCALL DELAY2 ;调用延时去抖动程序
LCALL KS ;调用按键检测程序
JNZ K4 ;按键没有松开继续返回检测
POP ACC ;将堆栈的值送入ACC
RET

NEXT:
INC R4 ;将列值加一
MOV A,R2 ;将R2的值送入A
JNB ACC.7,KEY ;扫描完成跳至KEY处进行下一回合的扫描
RL A ;扫描未完成将A中的值右移一位进行下一列的扫描
MOV R2,A ;将ACC的值送入R2暂存
AJMP K3 ;跳转到K3继续
KS: MOV P3,#0FH ;将P3口高四位置0低四位值1
MOV A,P3 ;读P3口
XRL A,#0FH ;将A中的值与A中的值相异或
RET ;子程序返回
DELAY2: ;40ms延时去抖动子程序8*FA*2=40ms
MOV R5,#08H
L7: MOV R6,#0FAH
L8: DJNZ R6,L8
DJNZ R5,L7
RET

TAB:
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
DB 088H;A
DB 083H;b
DB 0C6H;C
DB 0A1H;d
DB 086H;E
DB 08EH;F
END

‘陆’ 单片机4*8矩阵键盘行列方式如何扩展求c程序

要做4x8矩阵键盘并不难,8条行线用一个并口,4条列线用另一个并口的4个I/O口就行了。至于程序,与4×4矩阵键盘的写法是完全相同的,只是返回的键值要增加了,从00H~1FH,共32个键值。

‘柒’ 单片机汇编矩阵键盘实验(扫描法)

关于扫描按键的原理,可以看下面这篇文章。

本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考。在实际项目中我们经常会遇到有按键输入的需求,但有的时候为了节省资源成本,我们都会选择在不增加硬件的情况下使用最少的控制器IO驱动更多的按键,那么具体是怎么做的呢,下面我们就以用5个IO引脚为例,讲下怎么设计可以实现更多的按键?共有5种设计思路,下面依次介绍。

思路一

首先通常想到的可能是下面这样的设计:

这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、K05在5个IO口都为读取的情况下,就可以识别,不需要扫描识别处理,相当于这5个按键优先级高与其他按键。

总结

综合上述,5个IO口最多可以识别25个按键,思路五程序上处理比较麻烦,若实际中只按思路四设计,也可识别20个按键,那么如果有N个IO口可识别多少按键呢?这里给出如下公式:

假设有N个IO口按照思路三可以识别N*(N-1)/2个;

按照思路四可识别N*(N-1)个;

按照思路5可以识别N*(N-1)+N个。

最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?

‘捌’ 89C51单片机简单键盘实验利用keil uVision4仿真程序。利用简单键盘模块中提供的8个独

#include<reg52.h>
sbit key = P1^0;//按键
void delay(unsigned int time)
{
unsigned int i,j;

for(i=0; i<time; i++)

for(j=0; j<1000; j++)

{;}
}
void mian()
{
unsigned int temp =0x00;
while(1)
{
if(key == 0)
{
delay(20);//适当延时,消除按键抖动,自己看实际情况修改时间
if(key == 0)

temp = ~temp;

}
P2 = temp;
}

}

‘玖’ 如何用单片机模拟键盘控制电脑

接口协议原理
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; //开中断
}

阅读全文

与单片机键盘扩展实验相关的资料

热点内容
五菱宏光空调压缩机 浏览:64
为什么app占用几百兆 浏览:676
自动解压失败叫我联系客服 浏览:482
易语言新手源码 浏览:456
oa服务器必须有固定ip地址 浏览:42
传奇源码分析是什么 浏览:267
解放压缩机支架 浏览:255
程序员秃顶搞笑相遇 浏览:6
IBM手机app商店叫什么名字 浏览:834
jpeg压缩质量 浏览:774
云服务器评测对比 浏览:145
java日期转string 浏览:221
openfire源码编译 浏览:897
在线小工具箱引流网站源码 浏览:337
非科班程序员自学 浏览:801
压缩泡沫鞋底底材 浏览:219
程序员职场第一课2正确的沟通 浏览:679
遇到不合法app应该怎么办 浏览:91
汇编程序编译后的文件 浏览:81
大智慧均线源码 浏览:374