51单片机矩阵键盘模块
矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 *//*******************************************************//*********************************包含头文件********************************/#include<reg51.h>/*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E};/****************************************************************************函数功能:延时子程序入口参数:出口参数:****************************************************************************/ void delay(void){unsigned char i,j;for(i=0;i<20;i++)for(j=0;j<250;j++);}/****************************************************************************函数功能:LED显示子程序入口参数:i出口参数:****************************************************************************/ void display(unsigned char i){P2=0xfe;P0=table[i];}/****************************************************************************函数功能:键盘扫描子程序入口参数:出口参数:****************************************************************************/ void keyscan(void){unsigned char n;//扫描第一行P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfe;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(3);break;case(0xd0):display(2);break;case(0xb0):display(1);break;case(0x70):display(0);break;}}}//扫描第二行P1=0xfd;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfd;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(7);break;case(0xd0):display(6);break;case(0xb0):display(5);break;case(0x70):display(4);break;}}}//扫描第三行P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xfb;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(11);break;case(0xd0):display(10);break;case(0xb0):display(9);break;case(0x70):display(8);break;}}}//扫描第四行P1=0xf7;n=P1;n&=0xf0;if(n!=0xf0){delay();P1=0xf7;n=P1;n&=0xf0;if(n!=0xf0){switch(n){case(0xe0):display(15);break;case(0xd0):display(14);break;case(0xb0):display(13);break;case(0x70):display(12);break;}}}}/**************************************************************************** 函数功能:主程序入口参数:出口参数:****************************************************************************/ void main(void){while(1){keyscan();}}。
基于51单片机的4-4矩阵键盘字符输入

