导航:首页 > 操作系统 > 单片机矩阵键盘代码44

单片机矩阵键盘代码44

发布时间:2022-08-09 09:23:09

① 51单片机矩阵键盘(c语言) 求大神啊~

uchar
KeyScan(void)
{
static
uchar
k=0;
//由于函数在调用结束时k值已返回给函数,k作为局部变量即可
/////////
uchar
Trg,Trg1,Trg2,Cont1,Cont2;
uchar
ReadData1,ReadData2;
/////////
P3=0x0f;
ReadData1=P3^0x0f;
Trg1=ReadData1&(ReadData1^Cont1);
//触发键
Cont1=ReadData1;
//长按键
/////////
P3=0xf0;
ReadData2=P3^0xf0;
Trg2=ReadData2&(ReadData2^Cont2);
Cont2=ReadData2;
Trg=Trg1+Trg2;
////////
switch(Trg)
{
case
0x81:{k=1;break;}
case
0x41:{k=2;break;}
case
0x21:{k=3;break;}
case
0x11:{k=4;break;}
case
0x82:{k=5;break;}
case
0x42:{k=6;break;}
case
0x22:{k=7;break;}
case
0x12:{k=8;break;}
case
0x84:{k=9;break;}
case
0x44:{k=10;break;}
case
0x24:{k=11;break;}
case
0x14:{k=12;break;}
case
0x88:{k=13;break;}
case
0x48:{k=14;break;}
case
0x28:{k=15;break;}
case
0x18:{k=16;break;}
default:{k=0;break;}
}
return(k);
}
//在主函数里面直接调用keyboard()函数,直接返回键值;
然后在数码管显示。
好好的研究下这个键盘程序,
这种方式很程序很精炼、简单
绝对可以调出来。

② 单片机中的4×4矩阵键盘的键值怎么求

单片机书上应该有讲的哦,多查资料。
既然是4x4,即4行4列了,共需要8个I/O口,有8bit数据(如高四位为行4bit,低四位为列4bit)位:xxxx xxxx。还要结合你的程序来编码键值,如果有键按下了,查询所有按键的所连接的I/O口电平状态,每个按键需要两个I/O口,一端连接行(行4bit之一),一端连接列(列4bit之一);若此时按键的电平状态为0010 0001,即十六进制数据0x21,按下的按键所对应的键值编码即为0x21。当然为了使用方便,在确定了按下按键的编码后,可对其赋值,我要将它赋值为数字键8,方便后续编程使用。例:

//获取键值编码,由于确定哪个按键按下
uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}

while(1)
{
key=keyscan();//调用键盘扫描,

//keyVal=0~15表示按键对应的功能
switch(key)
{
case 0x7e:keyVal=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:keyVal=1;break;//1
case 0x7b:keyVal=2;break;//2
case 0x77:keyVal=3;break;//3
case 0xbe:keyVal=4;break;//4
case 0xbd:keyVal=5;break;//5
case 0xbb:keyVal=6;break;//6
case 0xb7:keyVal=7;break;//7
case 0xde:keyVal=8;break;//8
case 0xdd:keyVal=9;break;//9
case 0xdb:keyVal=10;break;//a
case 0xd7:keyVal=11;break;//b
case 0xee:keyVal=12;break;//c
case 0xed:keyVal=13;break;//d
case 0xeb:keyVal=14;break;//e
case 0xe7:keyVal=15;break;//f
}

③ 求一个单片机4X4矩阵键盘扫描程序,C语言的。

淘bao 旺铺: 广州华电 单片机学习板 单片机外围学习模块/传感器模块
//4*4键盘检测程序,按下键后相应的代码显示在数码管上
#include<reg51.h>
sbit beep=P2^3;
sbit la=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
display(unsigned char num)
{
P0=table[num];
la=1;
la=0;
P0=0xc0;
wela=1;
wela=0;
}
void main()
{
la=0;
wela=0;
while(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
P1=0xfe;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
}
}
}
}

④ 单片机矩阵键盘程序求解释和修正!

