51单片机矩阵键盘

合集下载

51单片机矩阵键盘原理

51单片机矩阵键盘原理

51单片机矩阵键盘原理51单片机矩阵键盘原理矩阵键盘是一种常用的输入设备,可以通过少量的I/O口控制多个按键。

51单片机作为嵌入式系统中常用的控制器,也可以通过控制矩阵键盘来实现输入功能。

1. 矩阵键盘的结构矩阵键盘由多个按键组成,每个按键都有一个引脚与其他按键共用,形成了一个按键矩阵。

例如,4x4的矩阵键盘有16个按键,其中每行和每列各有4个引脚。

2. 矩阵键盘的工作原理当用户按下某一个按键时,该按键所在行和列之间会形成一个电路通路。

这时,51单片机可以通过扫描所有行和列的电路状态来检测到用户所按下的具体按键。

具体实现过程如下:(1)将每一行引脚设置为输出状态,并将其输出高电平;(2)将每一列引脚设置为输入状态,并开启上拉电阻;(3)逐一扫描每一行引脚,当发现某一行被拉低时,则表示该行对应的某一个按键被按下;(4)记录下该行号,并将该行引脚设置为输入状态,其余行引脚设置为输出状态;(5)逐一扫描每一列引脚,当发现某一列被拉低时,则表示该列对应的是刚才所记录下的行号及其对应的按键;(6)通过行号和列号确定具体按键,并进行相应的处理。

3. 代码实现下面是一个简单的51单片机矩阵键盘扫描程序:```c#include <reg52.h> //头文件sbit row1 = P1^0; //定义引脚sbit row2 = P1^1;sbit row3 = P1^2;sbit row4 = P1^3;sbit col1 = P1^4;sbit col2 = P1^5;sbit col3 = P1^6;sbit col4 = P1^7;unsigned char keyscan(void) //函数定义{unsigned char keyvalue; //定义变量while(1) //循环扫描{row1=0;row2=row3=row4=1; //设置行状态 if(col1==0){keyvalue='7';break;} //读取按键值 if(col2==0){keyvalue='8';break;}if(col3==0){keyvalue='9';break;}if(col4==0){keyvalue='/';break;}row2=0;row1=row3=row4=1;if(col1==0){keyvalue='4';break;}if(col2==0){keyvalue='5';break;}if(col3==0){keyvalue='6';break;} if(col4==0){keyvalue='*';break;}row3=0;row1=row2=row4=1; if(col1==0){keyvalue='1';break;} if(col2==0){keyvalue='2';break;} if(col3==0){keyvalue='3';break;} if(col4==0){keyvalue='-';break;}row4=0;row1=row2=row3=1; if(col1==0){keyvalue='C';break;} if(col2==0){keyvalue='0';break;} if(col3==0){keyvalue='=';break;} if(col4==0){keyvalue='+';break;}}return keyvalue; //返回按键值}void main() //主函数{unsigned char key;while(1) //循环读取{key = keyscan(); //调用函数}}```以上代码实现了一个简单的矩阵键盘扫描程序,可以通过调用`keyscan()`函数来获取用户所按下的具体按键值。

51单片机矩阵键盘代码

51单片机矩阵键盘代码

