proteus矩阵键盘

合集下载

proteus中4乘4矩阵键盘代码

proteus中4乘4矩阵键盘代码
case(0Xe0):
KeyValue=KeyValue+12;
break;
//default:KeyValue=17;
}
while((a<50)&&(GPIO_KEY!=0xf0))//检测按键松手检测
{
Delay10ms();
a++;
}
a=0;
}
}
// switch(KeyValue)
// {
// case(10):
// case(14):
// KeyValue=KeyValue;
// break;
// case(15):
// KeyValue=KeyValue;
// break;
// }
}
/*******************************************************************************
*函数名: Delay10ms
*函数功能:延时函数,延时10ms
*输入:无
*输出:无
*******************************************************************************/
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--);
}
#include <Key.h>
unsigned char KeyValue;//用来存放读取到的键值

(整理)自己写的单片机矩阵键盘显示程序及仿真

(整理)自己写的单片机矩阵键盘显示程序及仿真

Protues 电路连接图如下所示:PS:矩阵键盘说明——4×4矩阵从左到右依次编码为1,,3,4,5,6,7,8,9,10,11,12,13,14,15,16 按下某一按键,Led数码管就会显示相应的数字。

Keil C51 程序如下:有点不足望改进。

O(∩_∩)O谢谢!!!////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <reg51.h>#define uchar unsigned char //宏的定义变量类型uchar 代替unsigned char#define uint unsigned int //宏的定义变量类型uint 代替unsigned intuchar dis_buf; //显示缓存uchar temp;uchar l,h,j; //定义行列void delay0(uchar x); //x*0.14MS// 此表为LED 的字模0 1 2 3 4 5 6 78 9uchar code LED7Code[] = {0xc0,0xf9,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};/************************************************************** ** 延时子程序** * *************************************************************/void delay(uchar x){ uchar j;while((x--)!=0) //CPU执行x*12次,x=10{ for(j=0;j<50;j++){;}}}/************************************************************* * * * 键扫描子程序(4*4的矩阵) P1.4 P1.5 P1.6 P1.7为行** P1.0 P1.1 P1.2 P1.3为列** * *************************************************************/void keyscan(void){ temp=0;P1=0xF0; //高四位输入行为高电平列为低电delay(3); //延时temp=P1; //读P1口temp=temp&0xF0;//屏蔽低四位temp=~((temp>>4)|0xF0); //高四位取反无键按下取反应为0xf0if(temp==1) //0001 [1,1] 被拉低h=1;else if(temp==2) //0010[2,1] 被拉低h=2;else if(temp==4) //0100[3,1] 被拉低h=3;else if(temp==8) //1000[4,1] 被拉低h=4;dis_buf = h;dis_buf = (dis_buf<<4) & 0xf0; //行信息现存在第四位delay(10);P1=0x0F; //低四位输入列为高电平行为低电平delay(3); //延时temp=P1; //读P1口temp=temp&0x0F; //屏蔽高四位temp=~(temp|0xF0); //取反if(temp==1) //1列被拉低l=1;else if(temp==2) //2列被拉低l=2;else if(temp==4) //3列被拉低l=3;else if(temp==8) //4列被拉低l=4;l= l & 0x0f;delay(3);dis_buf= l | dis_buf;}/************************************************************** **判断键是否按下** **************************************************************/void keydown(void){P2=0xF0; //显示00P3=0xf0;//将高4位全部置1 低四位全部置0if(P1!=0xF0) //判断按键是否按下如果按钮按下会拉低P1其中的一个端口{keyscan(); //调用按键扫描程序}}void display( ){j=50;while(j){P2= 0x80;P0= LED7Code[0];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display1( ){j=50;while(j){P2= 0x80;P0= LED7Code[2];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display2( ){j=50;while(j){P2= 0x80;P0= LED7Code[3];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display3( ){j=50;while(j){P2= 0x80;P0= LED7Code[4];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display4( ){j=50;while(j){P2= 0x80;P0= LED7Code[5];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display5( ){j=50;while(j){P2= 0x80;P0= LED7Code[6];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}/************************************************************* * * * 主程序* * * *************************************************************/ void main(){P0=0xc0;delay(20); //延时while(1){ keydown(); //调用按键判断检测程序switch( dis_buf){case 0x11 : P2=0x80; P0= LED7Code[1]; break;case 0x12 : P2=0x80; P0= LED7Code[2]; break;case 0x13 : P2=0x80; P0= LED7Code[3]; break;case 0x14 : P2=0x80; P0= LED7Code[4]; break;case 0x21 : P2=0x80; P0= LED7Code[5]; break;case 0x22 : P2=0x80; P0= LED7Code[6]; break;case 0x23 : P2=0x80; P0= LED7Code[7]; break;case 0x24 : P2=0x80; P0= LED7Code[8]; break;case 0x31 : P2=0x80; P0= LED7Code[9]; break;case 0x32 : display();break;case 0x33 : P2 = LED7Code[1]; P0= LED7Code[1]; break;case 0x34 : display1(); break;case 0x41 : display2(); break;case 0x42 : display3();; break;case 0x43 : display4();; break;case 0x44 : display5();; break;}delay(250);}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////。

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。