void display(unsigned char num)
{
P0=table[num];
}
void init_led()
{
P0 = 0x00;
}
void main()
{
while(1)
{
P1 = 0xef;
temp = P1;
temp = temp0xf0;
if (temp != 0xf0)
{
temp = P1;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xed:
key=1;
break;
case 0xeb:
key=2;
break;
case 0xe7:
key=3;
break;
default:
break;
}
display(key);
P1=0xfe;
}
P1 = 0xdf;
key=10;
break;
case 0xb7:
key=11;
break;
default:
break;
}
display(key);
}
P1=0x7f;
temp=P1;
temp=temp0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x7e:
key=12;
break;
temp = P1;
temp = temp0x0f;
if(temp != 0x0f)
{
temp = P1;
switch(temp)
51单片机矩阵键盘

山中的四季。【教学提示】翻译有直译与意译两种方式,直译锻炼学生用语的准确性,但可能会降低译文的美感;意译可加强译文的美感,培养学生的翻译兴趣,但可能会降低译文的准确性。因此,需两种翻译方式都做必要引导。全文直译内容见《我的积累本》。目标导学四:解读文段,把握文本内容
阳修。他于庆历五年被贬谪到滁州,也就是今天的安徽省滁州市。也是在此期间,欧阳修在滁州留下了不逊于《岳阳楼记》的千古名篇——《醉翁亭记》。接下来就让我们一起来学习这篇课文吧!【教学提示】结合前文教学,有利于学生把握本文写作背景,进而加深学生对作品含义的理解。二、教学新
课目标导学一:认识作者,了解作品背景作者简介:欧阳修(1007—1072),字永叔,自号醉翁,晚年又号“六一居士”。吉州永丰(今属江西)人,因吉州原属庐陵郡,因此他又以“庐陵欧阳修”自居。谥号文忠,世称欧阳文忠公。北宋政治家、文学家、史学家,与韩愈、柳宗元、王安石、苏洵、苏轼、
此五物之间,岂不为六一乎?”写作背景:宋仁宗庆历五年(1045年),参知政事范仲淹等人遭谗离职,欧阳修上书替他们分辩,被贬到滁州做了两年知州。到任以后,他内心抑郁,但还能发挥“宽简而不扰”的作风,取得了某些政绩。《醉翁亭记》就是在这个时期写就的。目标导学二:朗读文章,通文
会员免费下载 顺字1.初读文章,结合工具书梳理文章字词。2.朗读文章,划分文章节奏,标出节奏划分有疑难的语句。节奏划分示例
1、键盘的分类
键盘分编码键盘和非编码键盘。键盘上 闭合键的识别由专用的硬件编码器实现,并 产生键编码号或键值的称为编码键盘,如计 算机键盘.
基于51单片机4乘4矩阵键盘的设计

case 0x7d:KEY=7;break;
case 0xeb:KEY=8;break;
case 0xdb:KEY=9;break;
case 0xbb:KEY=10;break;
case 0x7b:KEY=11;break;
case 0xe7:KEY=12;break;
控制任务:
编程实现4乘4的矩阵键盘控制连接在P0口和P1口上的16个LED,当按下某键并释放后只有对应的LED灯亮,例如按S0后D0亮,按S1后D1亮。
程序及仿真:
#include<reg51.h>
unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
b=P2;
a=a|b;
switch(a)
{
case 0xee:KEY=0;break;
case 0xde:KEY=1;break;
case 0xbe:KEY=2;break;
case 0x7e:KEY=3;break;
case 0xed:KEY=4;break;
case 0xdd:KEY=5;break;
{
P0=0xff;
P1=led[n-8];
}}
int main(void)
{
whilsplay(KEY);
}
return 0;
}
更多资源,请关注微博“风竹弈星”,私聊。
unsigned char KEY=0xff;
void keyscan(void)
{
unsigned char a,b;
P2=0xf0;//高四位作为输入(高电平),低四位输出低电平
51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法在使用51单片机控制矩阵键盘同时驱动数码管显示的过程中,可能会遇到一些常见的问题。
以下是一些可能的问题及相应的解决方法:按键无法正常响应:* 问题可能原因:接线错误、按键损坏、软件扫描不到按键信号。
* 解决方法:检查按键连接是否正确,确保按键没有损坏。
在软件中进行适当的按键扫描,确保能够正确检测到按键的状态。
数码管显示异常或不亮:* 问题可能原因:数码管接线问题、数码管损坏、数码管驱动程序错误。
* 解决方法:仔细检查数码管的接线是否正确,确保数码管没有损坏。
检查数码管的驱动程序,确保它按照正确的顺序和时序进行驱动。
按键重复响应或漏按现象:* 问题可能原因:按键抖动、软件扫描速度过快。
* 解决方法:在软件中增加适当的按键抖动延时,确保在按键按下或抬起时只响应一次。
调整软件扫描速度,避免扫描间隔过短导致的重复响应。
矩阵键盘的多个按键同时按下导致混乱:* 问题可能原因:矩阵键盘硬件连接错误、软件扫描算法问题。
* 解决方法:检查矩阵键盘的硬件连接,确保矩阵行和列没有短路或断路。
调整软件扫描算法,确保同时按下多个按键时能够正确识别。
数码管显示不正常的数字或乱码:* 问题可能原因:程序错误、数码管接线错误。
* 解决方法:仔细检查程序,确保数码管段选和位选的控制逻辑正确。
检查数码管的接线,确保每个数码管的连接都正确。
在解决问题时,建议逐步排除可能的原因,通过调试工具、逻辑分析仪或输出调试信息的方式来定位问题。
另外,仔细查阅51单片机的数据手册和相关文档,以确保硬件连接和软件设计都符合标准。
基于51单片机的六层电梯c语言矩阵键盘控制系统

#include〈reg51.h〉#define MAXFLOOR 6unsigned char code LEDCODES[]={0x3f,0x06, 0x5b, 0x4f,0x66,0x6d,0x7d}; sbit LEDUP=P3^6;sbit LEDDOWN=P3^7;bit DIRECTION=1,STOP=0;unsigned char CURFLOOR=1;unsigned char DESTFLOOR=1;unsigned char RUN=1;unsigned int timer1=0, timer2=0;unsigned char CALLFLOORUP[7]={0, 0,0, 0, 0, 0, 0};unsigned char CALLFLOORDOWN[7]={0, 0, 0, 0, 0,0,0};unsigned char CALLFLOOR[7]={0, 0,0, 0, 0, 0,0};unsigned char keyscan(void);unsigned char key;void readarray(void);void SELECTNEXT();void step(bit DIRECTION);void DELAY(unsigned int Z);void DELAY2(unsigned int S);void JUDGESIT();void main(void){P0=LEDCODES[1];TH0=0x3C;TL0=0xB0;TMOD=0x01;ET0=1;EA=1;EX0=1;IT0=1;while(1){if(! RUN&&! STOP){SELECTNEXT();step(DIRECTION);}else if(STOP){timer2=0;TR0=1;while(timer2<100&&STOP);TR0=0;timer2=0;STOP=0;}return;}}void SELECTNEXT(){ char n;if(CURFLOOR==MAXFLOOR){DIRECTION=0;}else if(CURFLOOR==1){DIRECTION=1;}if(DIRECTION==0){if(CALLFLOORDOWN[CURFLOOR]){CALLFLOORDOWN[CURFLOOR]=0;STOP=1;return;}for(n=CURFLOOR-1;n〉=1;n——)if(CALLFLOORDOWN[n]){DESTFLOOR=n;return;}for(n=0;n<CURFLOOR;n++)if(CALLFLOORUP[n]){DESTFLOOR=n;return;}DIRECTION=1;for(n=CURFLOOR+1;n<=MAXFLOOR;n++)if(CALLFLOORUP[n]){DESTFLOOR=n;return;}for(n=MAXFLOOR;n>CURFLOOR;n——)if(CALLFLOORDOWN[n]){DESTFLOOR=n;return;}}else{if(CALLFLOORUP[CURFLOOR]){CALLFLOORUP[CURFLOOR]=0;STOP=1;return;}for(n=CURFLOOR+1;n<=MAXFLOOR;n++)if(CALLFLOORUP[n]){DESTFLOOR=n;return;}for(n=MAXFLOOR;n〉CURFLOOR;n——)if(CALLFLOORDOWN[n]){DESTFLOOR=n;return;}DIRECTION=0;for(n=CURFLOOR-1;n〉=1;n——)if(CALLFLOORDOWN[n]){DESTFLOOR=n;return;}for(n=1;n〈=CURFLOOR;n++)if(CALLFLOORDOWN[n]){DESTFLOOR=n;return;}}}void step(bit DIRECTION){if(DESTFLOOR==CURFLOOR)return;else if(! RUN){RUN=1;DELAY(50);if(DIRECTION==1){LEDUP=0;LEDDOWN=1;}else{LEDUP=1;LEDDOWN=0;}timer1=0;TR0=1;}}void DELAY(unsigned int Z){unsigned int X, Y;for(X=Z;X〉0;X-—)for(Y=125;Y>0;Y—-);}void timer0_int() interrupt 1{TH0=0x3C;TL0=0xB0;timer1++;timer2++;if(RUN){if(timer1==20){timer1=0;if(DIRECTION){CURFLOOR++;CALLFLOORUP[CURFLOOR]=0;}else{CURFLOOR—-;CALLFLOORDOWN[CURFLOOR]=0;}RUN=0;TR0=0;P0=LEDCODES[CURFLOOR];if(DESTFLOOR==CURFLOOR){TR0=0;LEDUP=1;LEDDOWN=1;STOP=1;return;}}}}void readarray(void){unsigned char key;while(1){key=keyscan();switch(key){case 0xee:CALLFLOORDOWN[6]=1;break;case 0xed: CALLFLOORUP[5]=1;break;case 0xeb: CALLFLOORDOWN[5]=1;break;case 0xe7: CALLFLOORUP[4]=1;break;case 0xde: CALLFLOORDOWN[4]=1;break;case 0xdd:CALLFLOORUP[3]=1;break;case 0xdb: CALLFLOORDOWN[3]=1;break;case 0xd7: CALLFLOORUP[2]=1;break;case 0xbe: CALLFLOORDOWN[2]=1;break;case 0xbd:CALLFLOORUP[1]=1;break;case 0xbb:CALLFLOORDOWN[6]=1;JUDGESIT();break;case 0xb7:CALLFLOORDOWN[5]=1;JUDGESIT();break;case 0x7e:CALLFLOORDOWN[4]=1;JUDGESIT();break;case 0x7d: CALLFLOORDOWN[3]=1;JUDGESIT();break;case 0x7b:CALLFLOORDOWN[2]=1;JUDGESIT();break;case 0x77: CALLFLOORDOWN[1]=1;JUDGESIT();break;}}}unsigned char keyscan(void) //键盘扫描函数, 使用行列反转扫描法{unsigned char cord_h,cord_l;//行列值中间变量P1=0x0f; //行线输出全为0cord_h=P1&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{DELAY2(100); //去抖if(cord_h! =0x0f){cord_h=P1&0x0f; //读入列线值P1=cord_h|0xf0; //输出当前列线值cord_l=P1&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}void DELAY2(unsigned int S){while(S——);}void JUDGESIT(){char m;for(m=1;m<=MAXFLOOR;m++){if (CALLFLOOR[m]){if (CURFLOOR<=m){CALLFLOORUP[m]=1;CALLFLOOR[m]=0;return;}else{CALLFLOORDOWN[m]=1;CALLFLOOR[m]=0;return;}}}}。
51单片 矩阵键盘按键程序

}
}
P3=0xfb;//第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key=8;
break;
case 0xdb:key=9;
{
delay(10);
//temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
{
//temp=P3;
switch(P3)
{
case 0xee:key=0;
break;
case 0xde:key=1;
break;
case 0xbe:key=2;
break;
case 0x7e:key=3;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
int keyscan()
{
P3=0xfe;//第一行有别于二三四行
//temp=P3;
temp=P3&0xf0;
if(temp!=0xf0)
/*矩阵键盘*/
#include <REG52.H>
sbit du=P2^6;
sbit we=P2^7;
unsigned int i,j,key,temp;
char code table[]={0x3f,0x06,0x5b,0x4f,
51单片机矩阵键盘设计

51单片机矩阵键盘设计
一、引言
AT89C51单片机矩阵键盘设计是嵌入式系统中一个重要的技术,它的
作用是以矩阵形式把外部按键与MCU相连,使得系统可以对外部的按键进
行检测和响应。
矩阵键盘设计在可编程嵌入式系统的设计中占有重要的地位,如智能交通系统、智能家居系统、航空电子系统等。
本文主要介绍了矩阵键盘设计中硬件电路的设计,包括按键、拉电阻、和矩阵编码等,同时给出系统的控制算法,使得系统可以实现有效的按键
检测和响应。
二、矩阵键盘概述
矩阵键盘是将多个按键排布成列行形式进行连接,一般来说,矩阵键
盘是由按键、拉电阻、矩阵编码器和控制器组成,按键是系统中重要的部件,其作用是将外部输入信号传递给控制器。
拉电阻起到的作用是防止按
键耦合,一般可以使用4.7KΩ拉电阻来防止按键耦合。
矩阵编码器用来
识别按键的状态,通常通过硬件把按键信号编码为数字信号,输入到处理
器或控制器。
控制器用来实现按键信号的检测,通过定义硬件定时器和软
件定时器,实现按键检测和处理。
1、硬件电路设计
应用AT89C51单片机矩阵键盘。
基于51单片机的利用8155实现阵列式键盘程序

//-----------------------函数声明,变量定义---------------------------#include <reg51.h> //头文件#include <absacc.h> //XBYTE 宏定义#define uchar unsigned char//类型定义#define uint unsigned int //类型定义#define com XBYTE[0x7f00] //8155命令状态寄存器地址#define pa XBYTE[0x7f01] //8155的A口地址#define pb XBYTE[0x7f02] //8155的B口地址#define pc XBYTE[0x7f03] //8155的C口地址#define LED1 P1 //键号十位显示数码管驱动口#define LED2 P2 //键号个位显示数码管驱动口sbit iom=P1^7; //8155的I/O与RAM选择端口const uchar tab[]={ //7段共阳极数码管的段选码表0xc0,0xf9,0x24,0x30, //0~30x19,0x12,0x02,0x78, //4~70x00,0x18,0x08,0x03, //8~b0x46,0x21,0x06,0x0e, //c~f0x7f // 数码管灭};//-----------------------函数声明------------------------------------bit press(void); //判断是否有键按下,有返回1,没有返回0 uchar read(void); //扫描键盘,返回键值uchar show(uchar row); //显示键号void delay_50us(uint m); //延时子程序//****************************//main(){uchar row3;iom=1; //8155的IO定义com=0x0c; //8155 C口设置为输出口,A口设置为输入口while(1){row3=read(); //读按键号show(row3); //显示键号while(press()); //等待键释放delay_50us(50); //延时,防止数码管闪烁}}bit press(void){uchar hang;pc=0x00; //4行输出全‘0’hang=pa; //读A口数据列号if(hang!=0xff) //看是否不全为高电平return(1); //有低电平时,表示有键按下,返回1elsereturn(0); //全为高电平时,表示无键按下,返回0}uchar read(void){uint t;uchar hang,lie,keyscan,j,value;value=0x00;if(press()==1){delay_50us(200); //延时去抖if(press()==1){hang=0xfe; //输出监测行号赋初值,监测第1行//****************逐行扫描开始****************//for(t=0;t<4;t++) //逐行监测循环{pc=hang; //输出行监测码lie=pa; //读列号段码,有键按下的位为0if(lie!=0xff) //如果不为全1,表示该行有键按下//****************计算键号开始****************//for(j=0;j<8;j++) //看是8列中的哪列有键按下{if((lie&0x01)!=0x01) //是第j列吗{ //是keyscan=j+value; //列号+行号×8=键号return(keyscan); //返回键号}else //不是{lie>>=1; //列段码右移,继续监测最低位}}//****************计算键号结束****************//else //否则,该行无键按下准备监测下一行{hang=(hang<<1)|0x01; //行监测码左移value+=0x08; //每监测一行无键按下时,键号加8}}//****************逐行扫描结束****************//}return(0xff);}return(0xff); //无键按下时,返回FFH }uchar show(uchar row){uchar row1,row2;if(row==0xff) //无键按下时{LED1=tab[16]; //2个数码管灭LED2=tab[16];}else{ //有键按下row1=row/10; // 16进制键号除以10,得十位row2=row%10; // 16进制键号对10求余数,得个位LED1=tab[row1]; //显示十位LED2=tab[row2]; //显示个位}}void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}。
试述51系列单片机矩阵键盘编程

试述51系列单片机矩阵键盘编程摘要在单片机系统中,常常使用键盘向单片机输入信息。
键盘由一组常开的按键组成,当按键闭合时就会向单片机系统输入一个电平信息。
每个按键都被赋予了一个键码,单片机根据此代码执行任务。
在单片机系统按键数量较多时,为了减少I/O口的使用通常使用矩阵键盘。
关键词单片机;键盘;矩阵键盘;I/O口1 矩阵键盘的结构矩阵键盘的按键排成矩阵,一般是4×4矩阵,即4行4列,行和列的交叉点接一个常开的独立按键,按键被闭合时就接通行线和列线。
8个I/O口产生16个交叉点16个按键,按键数量比独立按键多了一倍,9个I/O口产生20个按键,I/O口越多产生的按键数量越多,效果越明显。
可以在键盘扫描程序中对每个按键进行编号,如第一行按键从左到右对应0、1、2、3,第二行按键从左到右对应4、5、6、7,第三行按键从左到右对应8、9、A、B,第四行按键左到右对应C、D、E、F,每按一次键让数码管显示该按键所代表的编号。
2 矩阵键盘的工作原理矩阵键盘结构比独立键盘复杂,识别难度也比独立按键大很多。
矩阵键盘的工作方式有程序扫描方式、定时扫描方式、中断扫描方式3种。
本文只讨论程序扫描方式。
程序扫描方式是CPU主动调用扫描子函数,响应键盘的输入要求。
在子函数里有以下步骤:1)判断键盘中有无按键闭合;2)延时去抖消除干扰;3)检测是否确实有按键闭合,确定闭合键的编号;4)等待闭合键的释放。
整个步骤中确定闭合键的编号是关键所在,常用的判断方法有逐行扫描法和反转扫描法。
3 硬件仿真4×4矩阵键盘无需外接电源,电位变化完全由编程来决定。
通过软件延时来消抖动,去干扰。
4×4矩阵键盘4行4列交叉,每个按键位于交叉点上对应的行列号唯一,共16个按键。
4×4矩阵键盘8个I/O口接P1口,7SEG-MPX2-AN-GREEN7段共阳极数码管通过上拉电阻接P0口。
键盘中每闭合一个按键让数码管显示对应的编号。
第7章 C51矩阵式键盘程序设计

“天华杯”
教师培训
温锦辉
7.4 小结
• 本章首先介绍了独立式按键和矩阵式键盘的结构, 以及键盘设计的注意事项。接着,重点介绍了3种 矩阵式键盘的设计方法,包括扫描法、线反转法 和中断法。在讲解过程中,均给出了键盘扫描流 程以及C51代码实例。最后通过一个完整实例,来 实现了矩阵式键盘在单片机系统的应用。在实例 中,采用的是4×4矩阵式键盘,并通过线反转法 来获取键值。矩阵式键盘应用十分广泛,熟练掌 握矩阵式键盘的使用是单片机人机接口设计的基 础。
图10-3: 4位静态LED显示器电路。该电路各位 可独立显示。
“天华杯” 教师培训 温锦辉
2. 动态显示方式 所有位的段码线相应段并在一起,由一个8位I/O 口控制,形成段码线的多路复用,各位的公共端分别由 相应的I/O线控制,形成各位的分时选通。
“天华杯” 教师培训 温锦辉
图10-4:4位8段LED动态显示电路。其中段码线占用一个8位I/O口,而位选 线占用一个4位I/O口。
第7章 C51矩阵式键盘程序设计
• 在单片机应用系统中,除了完成基本的功能外,另一个最 重要的任务是设计优秀的人机交互接口。人机交互接口用 来实现控制命令及数据的输入,并且将系统运行信息显示 反映给操作者。键盘以按键的形式来设置控制功能或数据, 其是人机交互的最基本的途径。在键盘中,按键的输入状 态本质上是一个开关量。通过键盘为按键编码,从而实现 命令或数据的输入,以达到控制的目的。 • 在单片机应用系统中,有两种常用的键盘结构:独立式按 键和矩阵式按键。其中,独立式按键比较简单,适合于较 少开关量的输入场合,而矩阵式键盘则适合于输入命令或 者数据较多、功能复杂的系统。采用矩阵式键盘结构可以 最大限度地使用单片机的引脚资源,因此应用十分广泛。
基于51单片机的矩阵键盘

case 4:wei_1=0;wei_2=1;wei_3=1;wei_4=1;break;
}
delay_ms(2)
P0=0x00;
//每次显示完后都要消隐,这非常重要!这句一缺数码管就会闪屏
wei_1=1;wei_2=1;wei_3=1;wei_4=1;
if(temp==1)key=key+0;
else if(temp==2)key=key+1;
if(temp==4)key=key+2;
else if(temp==8)key=key+3;
}
void led_init()
{
wei_1=1;wei_2=1;wei_3=1;wei_4=1;
P0=0x00;
break;
}
if(key_putdown())//这个if是转到第一个while的必要条件
break;
}
}
}
}
void main()
{
wei=1;
control=0;
led_init();
if(key_putdown())
while(1)
//这里用了两个while(1)嵌套
{
key_scan();
key_tem[control++]=key;
if(control==5){led_init();control=0;}
}
void led_disp(uchar wei2,uchar num)
{
P0=table[num];
switch(wei2)
51单片机4×4矩阵式键盘识别汇编程序

;******************************************************;*标题: 51单片机4×4矩阵式键盘识别汇编程序;*******************************************************; 0 1 2 3 ---P20; 4 5 6 7 ---P21; 8 9 10 11 ---P22; 12 13 14 15 ---P23; | | | |; P24 P25 P26 P27;******************************************************************ORG 0000hAJMP MAINORG 0030hMAIN:MOV DPTR,#TAB ;将表头放入DPTRLCALL KEY;调用键盘扫描程序MOVC A,@A+DPTR ;查表后将键值送入ACCMOV P0,A;将Acc值送入P0口CLR P1.3 ;开显示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 ;将第一列的列值00H送入R4暂存,R4用于存放列值。
K3:MOV P2,R2 ;将R2的值送入P1口L6:JB P2.0,L1 ;P1.0等于1跳转到L1MOV A,#00H ;将第一行的行值00H送入ACCAJMP LK ;跳转到键值处理程序JB P2.1,L2 ;P1.1等于1跳转到L2MOV A,#04H ;将第二行的行值送入ACCAJMP LK ;跳转到键值理程序进行键值处理L2:JB P2.2,L3 ;P1.2等于1跳转到L3MOV A,#08H ;将第三行的行值送入ACCAJMP LK ;跳转到键值处理程序L3:JB P2.3,NEXT ;P1.3等于1跳转到NEXT处MOV A,#0cH ;将第四行的行值送入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 P2,#0FH ;将P1口高四位置0低四位值1MOV A,P2 ;读P1口XRL A,#0FH ;将A中的值与A中的值相异或RET ;子程序返回DELAY2: ;40ms延时去抖动子程序8*FA*2=40ms MOV R5,#08HL7:MOV R6,#0FAHL8:DJNZ R6,L8DJNZ R5,L7RETDB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9DB 088H;ADB 083H;bDB 0C6H;CDB 0A1H;dDB 086H;EDB 08EH;F END。
单片机 矩阵键盘实验 实验报告

单片机矩阵键盘实验实验报告
实验名称:单片机矩阵键盘实验
实验目的:掌握单片机矩阵键盘的原理和应用,能够使用单片机按键输入
实验内容:利用Keil C51软件,采用AT89C51单片机实现一个4x4的矩阵键盘,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
实验步骤:
1、搭建实验电路,将矩阵键盘与单片机相连,连接好电源正负极,然后将电路焊接成一个完整的矩阵键盘输入电路。
2、打开Keil C51软件,新建一个单片机应用工程,然后编写代码。
3、通过代码实现对矩阵键盘输入的扫描功能,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
4、编译代码,生成HEX文件,下载HEX文件到单片机中,将单片机与电源相连,然后就可以测试了。
5、测试完成后,根据测试结果修改代码,重新编译生成HEX 文件,然后下载到单片机中进行验证。
实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。
实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。
51单片机矩阵键盘与8051连接设计

sbit L6=P0_;
sbit L7=P0_;
sbit L8=P0_;
sbit DUAN=P2_;
sbit WEI=P2_;
/*-----------------------------
定时器0初始化函数
-----------------------------*/
void init()
case 0xed:L5=~L5;/*按键05功能*/ break;
case 0xdd:L6=~L6;/*按键06功能*/ break;
case 0xbd:L7=~L7;/*按键07功能*/ break;
case 0x7d:L8=~L8;/*按键08功能*/ break;
case 0xeb:/*按键09功能*/ break;
{
TR0=0; //定时终止
TH0=(65536-10000)/256; //定时器0初值重装
TL0=(65536-10000)%256;
NUM--;
}
/*--------------------------------------------------
矩阵键盘检测兼编码函数
--------------------------------------------------*/
kvalue=matrixkeyscan();
switch(kvalue)
{
case 0xee:L1=~L1;/*按键01功能*/ break;
case 0xde:L2=~L2;/*按键02功能*/ break;
case 0xbe:L3=~L3;/*按键03功能*/ break;
case 0x7e:L4=~L4;/*按键04功能*/ break;
基于51单片机矩阵键盘程序

j=0;
for(k=0;k{
P3=table[k];//P3接有一排指示灯
delay (1000);//延时1S
}
}
}
}
主程序2:
main(){
int i,j,a[2][5]={10,15,25,15,75,15,45,65,85,95};
for(i=0;ifor(j=0;jprintf(“%d“,a[i][j]);
}
printf(“\n”);
}
主程序3:
由键盘输入一个3×4矩阵a,选出各列最小的元素组成一个一维数组b并输
出
由键盘输入一个3×4矩阵a,选出各列最小的元素组成一个一维数组b并输
出
#include“stdio.h”
#include“conio.h”
void main()
{
int i,j,a[3][4],b[4],min;
基于51单片机矩阵键盘程序
主程序1:
void main(){uch来自r i,j,ki=0;
j=0;
while(1)
{
i=key();//键盘循环扫描,其值赋给变量数组table
if(i!=0)//键盘子程序返回值非0,即有按键按下
{
table[j]=i;//将值存在变量数组中
j++;
}
if(j==6)
for(i=0;ifor(j=0;jscanf(“%d”,&a[i][j]);
for(i=0;ib[i]=a[0][i];
for(i=0;ifor(j=1;jif(a[i][j]for(i=0;iprintf(“%d”,b[i]);
getch();
}
51单片机矩阵键盘的编程

51单片机矩阵键盘的编程C51 单片机上的外设键盘键是使用的矩阵方式扩展的,但是硬件仿真时必须把蜂民器的开关打开触使行扫描的74HC53 的E 端接地为输出型,否则测死了也没反应,我还以为是我的程序有问题呢,后来才找到的。
其原理74HC138 译码器在输出端Y1 与WR(P3)都处于低电平通过或非门,转化成行扫描的74HC53 的片选端打开写入数据,在输出端的高4 位通过移位方式输出到外设键盘中。
然后给WR 一个高电平来给74HC53 一个低电平使得输入无效进行锁存操作。
然后通过RD(P3)与Y2 共同输出低电平通过或非门加上个非门把低电平送到列扫描的74HC53 的片选端E 上,在读取数据前必须先将要获取的高4 位进行置1,然后读取高4 位数据,通过RD 送出高电平进行锁住输出,防止74HC53 同时输入输出导致芯片烧毁。
然后根据获得的unsigned char 进行移位比对操作来获得是哪一列,然后在通过运算得到第几个按键被按下。
这是最简单的矩阵方式扩展键盘的代码流程,上述是我理解的流程,测试已没问题。
#includereg52.h#includeabsacc.hvoid my_delay10nms(unsigned int n){unsigned i,j;while(n --){for(i = 128;i 0;i --)for(j = 10;j 0;j --);}}sbit LED_BIT = P1;vo i dmain(void){unsigned char Key_h;unsigned char Key_Val;unsigned char Key_r;unsigned char Last_key;unsigned char Key_Temp;while(1){Key_Val=0;for(Key_h=4;Key_h8;Key_h++){P2=0x88;P0=(1Key_h);P3=~(16);P3|=(16);P2=0x90;P3=~(17); //读P0|=0xf0;Key_Temp=P00xf0; // P3|=(17); // 防止芯片烧坏if(Key_Temp) {for(Key_r=4;Key_r8;Key_r++){if(Key_Temp(1Key_r)){Key_Val=(Key_h-。
51单片机 矩阵式键盘 行列翻转 0-16

//矩阵式键盘采用行列翻转翻转法的原理
#include<reg52.h>
#define uchar unsigned char
uchar row,col,k=0xff;//定义行、列、返回值、循环控制变量
col=P2&0xf0;//行输出全0,读取列值
P2=col|0x0f;
k=P2;
for(i=0;i<16;i++)//查找行列组合值在键盘表中位置
{
if(k==keycode[i])
{//否则,返回0xff
k=i;//对重复键,该方法
break;//处理为无键按下
}
}
P2=0xf0;
while((P2&0xf0)!=0xf0);//等待键释放
}
}
return k;//有键按下返回的是i的值
}
void main()
{
P0=0xff;//关数码管显示
while(1)
{
SMG_q=0;//打开千位的位码
SMG_b=0;//打开百位的位码
SMg=0;//打开个位的位码
P0=table[key()];//显示0-16
void delay20ms()
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<10;j++);
}
uchar key()
{
uchar i;
char code keycode[]= {