#include <reg51.h>#define uchar unsigned char#define uint unsigned intvoid dlms (void);uchar kbscan(void);/* 函数说明*/void main (void){uchar key;while (1){key=kbscan();/*调键扫描函数,返回键码送key保存*/dlms(); }}void dlms (void) /* 延时*/{uchar i;for (i=200;i>0;i--){}}uchar kbscan (void) /* 键盘扫描函数*/{uchar sccode, recode;P1=0xf0; /* P1.0~P1.3发全0,P1.4~P1.7输入*/ if((P1 & 0xf0)!=0xf0) /* 如P1口高四位不全为1有键按下*/{dlms ( );/* 延时去抖动*/if ((P1 & 0xf0)!=0xf0) /*再读输入值*/{sccode=0xfe /*最低位置为0*/while((sccode & 0x10)!=0) /*不到最后一行循环*/{P1=sccode;/*P1口输出扫描码*/If ((P1 & 0xf0)!=0xf0) /*如P1.4~P1.7不为全1,该行有键按下*/ {recode = P1 & 0xf0; / * 保留P1口高四位输入值(列码)*/ sccode= sccode& 0x0f; / * 保留扫描码低四位(行码)*/return (sccode+recode);/* 行码+列码=键编码返回主程序*/}elsesccode=(sccode <<1)| 0x01;/* 如该行无键按下,查下一行,行扫描值左移一位*/ }}}return(0);/* 无键按下,返回值为0 */}。

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51下面是51单片机使用4×4矩阵键盘的汇编程序,并在数码管的最后一位显示一个字符:```ORG 0 ;程序从地址0开始MOV P1,#0FFH ;P1口设置为输入口MOV P0,#0FH ;P0口设置为输出口LOOP:MOV A,P1 ;读取P1口的值CJNE A,#0FFH,KEY_PRESSED ;判断是否有按键按下SJMP LOOP ;如果没有按键按下,继续循环KEY_PRESSED:MOV R0,A ;保存按键的值CLR P0.0 ;选定行0MOV A,P1ANL A,#0F0H ;按位与运算,保留列位的值CJNE A,#0F0H,COL0 ;判断是否有按键按下在第0列MOV A,#'0' ;如果在第0列按下按键,则A的值为0JMP DISP ;跳转到显示程序COL0:CLR P0.1 ;选定行1MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL1 ;判断是否有按键按下在第1列MOV A,#'1' ;如果在第1列按下按键,则A的值为1JMP DISP ;跳转到显示程序COL1:CLR P0.2 ;选定行2MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL2 ;判断是否有按键按下在第2列MOV A,#'2' ;如果在第2列按下按键,则A的值为2JMP DISP ;跳转到显示程序COL2:CLR P0.3 ;选定行3MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL3 ;判断是否有按键按下在第3列MOV A,#'3' ;如果在第3列按下按键,则A的值为3JMP DISP ;跳转到显示程序COL3:CLR P0.4 ;选定行4MOV A,P1ANL A,#0F0H4MOV A,#'4' ;如果在第4列按下按键,则A的值为4 JMP DISP ;跳转到显示程序COL4:CLR P0.5 ;选定行5MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL5 ;判断是否有按键按下在第5列 MOV A,#'5' ;如果在第5列按下按键,则A的值为5 JMP DISP ;跳转到显示程序COL5:CLR P0.6 ;选定行6MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL6 ;判断是否有按键按下在第6列 MOV A,#'6' ;如果在第6列按下按键,则A的值为6 JMP DISP ;跳转到显示程序COL6:CLR P0.7 ;选定行7MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL7 ;判断是否有按键按下在第7列 MOV A,#'7' ;如果在第7列按下按键,则A的值为7 JMP DISP ;跳转到显示程序COL7:MOV A,#00HJMP EXIT ;如果没有按下任何键,退出程序DISP: ;数码管显示程序MOV R1,#100B ;延时计数器初始化MOV P2,A ;把按键值存入P2口MOV A,#07HANL A,P0 ;从P0口读取选定的行值MOV P0,A ;根据选定的行值输出相应的值ACALL DELAY ;调用延时程序MOV P0,#0FH ;关闭所有行DJNZ R1,$ ;当延时计数器不为0时,继续延时MOV A,#0FHMOV P0,A ;清除所有显示JMP LOOP ;跳转回主程序EXIT:MOV P2.7,1 ;在数码管的最后一位显示字符1SJMP EXIT ;无限循环DELAY: ;延时程序MOV R2,#75DMOV R3,#200D DELAY3:DJNZ R3,$DJNZ R2,DELAY2 RET```。

基于51单片机的4-4矩阵键盘字符输入

基于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单片机矩阵键盘

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

51单片机矩阵按键程序4 4

51单片机矩阵按键程序4 4

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。

//单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。

51只是一个学习的基础平台,你懂得。

//程序在关键的位置添加了注释。

//用//11111111111111111代表第一个程序。