(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。

在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

操作方完成矩阵式键盘实验。

具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。

完成思考题。

三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。

2.在keil上进行编译后生成“xxx.hex”文件。

3.编译好的“xxx.hex”文件加入AT89C51。

启动仿真,观察仿真结果。

四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。

proteus矩阵键盘

proteus矩阵键盘

实验三:矩阵键盘电路设计(一)实验目的1掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

2学会使用proteus软件设计矩阵键盘电路掌。

3握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

(二)实验要求能熟练的编写8951单片机汇编程序设计键盘接口仿真电路图,并使之正常运行(三)连接图(四)结果图当矩阵键盘的3号键被按下时,P2口的七段数码管显示的数据为3.如下图1所以:当矩阵键盘的A号键被按下时,P2口的七段数码管显示的数据为A.如下图2所以:(五)代码ORG 0000HAJMP MAINORG 0030HMAIN:MOV DPTR,#TABLE ;将表头放入DPTRLCALL KEY ;调用键盘扫描程序MOVC A,@A+DPTR ;查表后将键值送入ACCMOV P2,A ;将ACC值送入P0口LJMP MAIN ;返回反复循环程序KEY: LCALL KS ;调用检测按键子程序JNZ K1 ;若有按键按下,则继续LCALL DELAY2 ;若无按键按下,则调用延时去抖程序 AJMP KEY ;返回,继续检测按键K1: LCALL DELAY2LCALL DELAY2 ;若有按键按下,则延时去抖动LCALL KS ;再调用检测按键程序JNZ K2 ;确认有键按下,进行下一步AJMP KEY ;若无按键按下,则返回继续检测K2: MOV R2,#0EFH ;将扫描值送入R2暂存MOV R4,#00H ;将第1列值送入R4暂存K3: MOV P1,R2 ;将R2的值送入P1口L6: JB P1.0,L1 ;P1.0等于1跳转到L1 MOV A,#00H ;将第1行值送入ACCAJMP LK ;跳转到键值处理程序L1: JB P1.1,L2 ;P1.1等于1跳转到L2 MOV A,#04H ;将第2行值送入ACCAJMP LK ;跳转到键值处理程序进行键值处理L2: JB P1.2,L3 ;P1.2等于1跳转到L3 MOV A,#08H ;将第3行值送入ACCAJMP LK ;跳转到键值处理程序L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处 MOV A,#0CH ;将第4行值送入ACCLK: ADD A,R4 ;将行值与列值相加后的键值送入APUSH ACC ;将A中的值送入堆栈暂存K4: LCALL DELAY2 ;调用延时去抖程序LCALL KS ;调用检测按键程序JNZ K4 ;若按键没有松开,则继续返回检测POP ACC ;键堆栈的值送入ACCRETNEXT:INC R4 ;将列值加一MOV A,R2 ;将R2的值送入AJNB ACC.7,KEY ;扫描至KEY处进行下一扫描RL A ;扫描未完,将A中的值右移一位进行下一列的扫描MOV R2,A ;将ACC的值送入R2暂存AJMP K3 ;跳转到K3继续KS: MOV P1,#0FH ;将P1口的高4为置0,低4位置1 MOV A,P1 ;读P1口XRL A,#0FH ;将A中的值与0FH相异或RET ;子程序返回DELAY2: ;40ms延时去抖子程序MOV R5,#08HL7: MOV R6,#0FAHL8: DJNZ R6,L8DJNZ R5,L7RETTABLE: ;7段显示器的数据定义DB 0C0H,0F9H,0A4H,0B0H,99H ;01234DB 92H,82H,0F8H,80H,90H ;56789DB 88H,83H,0C6H,0A1H,86H ;ABCDEDB 8EH ;FEND ;程序结束。

使用proteus仿真矩阵键盘时遇到的问题和解决方案

使用proteus仿真矩阵键盘时遇到的问题和解决方案
经 济 市 场
使 用 poe s仿真 矩 阵键 盘 时遇 到 的 问题 和解 决 方案 rtu
杜 力 ,肖学 玲
( 长江职 业学院 , 湖北 武 汉 4 0 7 ) 3 0 8
摘 要: 通过 Poe s 件 的使 用 我 们 能够 轻 易地 获 得 一 个 功 能齐 全 、 rt u 软 实用 方 便 的 单 片机 实验 室 , 是 , 真 软 件 毕 竟 与 实 但 仿 际 电路 有差 别 , 文 指 出 了在使 用 po es 件 仿 真矩 阵式 键 盘 时遇 到 的 问题 , 本 rt u 软 并给 出 了解 决 方 案 。 关 键词 :rtu ; 阵 式键 盘 poe s矩

Байду номын сангаас
个功能齐全 、 实用方便的单 片机实验 室。但是 , 仿真软件毕竟
与实 际 电路 有 差别 , 使 用 的过 程 中会 遇到 一 些 问 题 , 在 比如 在 使 用较 低 版 本 的 poes 件 点 亮 7段 数 码 管 的时 候 必 须 先关 掉 r u软 t
图 1 85 扩 展 IO 口组 成 的行 列 式键 盘 15 /
数 码 管 的 显 示 , 然 后 在 送 字 形 码 才 能 点 亮 它 。笔 者 在 利 用
3 用 poe s仿真 矩阵式键 盘 时会 遇到 的问题 rtu
笔者在教学过程 中,按照上述原理利用 P O E S仿真来 R TU
构 建 矩 阵式 键 盘 就是 得 不 到正 确 的 结 果 。在 仿 真 过程 中根 本 就
4 用 poe s构 建矩 阵式键盘 rtu
既然 po u 软件 中在第二 步逐 列扫描识 别时无法将 电平 rt s e
拉低 ,在 用 poes rt 构建 矩 阵 式 键 盘就 应 该 采 用新 的解 决 方 案 。 u

4×4矩阵键盘在单片机中的应用(Proteus)

4×4矩阵键盘在单片机中的应用(Proteus)

4×4矩阵键盘原理及其在单片机中的简单应用基于Proteus仿真1、4×4矩阵键盘的工作原理如下图所示,4×4矩阵键盘由4条行线和4条列线组成,行线接P3.0-P3.3,列线接P3.4-P3.7,按键位于每条行线和列线的交叉点上。

按键的识别可采用行扫描法和线反转法,这里采用简单的线反转法,只需三步。

第一步,执行程序使X0~X3均为低电平,此时读取各列线Y0~Y3的状态即可知道是否有键按下。

当无键按下时,各行线与各列线相互断开,各列线仍保持为高电平;当有键按下时,则相应的行线与列线通过该按键相连,该列线就变为低电平,此时读取Y0Y1Y2Y3的状态,得到列码。

第二步,执行程序使Y0~Y3均为低电平,当有键按下时,X0~X3中有一条行线为低电平,其余行线为高电平,读取X0X1X2X3的状态,得到行码。

第三步,将第一步得到的列码和第二步得到的行码拼合成被按键的位置码,即Y0Y1Y2Y3X0X1X2X3(因为行线和列线各有一条为低电平,其余为高电平,所以位置码低四位和高四位分别只有一位低电平,其余为高电平)。

当0键按下时,行线X0和列线Y0为低电平,其余行列线为高电平,于是可以得到0键的位置码Y0Y1Y2Y3X0X1X2X3为0111 0111,即0X77。

当5键按下时,行线X1和列线Y1为低电平,其余行列线为高电平,于是可得到5键的位置码Y0Y1Y2Y3X0X1X2X3为1011 1011,即0XBB。

全部矩阵键盘的位置码如下:2、4×4矩阵键盘在单片机的简单应用举例(一)如下图所示,运行程序时,按下任一按键,数码管会显示它在矩阵键盘上的序号0~F,并且蜂鸣器发出声音,模拟按键的声音。

此处采用线反转法识别按键。

C程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit buzzer=P1^0;uchar code dis[]= //0~9,A~F的共阳显示代码{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};uchar code tab[]= //矩阵键盘按键位置码{0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0xed,0x7e,0xbe,0xde,0xee};void delay(uint x) //延时函数{uchar i;while(x--)for(i=0;i<120;i++);}uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法{uchar a,b,c,i;P3=0XF0; //P3口输出11110000a=P3; //读取列码delay(10); //防抖延时10msP3=0X0F; //P3口输出00001111b=P3; //读取行码c=a+b; //得到位置码for(i=0;i<16;i++)if(c==tab[i])return i; //查表得到按键序号并返回return -1; //无按键,则返回-1}void beep() //蜂鸣器发出声音,模拟按键的声音{ uchar i;for(i=0;i<100;i++){buzzer=~buzzer;delay(1);}buzzer=0;}void main(){uchar key;buzzer=0; //关闭蜂鸣器while(1){key=scan(); //得到按键号if(key!=-1) //有按键则显示,并且蜂鸣器发出声音{P0=dis[key];beep();delay(100);}}}Proteus仿真运行结果如下:3、4×4矩阵键盘在单片机的简单应用举例(二)如下图所示,运行程序时,按下的按键键值越大,点亮的LED灯越多,例如,按下1号键时,点亮一只LED灯,按下2号键时,点亮两只LED灯,按下16号键时,点亮全部LED 灯。

4X4矩阵键盘+1602——51单片机的Proteus实验

4X4矩阵键盘+1602——51单片机的Proteus实验

4X4矩阵键盘+1602——51单片机的Proteus实验本文转载自小波电子工作室。

C语言源代码//======================================================依次可以从键盘输入0-f,在1602LCD上显示出来(此程序在所买开发板上验证通过)//======================================================//******** 小波电子工作室All rights reserved******//******** 个人主页:/niejinbo **//******** 文件名:lcd_key.1.c ************//******** 功能概要:4*4矩阵键盘扫描***********//******** MCU: STC89C52 晶振:11.0592Mhz **********//******** 设计者:聂金波************//******** 完成日期:2008-07-14 ************//******** 当前版本:0714.1 ************//******** 改进说明:暂无************//******** 补充说明: 从键盘输入0-F,在LCD上显示出来//*********头文件区*******************#include<reg52.h>#include<math.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int//*********定义变量区*******************sbit dula=P2^6; //关闭数码管显示之用sbit wela=P2^7;sbit lcden=P3^4; //LCD使能信号sbit lcdrs=P3^5; //LCD数据/命令选择信号uchar tab_key[50];uchar code tab[]="0123456789abcdef";uchar n=0,temp,key;//*********函数声明区********************void lcd_disp(); //LCD显示函数void lcd_init(); //LCD初始化函数void write_com(uchar); //写命令函数void write_data(uchar); //写数据函数void delay(uint); //延迟函数void key_scan(); //键盘扫描函数void key_manage1(); //键盘功能分配函数void key_manage2();void key_manage3();void key_manage4();void key_manage5();void key_manage6();void key_manage7();void key_manage8();void key_manage9();void key_manage10();void key_manage11();void key_manage12();void key_manage13();void key_manage14();void key_manage15();void key_manage16();//**********主函数开始**********void main(){lcd_init();write_com(1);while(1){key_scan();lcd_disp();}}//**********LCD显示函数开始***********void lcd_disp(){uchar a,i=0;write_com(0x80);for(i=0;i<n;i++){a=tab_key[i];write_data(tab[a]);}}//**********LCD初始化函数开始*********void lcd_init(){dula=0;wela=0; // 关闭数码管显示lcden=0;write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口write_com(0x0c); //开显示,显示光标,光标闪烁write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动write_com(0x80); //设置光标指针}//**********写命令函数开始************void write_com(uchar com){lcdrs=0; //低电平写命令P0=com; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********写数据函数开始************void write_data(uchar dat){lcdrs=1; //低电平写数据P0=dat; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********键盘扫描函数开始**** void key_scan(){//**********扫描第一行*********P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xee:key_manage1();break;case 0xde:key_manage2();break;case 0xbe:key_manage3();break;case 0x7e:key_manage4();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第二行*********P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key_manage5();break;case 0xdd:key_manage6();break;case 0xbd:key_manage7();break;case 0x7d:key_manage8();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第三行********* P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key_manage9();break;case 0xdb:key_manage10();break;case 0xbb:key_manage11();break;case 0x7b:key_manage12();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第四行********* P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key_manage13();break;case 0xd7:key_manage14();break;case 0xb7:key_manage15();break;case 0x77:key_manage16();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}//*********延时函数开始************** void delay(uint k){uint i,j;for(i=k;i>0;i--)for(j=50;j>0;j--);}//******键盘功能分配函数群开始********// 键盘功能示意图// 设计者:聂金波//** 1 ** 2 ** 3 ** 4 **//** 5 ** 6 ** 7 ** 8 **//** 9 ** 0 ** s ** c **//** M1** M2** M3** M4**void key_manage1(){tab_key[n]=0;n++;}void key_manage2(){tab_key[n]=1;n++;}void key_manage3(){tab_key[n]=2;n++;}void key_manage4() {tab_key[n]=3;n++;}void key_manage5() {tab_key[n]=4;n++;}void key_manage6() {tab_key[n]=5;n++;}void key_manage7(){tab_key[n]=6;n++;}void key_manage8(){tab_key[n]=7;n++;}void key_manage9() {tab_key[n]=8;n++;}void key_manage10(){tab_key[n]=9;n++;}void key_manage11() {tab_key[n]=10;n++;}void key_manage12(){tab_key[n]=11;n++;}void key_manage13(){tab_key[n]=12;n++;}void key_manage14(){tab_key[n]=13;n++;}void key_manage15(){tab_key[n]=14;n++;}void key_manage16(){tab_key[n]=15;n++;}Proteus仿真图依次从键盘输入:abcd 277817639 (本人QQ号)4X4矩阵键盘-Proteus截图。

基于单片机4X4矩阵键盘控制数码管显示的Proteus仿真

基于单片机4X4矩阵键盘控制数码管显示的Proteus仿真

P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K4
K5
K8
K9
KC
KD
图 3-2:当按下 K4 键时,数码管显示数字‘4’
软件设计方面,我感觉到在编写循环嵌套程序时非常容易出错,需要反复的查错 和耐心的调试。我虽然能够编写出程序,其可读性却有待于提高。
经过这次仿真设计,我对 51 系统的单片机内部构造的了解认识有了一定程度的提 高。我体会到做设计是一项细致的工作,必须要投入时间及精力,要有耐心有韧性。
我相信这几次的仿真设计会为我以后的发展打下一定的基础,我会更加努力,争取 自己在单片机的开发上有更深层次的提高,与此同时经过此次仿真,锻炼了团队协作 能力。
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
39 38 37 36 35 34 33 32
21 22 23 24 25 26 27 P2.6 28 P2.7
10 11 12 13 14 15 16 17
K0
K1
K2
K3
K4

基于Proteus软件的4x4矩阵键盘设计与仿真

基于Proteus软件的4x4矩阵键盘设计与仿真

基于Proteus软件的4x4矩阵键盘设计与仿真4*4矩阵键盘仿真摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。

单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。

由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。

单片机系统的开发过程中,程序设计语言的选择尤为重要。

C51提供高效的代码,结构化的编程和丰富的操作符,多被采用。

C51是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能,而且可以直接实现对硬件的控制。

本毕业设计以AT89S51芯片为核心,程序设计采用汇编语言,辅以必要的电路,并运用proteus软件设计了4*4矩阵键盘仿真。

目录前言 (1)第一章单片机的概述.................................................................. 2 1.1什么是单片机.......................................................................................2 1.2MCS-51单片机内部结构............................................................ 2 1.3单片机的应用领域 (3)1.4 AT89C51简介.......................................................................................4 第二章软件的介绍及使用............................................................ 7 2.2 Proteus软件的介绍和使用.................................................................. 7 2.1Keil uVision2软件的介绍和使用............................................................ 9 第三章系统总体设计..................................................................14 3.1 系统原理.......................................................................................... 14 3.2电路组成.......................................................................................... 14 3.2.1键盘部分..........................................................................................14 3.2.2LED显示.......................................................................................... 15 3.2.3晶振电路..........................................................................................16 3.3系统功能和原理图................................................................................. 16 3.3.1实现功能....................................................................................... 16 3.3.2硬件电路原理图.............................................................................. 16 3.4系统与硬件的连接................................................................................. 17 第四章系统软件设计........................................................................... 18 4.1程序流程图.......................................................................................... 18 4.2源程序................................................................................................ 18 第五章程序的编译调试与仿真............................................................... 21 5.1程序的编译 (21)5.2调试与仿真 (22)第六章结束语………………………………………………………………………………24 6.1论文总结…………………………………………………………………………………24 6.2工作展望.............................................................................................24 参考文献 (25)致谢 (25)前言随着人们生活水平的提高,19世纪兴起的数字电路以其先天的便捷、稳定的优点在现代电子技术电路中占有越来越重要的地位。

矩阵键盘工作原理

矩阵键盘工作原理

矩阵键盘工作原理矩阵键盘是一种常见的输入设备,广泛应用于计算机、手机、电子游戏机等各种电子设备中。

其工作原理是通过一种特殊的电路设计,实现了少量的输入引脚就可以控制大量的按键,从而实现了节省成本和空间的效果。

下面我们将详细介绍矩阵键盘的工作原理。

首先,矩阵键盘由若干行和若干列的按键组成,每个按键的交叉点处都连接有一个开关。

当按下某个按键时,该按键所在的行和列就会发生短路,从而改变了对应的电路状态。

接下来,通过扫描电路逐行或逐列地扫描按键状态,以确定哪些按键被按下。

这样就可以通过少量的引脚来控制大量的按键,实现了矩阵键盘的工作原理。

其次,矩阵键盘的工作原理可以通过一个简单的例子来说明。

假设一个4x4的矩阵键盘,共有16个按键,分为4行和4列。

通过扫描电路逐行扫描按键状态,可以确定哪些按键被按下。

比如,当按下第一行的第二个按键时,该按键所在的第一行和第二列就会发生短路,通过扫描电路可以检测到这一变化,从而确定了该按键被按下。

通过这种方式,可以通过4行和4列的引脚来控制16个按键,实现了矩阵键盘的工作原理。

最后,矩阵键盘的工作原理还可以通过电路图来进一步说明。

在矩阵键盘的电路图中,每个按键都连接在特定的行和列上,通过扫描电路逐行或逐列地扫描按键状态,可以确定哪些按键被按下。

这样就可以实现通过少量的引脚来控制大量的按键,从而节省了成本和空间。

总之,矩阵键盘通过特殊的电路设计,实现了少量的输入引脚就可以控制大量的按键,从而节省了成本和空间。

通过扫描电路逐行或逐列地扫描按键状态,可以确定哪些按键被按下,从而实现了矩阵键盘的工作原理。

希望本文能够帮助大家更好地理解矩阵键盘的工作原理。

4 4 矩阵键盘工作原理

4 4 矩阵键盘工作原理

4 4 矩阵键盘工作原理
矩阵键盘是一种常见的输入设备,它由一组按键组成,通常是一个矩形阵列。

每个按键都有一个标识符,例如数字、字母或符号,用户可以通过按下相应的按键来输入字符或执行特定的功能。

矩阵键盘使用一种称为矩阵扫描的技术来工作。

矩阵键盘的基本原理是将键盘的每个按键连接到一个二维的电路矩阵中。

该矩阵由行和列组成,行与列的交叉点即为一个按键的位置。

当用户按下一个按键时,键盘的控制电路会检测到按键位置的行和列,然后发送一个对应的信号给计算机。

具体来说,当用户按下一个按键时,键盘的控制电路会扫描矩阵中的行和列,并确定按键的位置。

然后,它将该位置的信息转换为一个数字或字符编码,并将其发送给计算机。

计算机接收到编码后,会根据编码对应的字符表或映射关系,将编码转换为对应的字符或执行相应的功能操作。

为了提高扫描效率,矩阵键盘通常采用多路复用的方式来工作。

具体来说,它会将多个按键连接到同一行或列上,然后通过逐行或逐列扫描的方式来检测按键的状态。

这种方式可以有效减少所需的输入输出引脚数量,从而降低成本并提高性能。

除了普通的按键输入,矩阵键盘还可以支持一些特殊功能,例如功能键、组合键等。

通过按下不同的组合键或功能键,用户可以实现更多的操作,例如调整音量、切换屏幕、执行快捷命令等。

总的来说,矩阵键盘通过矩阵扫描的方式来检测按键的位置和状态,并将其信息转换为数字或字符编码。

这种简单而高效的工作原理使得矩阵键盘成为广泛使用的输入设备。

51单片机矩阵键盘PROTEUS仿真演示

51单片机矩阵键盘PROTEUS仿真演示

51单片机矩阵键盘PROTEUS仿真演示51单片机矩阵键盘PROTEUS仿真演示(图、程序)作者:给力哈哈程序如下:#include#define uchar unsigned char;uchar key_val=0; //定义键值,初始默认为0uchar code TAB[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e}; //0~F共阳数码管显示段码void Check_Key(void){unsigned char row,col,tmp1,tmp2;tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0for(row=0;row<4;row++) // 行检测{P1 = 0x0f; // 先将p1.4~P1.7置高P1 =~tmp1; // 使P1.4~p1.7中有一个为0tmp1*=2; // tmp1左移一位if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测{tmp2 = 0x01; // tmp2用于检测出哪一列为0for(col =0;col<4;col++) // 列检测{if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列{key_val = row*4 +col; // 获取键值,识别按键return; // 退出循环}tmp2*=2; // tmp2左移一位}}}}void main(){P2=0xFF; //位码,这里全部置高,点亮8位数码管while(1){Check_Key();P0=TAB[key_val]; //显示}}。

单片机矩阵按键实训报告

单片机矩阵按键实训报告

一、实训目的1. 理解矩阵键盘的工作原理和电路设计。

2. 掌握矩阵键盘的编程方法,实现按键的检测和响应。

3. 培养实际动手能力和团队协作能力。

二、实训内容1. 矩阵键盘电路设计2. 矩阵键盘编程3. 矩阵键盘应用实例三、实训环境1. 单片机开发板:51单片机开发板2. 矩阵键盘:4x4矩阵键盘3. 编程软件:Keil uVision54. 仿真软件:Proteus四、实训过程1. 矩阵键盘电路设计矩阵键盘由行线和列线组成,通过行列交叉连接的按键阵列实现按键功能。

在4x4矩阵键盘设计中,共有4条行线和4条列线,共16个按键。

电路设计如下:(1)行线连接:将单片机的P1.0至P1.3端口作为行线输出,用于控制行线电平。

(2)列线连接:将单片机的P2.0至P2.3端口作为列线输入,用于检测按键状态。

(3)按键连接:将16个按键分别连接到行线和列线交叉处。

2. 矩阵键盘编程(1)初始化:设置P1端口为输出模式,P2端口为输入模式。

(2)按键检测:通过逐行扫描的方式检测按键状态。

首先将P1端口的所有行线设置为低电平,然后逐行检查P2端口列线的状态,如果某列线为低电平,则表示该行对应列的按键被按下。

(3)消抖处理:为了避免按键抖动引起的误读,需要进行消抖处理。

通常采用软件消抖方法,即在检测到按键按下后,延时一段时间(如10ms)再次检测按键状态,如果按键仍然被按下,则确认按键操作有效。

(4)按键处理:根据检测到的按键,执行相应的操作。

例如,当按键按下时,在LCD1602显示屏上显示对应的按键值。

3. 矩阵键盘应用实例以LCD1602显示屏为例,实现按键与显示内容的关联。

(1)LCD1602显示屏初始化:设置LCD1602的显示模式、光标位置等。

(2)按键扫描:按照上述方法检测按键状态。

(3)按键处理:根据按键值,在LCD1602显示屏上显示对应的字符。

五、实训结果1. 成功设计并实现了4x4矩阵键盘电路。

2. 编写了矩阵键盘的检测和响应程序,实现了按键的检测和消抖处理。

Proteus使用笔记之51单片机4x4矩阵按键

Proteus使用笔记之51单片机4x4矩阵按键
程序如下: #include; #define uchar unsigigned int void delayMS(unsigned int z); uchar keyscan(void); void main(void) {
uchar key; while(1) { key=keyscan(); delayMS(50); } } void delayMS(unsigned int z) { unsigned i,j; for(i=z;i>;0;i--) for(j=122;j>;0;j--); } uchar keyscan(void) { uchar scode,scode1,scode2,k; P1=0xf0;
Proteus 使用笔记之 51 单片机 4x4 矩阵按 键
采用反转法判断按键坐标,即行号与列号获得按键码。 写完后发现 Proteus 一个问题:直接使用这样的 if(P1&0xf0!=0xf0)语句时,调不出来,当用了一个中间 变量过渡时,就调出来了,害我花了一个上午的时间,现 在暂时不知道 Proteus 为什么要这样,实际中是不需要的。
case 0x42: k=10;break; case 0x44: k=11;break; case 0x48: k=12;break; case 0x81: k=13;break; case 0x82: k=14;break; case 0x84: k=15;break; case 0x88: k=16;break; default: k=0;break; }
scode1=P1&0xf0; if(scode1!=0xf0) { delayMS(10); scode1=P1&0xf0; if(scode1!=0xf0) { scode1=P1^0xf0; //行号 P1=0x0f; scode2=P1^0x0f; //列号 scode=scode1+scode2; switch(scode) { case 0x11: k=1;break; case 0x12: k=2;break; case 0x14: k=3;break; case 0x18: k=4;break; case 0x21: k=5;break; case 0x22: k=6;break; case 0x24: k=7;break; case 0x28: k=8;break; case 0x41: k=9;break;

51单片机教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil

51单片机教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil

51单⽚机教程:按键输⼊、矩阵按键(按键巧⽤)proteus仿真+keil⽂章⽬录IO⼝原理(P1⼝最简单,所以这⾥只介绍P1,其他IO⼝原理类似)P1⼝原理可以看到的是P1⼝的⼯作原理⽐较简单,⾸先⽤P1⼝做输⼊输出较为好理解。

1、内部总线:就是内部P1.X位寄存器的值,⽐如说内部总线P1.0上电压为0V,那么对应P1.0=0;内部总线P1.0上电压为5V,那么对应P1.0=1;2、P1.X引脚:对应单⽚机引脚接⼝3、读锁存器:读锁存器为1,允许读锁存器。

为0,不允许读锁存器。

4、读引脚:为0不允许读引脚,为1允许读引脚5、写锁存器:提供⼀个上升沿锁存数据(写数据到单⽚机IO⼝上时⾃动提供⼀个脉冲)⼏个核⼼问题:1、读锁存器与读引脚区别是什么?读锁存器:读锁存器Q的电平读引脚:读P1.X引脚的电平2、读锁存器与读引脚能不能同时读?不能,两个输⼊缓冲器只能同时打开⼀个,所以只能同时读取⼀个电平。

3、什么时候读锁存器,什么时候读引脚?凡属于读-修改-写⽅式的指令,从锁存器读⼊信号,其它指令则从端⼝引脚线上读⼊信号。

也就是说遇到读指令时,相应的输⼊缓冲器才会打开,⼀般是出于关闭状态4、如果P1.0⼝⼀开始置⼀,然后⽤按键拉低,松开按键后P1.0⼝会是低电平吗?不会,锁存器锁1,没有写⼊0之前⼀直输出1,按下按键只不过P1.0引脚变低了,松开后依然是⾼电平(有了以上知识,我们就可以轻松解决很多问题了)按键输⼊按键由于是机械结构,按下的时候难免产⽣抖动,⼀般抖动会在按下的时候与松开的时候产⽣,抖动时间⼤概是10ms⼆、打开proteus仿真,绘制电路功能:利⽤⼀个按键对⼀个发光⼆极管进⾏控制。

这个可以说是最简单的按键输⼊实验了!由于是51单⽚机,内部有上拉电阻,我们就不要浪费材料在按键上接上拉了三、打开keil,编写如下代码sbit key=P1^0;//定义key为P1.0sbit led=P2^0;//定义LED为P2.0void delay10(void)//延时10ms{int n=1000;while(n--);}void main(void){while(1){if(key==0)//读P1.0引脚,如果引脚为低电平,则进⼊if{delay10();//延时10ms消抖if(key==0)//再次判断按键是否按下,防⽌⼲扰,增强稳定{led =!led;//led状态改变while(key==0);//等待按键松开,防⽌往下执⾏}}}}博主有个疑问也很不解,当"key"换成"P2^0"后程序就不能正常运⾏了,知道的⼩伙伴能不能给我解解惑。

单片机键盘扩展与Proteus仿真

单片机键盘扩展与Proteus仿真
键盘接口
按键的特点及输入原理 独立式按键 矩阵式按键
按键的特点及输入原理
按键的分类: 触点式:机械;无触点式:电气
键输入原理: 通过按键的接通与断开,产生两种相反的逻辑
状态 低电平“0”与高电平“1”。 键功能的实现:
对于一组键或一个键盘,需通过接口电路与单 片机相连。可采用查询或中断方式测试有无键按下, 再确定是哪一个键按下,将该键号送入累加器ACC, 然后判断是数字关键:如何 判断键号?

式 按 键
P1.7
P1.6
P1.5
+5V
P1.4
0123
P1.3
P1.2
45 67
8 9 10 11
P1.1
P1.0
12 13 14 15
MCS-51
特点:按键识别应采用扫描法或线路反转法
编程较为复杂,节省口资源,8键以上使用
键盘扫描子程序一般包括以下内容:
1.判别有无键按下; 2.扫描获取闭合键的行、列值; 3.用计算法或查表法得到键值; 4.判断闭合键释放否,如没释放则继续等待; 5.保存闭合键号。
中断扫描方式
为提高CPU工作效率,可采用中断扫描工作方式。 其工作过程如下:当无键按下时,CPU处理自己的工作, 当有键按下时,产生中断请求,CPU转去执行键盘扫描 子程序,并识别键号。
80 31
&
IN T0
P 1.0 P 1.1 P 1.2 P 1.3
P 1.4 P 1.5 P 1.6 P 1.7
键盘接口需要解决的问题
按键识别: 是否有键按下 求键号
键抖动及消除: 机械按键抖动时间在 5ms~10ms之间 消除方法: 硬件方案——双稳态去抖电路

按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1-第二个显示4...

按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1-第二个显示4...

按下16个矩阵键盘依次在数码管上显示1-16的平方。

如按下第一个显示1-第二个显示4...按下16个矩阵键盘依次在数码管上显示1-16的平方。

如按下第一个显示1,第二个显示4... Proteus仿真时,用的是元件库自带的矩阵键盘,分别代表1-16,仿真图如下:#include<reg52.h>#define uint unsigned int#define uchar unsigned charvoid init();//初始化子程序void delay(uint);//延时子程序void display(uint);//显示子程序uint keyscan();//按键扫描子程序uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar temp;uint num;void main(){init();while(1)display(keyscan()); }void init(){num=0;P2=0;P1=0xff;}void delay(uint ms) {uint x,y;for(x=ms;x>0;x--)for(y=110;y>0;y--);}void display(uint a) {uchar bai,ge,shi; if(a==0){P2=0;P1=0xff;}else{if(a<10){P2=table[a];P1=0xfe;}else if(a<100){shi=a/10;ge=a%10;P2=table[shi];P1=0xfe; delay(1);P1=0xff;P2=table[ge]; P1=0xfd; delay(1);P1=0xff;}else if(a<1000) {bai=a/100;shi=a%100/10; ge=a%10;P2=table[bai]; P1=0xfe; delay(1);P1=0xff;P2=table[shi]; P1=0xfd;delay(1);P1=0xff;P2=table[ge];P1=0xfb;delay(1);P1=0xff;}}}uint keyscan(){P3=0xfe;temp=P3;if(temp!=0xfe) {delay(5);temp=P3;if(temp!=0xfe){switch(temp){case 0xde:num=4;break;case 0xbe:num=9;break;case 0x7e:num=16;break;}}while(temp!=0xfe)temp=P3;}P3=0xfd;temp=P3;if(temp!=0xfd){delay(5);temp=P3;if(temp!=0xfd){switch(temp){case 0xed:num=25;break;case 0xdd:num=36;break;case 0x7d:num=64;break;}}while(temp!=0xfd)temp=P3;}P3=0xfb;temp=P3;if(temp!=0xfb){delay(5);temp=P3;if(temp!=0xfb){switch(temp){case 0xeb:num=81;break;case 0xdb:num=100;break;case 0xbb:num=121;break;}}while(temp!=0xfb)temp=P3;}P3=0xf7;temp=P3;if(temp!=0xf7){delay(5);temp=P3;if(temp!=0xf7){switch(temp){case 0xe7:num=169;break;case 0xd7:num=196;break;case 0xb7:num=225;break;case 0x77:num=256;break;}}while(temp!=0xf7)temp=P3;}return num;}。

矩阵键盘在实物与Proteus仿真中的不同与解决方法

矩阵键盘在实物与Proteus仿真中的不同与解决方法

矩阵键盘在实物与Proteus仿真中的不同与解决方法韩晓燕;韩亚丽;刘秀敏【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2016(16)3【摘要】Aiming at the problem of matrix keyboard in the proteus simulation,the paper expounds the difference between the practical circuit and the proteus simulation,and finds out the reason.A simple and effective solution is given,which achieves the perfect unity of the matrix keyboard in the actual circuit and the proteus simulation.The difference also shows that the simulation software is intuitive, saves the cost and improves the efficiency of the microcontroller,but it is different from the real obj ect.%针对矩阵键盘在Proteus仿真中出现的问题,阐述了实际电路与仿真的不同,找到了问题出现的原因,并给出了简单有效的解决方法,实现了矩阵键盘在实际电路与Proteus仿真中的完美统一.矩阵键盘在实际电路与Proteus仿真中的不同说明,仿真软件虽然直观、节约成本、提高了单片机系统设计效率,但仿真软件毕竟与实物有区别.【总页数】2页(P41-42)【作者】韩晓燕;韩亚丽;刘秀敏【作者单位】中原工学院信息商务学院电气工程系,郑州 451191;中原工学院信息商务学院电气工程系,郑州 451191;中原工学院信息商务学院电气工程系,郑州451191【正文语种】中文【中图分类】TP211【相关文献】1.矩阵键盘在西门子200系列PLC控制系统中的应用 [J], 张新亮2.3.3V单片机系统中矩阵键盘检测电路的改进 [J], 高原3.半实物仿真双机系统时钟同步问题的解决方法 [J], 刘敬云4.MIS中不同FoxPro版本兼容问题的解决方法 [J], 罗可5.使用proteus仿真矩阵键盘时遇到的问题和解决方案 [J], 杜力;肖学玲因版权原因,仅展示原文概要,查看原文内容请购买。

《STM32单片机开发—基于Proteus虚拟仿真与HAL_LL库》课件3.5 矩阵式键盘

《STM32单片机开发—基于Proteus虚拟仿真与HAL_LL库》课件3.5  矩阵式键盘
3.5 矩阵式键盘
能力目标: 理解矩阵式键盘的电路组成及工作原理,掌握矩阵式键盘程序的编制
方法。 任务要求:
如下图所示是一个4×4的矩阵式键盘仿真电路,要求编程实现当按下 任意一个按钮时,数码管立即显示当前按下按钮对应的键值。
3.5.2 矩阵式键盘的行扫描法
行扫描法检测步骤如下: ① 初始化,所有行线均输出高电平; ② 仅行线X0输出低电平,检测按键0~按键3,若其中某个按键被按下,则相应的列 线将检测到低电平; ③ 仅行线X1输出低电平,检测按键4~按键7,若其中某个按键被按下,则相应的列 线将检测到低电平; ④ 仅行线X2输出低电平,检测按键8~按键B,若其中某个按键被按下,则相应的 列线将检测到低电平; ⑤ 仅行线X3输出低电平,检测按键C~按键F,若其中某个按键被按下,则相应的 列线将检测到低电平; ⑥ 回到步骤②,继续循环检测。
(现场操作演示...)
⑵ 字节操作法
与位操作法编程思路完全不同,字节操作法将矩阵式键盘控制行列的8个GPIO引脚 PB0~PB7作为一个字节,通过与流水灯类似的移位算法来实现行线的循环置高电平, 通过“位与”运算符来判定按键是否按下。这里GPIO驱动库选择LL库,与HAL相反, LL库只有对GPIO端口读写的API函数,而没有对某一个GPIO引脚读写的API函数。
(现场操作演示...)
技能训练:
要求将任务要求中的矩阵式键盘驱动程序改为列扫描方式,位操作法或字节操作法 不限。
To be continued...
3.5.3 任务程序的编写
即便是行扫描法这一种算法,实际程序的编制方法也不止一种,这里为读者介绍两1单片机基于汇编语言的矩阵式键盘程序的实现方法,这 里GPIO的驱动库选择HAL库。由于HAL库中只有对某一个GPIO引脚进行读写的API函数 ,而没有对整个GPIO端口进行读写的API函数,因此在编制矩阵式键盘行扫描程序的 时候很容易,但是在编制数码管驱动程序的时候就很不方便了,下面程序中人为定义 了一个端口输出函数,结合查表法用于驱动数码管。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三:矩阵键盘电路设计
(一)实验目的
1掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

2学会使用proteus软件设计矩阵键盘电路掌。

3握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

(二)实验要求
能熟练的编写8951单片机汇编程序
设计键盘接口仿真电路图,并使之正常运行
(三)连接图
(四)结果图
当矩阵键盘的3号键被按下时,P2口的七段数码管显示的数据为3.如下图1所以:
当矩阵键盘的A号键被按下时,P2口的七段数码管显示的数据为A.如下图2所以:
(五)代码
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV DPTR,#TABLE ;将表头放入DPTR
LCALL KEY ;调用键盘扫描程序
MOVC A,@A+DPTR ;查表后将键值送入ACC
MOV P2,A ;将ACC值送入P0口
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 ;将第1列值送入R4暂存
K3: MOV P1,R2 ;将R2的值送入P1口
L6: JB P1.0,L1 ;P1.0等于1跳转到L1 MOV A,#00H ;将第1行值送入ACC
AJMP LK ;跳转到键值处理程序
L1: JB P1.1,L2 ;P1.1等于1跳转到L2 MOV A,#04H ;将第2行值送入ACC
AJMP LK ;跳转到键值处理程序进行键值处理L2: JB P1.2,L3 ;P1.2等于1跳转到L3 MOV A,#08H ;将第3行值送入ACC
AJMP LK ;跳转到键值处理程序
L3: JB P1.3,NEXT ;P1.3等于1跳转到NEXT处 MOV A,#0CH ;将第4行值送入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 P1,#0FH ;将P1口的高4为置0,低4位置1 MOV A,P1 ;读P1口
XRL A,#0FH ;将A中的值与0FH相异或
RET ;子程序返回
DELAY2: ;40ms延时去抖子程序
MOV R5,#08H
L7: MOV R6,#0FAH
L8: DJNZ R6,L8
DJNZ R5,L7
RET
TABLE: ;7段显示器的数据定义
DB 0C0H,0F9H,0A4H,0B0H,99H ;01234
DB 92H,82H,0F8H,80H,90H ;56789
DB 88H,83H,0C6H,0A1H,86H ;ABCDE
DB 8EH ;F
END ;程序结束。

相关文档
最新文档