没有硬件电路,单从程序来看应该没错。我加了注释,你可以参考下。
#include<STC12C5A60S2.h>
char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x00,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void delayms(int xms)
{
int i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void display(char num)
{
P1=table[num]; //段选数据
}
void matrixkeyscan()
{
char temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//说明有按键按下
{
delayms(10);//延时,去抖动
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//说明按键被持续按下
{
temp=P3;//记录P3口状态
switch(temp)//根据现在的状态判断哪个按键被按下
{
case 0xee: //p3^4被按下
key=0;
break;
case 0xde: //p3^5
key=1;
break;
case 0xbe://p3^6
key=2;
break;
case 0x7e://p3^7
key=3;
break;
}
while(temp!=0xf0)//按键松开之后跳出循环
{
temp=P3;
temp=temp&0xf0;
}
display(key);//显示
}
}
P3=0xfd;
{......};
P3=0xfb:
{......};
P3=0xf7;
{......};

void main()
{
P0M1 = 0x00;//推挽输出的定义
P0M0 = 0x0f;//推挽输出的定义
P0=0x0f;
while(1)
{
matrixkeyscan();//不停调用键盘扫描程序
}
}

⑤ 求51单片机矩阵4*4键盘程序,P0口接一个数码管,P3口接矩阵键盘,C语言的

#include<reg51.h>
unsigned char keyval,keynum=0;
unsigned char distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void t1isr() interrupt 3
{
unsigned char sccode,recode;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P3=0x0f; //发0扫描,列线输入
if ((P3 & 0x0f) != 0x0f)keynum++; //有键按下
else keynum=0;
if(keynum>5) //按键保持在5次中断以上
{
keynum=0;
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
getkey((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
getkey(0);
}
void getkey(unsigned char key)
{
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}
main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyval!=0xff)P0=distab[keyval];
}

}

⑥ 谁能给我讲讲单片机4X4矩阵键盘的编程步骤(最好有例程注解),小弟没分了!希望大家能帮帮我…

4*4的键盘

先说下,一个键盘吧,延时去抖动,就是说,按键按下的时候是低电平,那么在等10-20ms确定是不是按下了按键,按下之后一般都是先等按键释放,释放只有执行程序,这样就能确保下次按键的时候跟本次按键的操作不会干扰了

/*-----------------------------------------------
功能:按一次按键,led点亮,再按一次熄灭,以此循环
------------------------------------------------*/
#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbitKEY=P3^2;//定义按键输入端口
sbitLED=P0^0;//定义led输出端口

voidDelayUs2x(unsignedchart);//函数声明
voidDelayMs(unsignedchart);
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{

KEY=1;//按键输入端口电平置高
while(1)//主循环
{
if(!KEY)//如果检测到低电平,说明按键按下
{
DelayMs(10);//延时去抖,一般10-20ms
if(!KEY)//再次确认按键是否按下,没有按下则退出
{
while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待
{
LED=!LED;//释放则执行需要的程序
}
}
}
//主循环中添加其他需要一直工作的程序

}
}
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{

while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}

至于4*4的键盘的话,那就要先确定按键到底是哪一个,举个例子啊,比如说你先给1个列的按键给个低电平,然后去检测,第一列的四个按键,是不是按下了,如果第一个按下了,延时去抖动,然后再确定是否按下,然后执行,操作,

同样,就能确定16个键 了

#include<reg52.h>
sbita=P1^0;
sbitb=P1^1;
sbitc=P1^2;
sbitd=P1^3;
unsignedcharcodetable[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

voidmain()
{unsignedintt=1000;
P2=0x00;

while(1)
{

P1=0xef;
while(P1!=0xef)
{
while(t--);t=1000;
while(P1!=0xef)
{switch(P1)
{
case0xee:P0=table[0];break;
case0xed:P0=table[1];break;
case0xeb:P0=table[2];break;
case0xe7:P0=table[3];break;
}
while(P1!=0xef);
}


}

P1=0xdf;
while(P1!=0xdf)
{
while(t--);t=1000;
while(P1!=0xdf)
{switch(P1)
{
case0xde:P0=table[4];break;
case0xdd:P0=table[5];break;
case0xdb:P0=table[6];break;
case0xd7:P0=table[7];break;
}
while(P1!=0xdf);
}


}
P1=0xbf;
while(P1!=0xbf)
{
while(t--);t=1000;
while(P1!=0xbf)
{switch(P1)
{
case0xbe:P0=table[0];break;
case0xbd:P0=table[1];break;
case0xbb:P0=table[2];break;
case0xb7:P0=table[3];break;
}
while(P1!=0xbf);
}


}
P1=0x7f;
while(P1!=0x7f)
{
while(t--);t=1000;
while(P1!=0x7f)
{switch(P1)
{
case0x7e:P0=table[4];break;
case0x7d:P0=table[5];break;
case0x7b:P0=table[6];break;
case0x77:P0=table[7];break;
}
while(P1!=0x7f);
}


}

}
}

自己写的,怎么看着乱七八糟的,你自己理一下就明白了

⑦ 单片机 4*4矩阵键盘

这个电路图,只是你使用哪几个口在程序中对应上就可以了

程序

//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍

#include<reg52.h>//包含头文件

#defineucharunsignedchar

#defineuintunsignedint

unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

ucharkeyscan(void);

voiddelay(uinti);

voidmain()

{

ucharkey;

P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符

while(1)

{

key=keyscan();//调用键盘扫描,

switch(key)

{

case0x7e:P0=dofly[0];break;//0按下相应的键显示相对应的码值

case0x7d:P0=dofly[1];break;//1

case0x7b:P0=dofly[2];break;//2

case0x77:P0=dofly[3];break;//3

case0xbe:P0=dofly[4];break;//4

case0xbd:P0=dofly[5];break;//5

case0xbb:P0=dofly[6];break;//6

case0xb7:P0=dofly[7];break;//7

case0xde:P0=dofly[8];break;//8

case0xdd:P0=dofly[9];break;//9

case0xdb:P0=dofly[10];break;//a

case0xd7:P0=dofly[11];break;//b

case0xee:P0=dofly[12];break;//c

case0xed:P0=dofly[13];break;//d

case0xeb:P0=dofly[14];break;//e

case0xe7:P0=dofly[15];break;//f

}

}

}

ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法

{

ucharcord_h,cord_l;//行列值

P3=0x0f;//行线输出全为0

cord_h=P3&0x0f;//读入列线值

if(cord_h!=0x0f)//先检测有无按键按下

{

delay(100);//去抖

if(cord_h!=0x0f)

{

cord_h=P3&0x0f;//读入列线值

P3=cord_h|0xf0;//输出当前列线值

cord_l=P3&0xf0;//读入行线值

return(cord_h+cord_l);//键盘最后组合码值

}

}return(0xff);//返回该值

}

voiddelay(uinti)//延时函数

{

while(i--);

}

不明白的在联系我,也可以直接访问我的Blog:hi..com/lyzhangxiang

⑧ 51单片机矩阵键盘程序:想把按键的值一一存到数组里,最后按下某个按键时,把数组里的某个数显示出来,

给一个键盘扫描程序参考:
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
ucharkbscan(void)
{
unsignedcharsccode,recode;
P1=0x0f;//发0扫描,列线输入
if((P2&0x0f)!=0x0f)//有键按下
{
delay(20);//延时去抖动
if((P1&0x0f)!=0x0f)
{
sccode=0xef;//逐行扫描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x0f)!=0x0f)
{
recode=(P1&0x0f)|0xf0;
while((P1&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//无键按下,返回0
}

uchargetkey(void)
{
unsignedcharkey,keyval=0xff;
key=kbscan();
switch(key)
{
case0x11:keyval=1;break;
case0x12:keyval=2;break;
case0x14:keyval=3;break;
case0x18:keyval=10;break; //+
case0x21:keyval=4;break;
case0x22:keyval=5;break;
case0x24:keyval=6;break;
case0x28:keyval=11;break; //-
case0x41:keyval=7;break;
case0x42:keyval=8;break;
case0x44:keyval=9;break;
case0x48:keyval=12;break; //清除
case0x81:keyval=13;break;
case0x82:keyval=0;break;
case0x84:keyval=14;break; //小数点
case0x88:keyval=15;break; //确认
default:keyval=16;break;
}
return(keyval);
}

⑨ 【求解释】单片机最简单的矩阵键盘代码(只有三句)

这是完整的矩阵键盘代码没错,不过并不难理解,假设按下的是连接P1.1和P1.5的按键,那么各行代码的二进制结果为:
第一行:P1 = 1111 0000
第二行:KH = 1101 0000
第三行:P1 = 0000 1111
第四行:KL = 0000 1101
第五行:Key = 1101 0000 | 0000 1101 = 1101 1101
高位和低位“0”的位置不同,位或得到的结果也不同,这样就能得到不同的键值,作为判断按键位置的依据。

阅读全文

与单片机矩阵键盘代码44相关的资料

热点内容
程序员代码合适吗 浏览:279
复利计算法律保护 浏览:736
代号f2服务器连接失败怎么搞 浏览:956
旋律云我的世界服务器靠谱吗 浏览:63
pdf降低大小 浏览:230
魔兽世界中文如何外服服务器 浏览:924
kindle转pdf格式 浏览:60
单片机自动控制 浏览:673
需要很多文件夹怎么快速的新建啊 浏览:67
算法申请着作权 浏览:213
以前手机号换了要怎么登录农行app 浏览:192
线切割编程系统怎么绘画 浏览:234
如何搭建云服务器异地容灾 浏览:923
黄金拐点指标源码 浏览:92
算法导论第九章 浏览:277
鸽子为什么生成服务器没反应 浏览:491
freebsdnginxphp 浏览:216
噪声消除算法 浏览:608
vue类似电脑文件夹展示 浏览:116
后备服务器有什么功效 浏览:273