//2222222222222222222222222代表第二个程序,以此类推//1111111111111111111111111111111111111111111111111111111111111111111//1111111111111111111111111111111111111111111111111111111111111111111/****************************************************************************** ** 实验名: 矩阵键盘实验* 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3* 实验效果: 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

* 注意:******************************************************************************* /#include<reg51.h>#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;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(); //延时10msvoid KeyDown(); //检测按键函数/****************************************************************************** ** 函数名: main* 函数功能: 主函数* 输入: 无* 输出: 无******************************************************************************* /void main(void){LSA=0; //给一个数码管提供位选LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=DIG_CODE[KeyValue];}}/****************************************************************************** ** 函数名: KeyDown* 函数功能: 检测有按键按下并读取键值* 输入: 无* 输出: 无******************************************************************************* /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++;}}}}/****************************************************************************** ** 函数名: 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--);}。

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法在使用51单片机控制矩阵键盘同时驱动数码管显示的过程中,可能会遇到一些常见的问题。

以下是一些可能的问题及相应的解决方法:按键无法正常响应:* 问题可能原因:接线错误、按键损坏、软件扫描不到按键信号。

* 解决方法:检查按键连接是否正确,确保按键没有损坏。

在软件中进行适当的按键扫描,确保能够正确检测到按键的状态。

数码管显示异常或不亮:* 问题可能原因:数码管接线问题、数码管损坏、数码管驱动程序错误。

* 解决方法:仔细检查数码管的接线是否正确,确保数码管没有损坏。

检查数码管的驱动程序,确保它按照正确的顺序和时序进行驱动。

按键重复响应或漏按现象:* 问题可能原因:按键抖动、软件扫描速度过快。

* 解决方法:在软件中增加适当的按键抖动延时,确保在按键按下或抬起时只响应一次。

调整软件扫描速度,避免扫描间隔过短导致的重复响应。

矩阵键盘的多个按键同时按下导致混乱:* 问题可能原因:矩阵键盘硬件连接错误、软件扫描算法问题。

* 解决方法:检查矩阵键盘的硬件连接,确保矩阵行和列没有短路或断路。

调整软件扫描算法,确保同时按下多个按键时能够正确识别。

数码管显示不正常的数字或乱码:* 问题可能原因:程序错误、数码管接线错误。

* 解决方法:仔细检查程序,确保数码管段选和位选的控制逻辑正确。

检查数码管的接线,确保每个数码管的连接都正确。

在解决问题时,建议逐步排除可能的原因,通过调试工具、逻辑分析仪或输出调试信息的方式来定位问题。

另外,仔细查阅51单片机的数据手册和相关文档,以确保硬件连接和软件设计都符合标准。

基于51单片机的六层电梯c语言矩阵键盘控制系统

基于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单片机矩阵键盘原理

51单片机矩阵键盘原理

51单片机矩阵键盘原理介绍在嵌入式系统中,矩阵键盘是一种常见的输入装置。

51单片机是广泛使用的一种微控制器,结合矩阵键盘可以实现各种应用。

本文将详细介绍51单片机矩阵键盘的原理及其工作方式。

什么是矩阵键盘?矩阵键盘是将一组按钮布置成矩阵形式,以减少输入引脚的数量。

每个按钮在矩阵键盘中都会被分配一个坐标,通过扫描行和列,可以确定用户按下的是哪个按钮。

51单片机的输入输出结构51单片机具有强大的输入输出能力,可以连接各种外设。

在使用矩阵键盘时,通常使用IO口进行输入和输出操作。

矩阵键盘的接线方式将矩阵键盘与51单片机连接时,需要将键盘的行和列引脚分别连接到单片机的IO 口。

通过对行进行扫描,再根据列的输入状态判断按钮是否按下。

这种接线方式可以大大减少所需的IO口数量。

矩阵键盘的扫描原理矩阵键盘的扫描原理是通过不断扫描行并读取列的状态来判断按钮是否按下。

具体步骤如下: 1. 将所有行引脚设为输出,输出高电平。

2. 逐个扫描行,将当前行引脚设为低电平。

3. 读取所有列引脚的状态,如果有低电平表示有按钮按下。

4. 如果有按钮按下,则根据行和列的坐标确定按下的按钮。

51单片机矩阵键盘的实现以下是使用51单片机实现矩阵键盘的基本步骤: 1. 将行和列引脚连接到单片机的IO口。

2. 初始化IO口的状态。

3. 在主程序中进行循环扫描,根据扫描结果执行相应的操作。

优化矩阵键盘的扫描速度为了提高矩阵键盘的扫描速度,可以采用以下优化方法: 1. 使用硬件定时器来定时扫描行,减少CPU的负载。

2. 使用中断方式处理按键事件,从而减少程序中的轮询操作。

3. 将矩阵键盘的行和列布局进行优化,减少扫描的时间复杂度。

利用矩阵键盘实现密码输入矩阵键盘广泛应用于密码输入功能。

通过将矩阵键盘与51单片机结合,可以实现密码的输入、验证等功能。

以下是一个简单的密码输入的实现步骤: 1. 设置一个密码数组用于存储密码。

2. 使用矩阵键盘获取用户输入的密码,并依次存储到临时数组中。

51单片 矩阵键盘按键程序

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单片机矩阵键盘设计

51单片机矩阵键盘设计
一、引言
AT89C51单片机矩阵键盘设计是嵌入式系统中一个重要的技术,它的
作用是以矩阵形式把外部按键与MCU相连,使得系统可以对外部的按键进
行检测和响应。

矩阵键盘设计在可编程嵌入式系统的设计中占有重要的地位,如智能交通系统、智能家居系统、航空电子系统等。

本文主要介绍了矩阵键盘设计中硬件电路的设计,包括按键、拉电阻、和矩阵编码等,同时给出系统的控制算法,使得系统可以实现有效的按键
检测和响应。

二、矩阵键盘概述
矩阵键盘是将多个按键排布成列行形式进行连接,一般来说,矩阵键
盘是由按键、拉电阻、矩阵编码器和控制器组成,按键是系统中重要的部件,其作用是将外部输入信号传递给控制器。

拉电阻起到的作用是防止按
键耦合,一般可以使用4.7KΩ拉电阻来防止按键耦合。

矩阵编码器用来
识别按键的状态,通常通过硬件把按键信号编码为数字信号,输入到处理
器或控制器。

控制器用来实现按键信号的检测,通过定义硬件定时器和软
件定时器,实现按键检测和处理。

1、硬件电路设计
应用AT89C51单片机矩阵键盘。

基于51单片机的矩阵键盘

基于51单片机的矩阵键盘
case 3:wei_1=1;wei_2=0;wei_3=1;wei_4=1;break;
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单片机的矩阵按键扫描的设计C语言程序

51单片机的矩阵按键扫描的设计C语言程序

51单片机的矩阵按键扫描的设计C语言程序以下为一个基于51单片机的矩阵按键扫描的设计C语言程序:```c#include <reg51.h>//定义端口连接到矩阵键盘sbit col1 = P2^0;sbit col2 = P2^1;sbit col3 = P2^2;sbit row1 = P2^3;sbit row2 = P2^4;sbit row3 = P2^5;sbit row4 = P2^6;//声明按键函数char read_keypad(;void maiwhile (1)char key = read_keypad(; // 读取按键值//根据按键值进行相应操作switch(key)case '1'://第一行第一列按键逻辑//在此处添加相应的代码break;case '2'://第一行第二列按键逻辑//在此处添加相应的代码break;//继续处理其他按键//...default://未识别到按键break;}}//按键扫描函数char read_keypacol1 = 0; col2 = 1; col3 = 1; // 激活第一列if (row1 == 0) { // 第一行第一列按键被按下while (row1 == 0); //等待按键释放return '1'; // 返回按键值}if (row2 == 0) { // 第二行第一列按键被按下while (row2 == 0); //等待按键释放return '4'; // 返回按键值}if (row3 == 0) { // 第三行第一列按键被按下while (row3 == 0); //等待按键释放return '7'; // 返回按键值}if (row4 == 0) { // 第四行第一列按键被按下while (row4 == 0); //等待按键释放return '*'; // 返回按键值}col1 = 1; col2 = 0; col3 = 1; // 激活第二列//处理第二列的按键逻辑//...col1 = 1; col2 = 1; col3 = 0; // 激活第三列//处理第三列的按键逻辑//...return '\0'; // 返回空字符表示未检测到按键```以上代码中,我们使用51单片机的P2端口连接到矩阵键盘的列和行,通过扫描不同的列和检测行的状态来判断按键是否被按下。

51单片机 矩阵键盘 千百十个 加1减1

51单片机 矩阵键盘 千百十个 加1减1
break;
default: break;
}
}
}
void xianshi()//显示当前数值
{
//显示个位
P1_3=0;//开位码控制位,此段接PNP三极管8550的基极,低电平开位码。
P0=dis[ge];//显示段码
delay();//每次亮的状态为50us
P0=0xff;//清除数码管显示,因为是共阳极的,故为0xff。如不清除,则数码管上有鬼影
//51单片机控制四个数码管,P2口接4*4矩阵式键盘,采用行列翻转的原理,1键按下千位加1,5键按下千位减一,;2键按下百位加1,6键按下百位减1;
//3键按下十位加1,7键按下十位减1;4键按下个位加1,8键按下个位键1
#include<reg52.h>
#define uchar unsigned char
uchar row,col,k=0xff;//定义行、列、返回值、循环控制变量
unsigned char qian,bai,shi,ge;
sbit P1_3=P1^3;//个位位码
sbit P1_2=P1^2;//十位位码
sbit P1_1=P1^1;//百位位码
sbit P1_0=P1^0;//千位位码
break;
case 0xBd: k=7;//第二行第三列的按键按下(代号为7),数码管十位减1
if(shi==0) shi=9;
else shi=shi-1;
break;
case 0x7d: k=8;//第二行第四列的按键按下(代号为8),数码管个位减1
if(ge==0) ge=9;
else ge=ge-1;
P2=0xf0;
while((P2&0xf0)!=0xf0);//等待键释放(松手检测)

51单片机矩阵键盘的编程

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-。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

非编码键盘有分为:独立键盘和行列式(又 称为矩阵式)键盘。
按键在闭合和断开时,触点会存在抖动现象: 按键在闭合和断开时,触点会存在抖动现象:
U1
P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 13 12 15 14 31 19 18 9 17 16 P10 P11 P12 P13 P14 P15 P16 P17 INT1 INT0 T1 T0 P00 P01 P02 P03 P04 P05 P06 P07 P20 P21 P22 P23 P24 P25 P26 P27 VCC GND RXD TXD ALE/P PSEN 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 40 20 10 11 30 29
键盘的应用
1、键盘的分类 、 键盘分编码键盘和非编码键盘。 键盘分编码键盘和非编码键盘。键盘上 闭合键的识别由专用的硬件编码器实现, 闭合键的识别由专用的硬件编码器实现,并 产生键编码号或键值的称为编码键盘,如计 产生键编码号或键值的称为编码键盘, 算机键盘. 算机键盘 而靠软件编程来识别的称为非编码键盘; 而靠软件编程来识别的称为非编码键盘; 在单片机组成的各种系统中, 在单片机组成的各种系统中,用的最多的是 非编码键盘。也有用到编码键盘的。 非编码键盘。也有用到编码键盘的。
K0
P10
K4
0 4 8 C
P14
K1
1 5 9
K2
2 6
K3
3 7
K5
K6
K7
P11 P12 P13
K8
K9
K10
A K11 B
K15
89C52
EA/VP X1 X2 RESET RD WR
Hale Waihona Puke K12K13D K14 E
P15 P16
F
P17
数码管前三位显示一个跑表,从000到 999之间以1%秒速度运行,当按下一个独 立键盘时跑表停止,松开手后跑表继续运 行。(用定时器设计表)。 在上题的基础上,用另外三个独立键盘实 现按下第一个时计时停止,按下第二个时 计时开始,按下第三个是计数值清零从头 开始。 按下16个矩阵键盘依次在数码管上显示116的平方。如按下第一个显示1,第二个 显示4...
相关文档
最新文档