导航:首页 > 操作系统 > 51单片机44键盘

51单片机44键盘

发布时间:2022-08-27 08:42:24

⑴ 51单片机 c语言 关于4x4键盘编程问题。

其它你知道它是矩阵键盘就可以了,不需要关心行列是如何排列的,你写个测试程序,每按一个键就把它对应的键值打印出来。

⑵ 51单片机4×4小键盘的构造原理

其实就是一个排列组合的关系,4行和4列组成一个矩阵,根据作者的扫描软件处理不同,可以检测到单键,也可以检测到多键。比如行键全部设为高,一列一列的扫以“低电平”,此时检测行健的电平高低从而得知所按键的位置,这就是矩阵键盘的扫描原理。

⑶ 51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能

1、在程序检测到按键后,加个延时去抖,不要加松手检测。然后执行第一个按键相对应的程序。然后继续按键扫描。注意这里说的是继续,也就是继续往下检测。否则的程序就只能执行第一个按键所对应的程序了。这样,就能检测到第二次按键的键值了。


2、例程:

ucharshaomiao()
{
ucharl,h;
P1=0xf0;//获取高四位信息。在此低四位接到行。行低电平
l=P1|0x0f;
P1=l;//只把被按下键所在列置低
h=P1|0xf0;
switch(h)
{
case0xfe:h=0;break;//11111110
case0xfd:h=1;break;
case0xfb:h=2;break;
case0xf7:h=3;break;
}
switch(l)
{
case0xef:l=0;break;//11101111
case0xdf:l=1;break;
case0xbf:l=2;break;
case0x7f:l=3;break;
}
P1=0xf0;
/******关键问题解决如下******/
while(P1!=0xf0)
{
while(P1!=0xf0);//等待放开按键
delayms(50);//防止抖动
}
return(h*4+l);
}

⑷ 求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];
}

}

⑸ 51单片机 c语言 就是我现在在用4x4矩阵键盘 然后我一个按键是控制流水灯开始

这个要使用外部中断,你在程序里面改一下,加入中断,可以用你的连接矩阵键盘的io口的最高位与最低位做一个与非门作为中断信号就可以了。附上一段以前写的,你看看,不过由于我没有与非门,所以我用按键代替了中断信号。

⑹ 51单片机4*4键盘及两个七段显示器函数,要求实现加减乘除

51单片机4*4键盘及两个共阳数码管,组成一个简宜的计算器,实现加减乘除运算。proteus 软件中有一个4X4的矩阵键,就是专门为计算器设计的,使用很方便。仿真图如下所示。

⑺ 51单片机4x4键盘C语言程序运行,不知道为什么第一行按键没反应,而把注释掉的部分加进去又有反应了。

你的注释相当于加了点延时,你可以加几个NOP()就可以了。

⑻ 51单片机的4*4键盘输入的编程

呵呵,自己写的,可以根据你的引脚排布自己做适当修改,希望对你有帮助
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code num[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint z);
main()
{
while(1)
{
P1=0xfe;
if(P1==0xee||P1==0xde||P1==0xbe||P1==0x7e)
delay(5);
if(P1==0xee||P1==0xde||P1==0xbe||P1==0x7e)
{
switch(P1)
{
case 0xee: P0=num[1]; break;
case 0xde: P0=num[2] ;break;
case 0xbe: P0= num[3];break;
case 0x7e: P0=num[4] ;break;
}
}
P1=0xfd;
if(P1==0xed||P1==0xdd||P1==0xbd||P1==0x7d)
delay(5);
if(P1==0xed||P1==0xdd||P1==0xbd||P1==0x7d)
{
switch(P1)
{
case 0xed: P0=num[5]; break;
case 0xdd: P0=num[6] ;break;
case 0xbd: P0= num[7];break;
case 0x7d: P0=num[8] ;break;
}
}
P1=0xfb;
if(P1==0xeb||P1==0xdb||P1==0xbb||P1==0x7b)
delay(5);
if(P1==0xeb||P1==0xdb||P1==0xbb||P1==0x7b)
{
switch(P1)
{
case 0xeb: P0=num[9]; break;
case 0xdb: P0=num[10] ;break;
case 0xbb: P0= num[11];break;
case 0x7b: P0=num[12] ;break;
}
}
P1=0xf7;
if(P1==0xe7||P1==0xd7||P1==0xb7||P1==0x77)
delay(5);
if(P1==0xe7||P1==0xd7||P1==0xb7||P1==0x77)
{
switch(P1)
{
case 0xe7: P0=num[13]; break;
case 0xd7: P0=num[14] ;break;
case 0xb7: P0= num[15];break;
case 0x77: P0=num[0] ;break;
}
}

}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

⑼ C51单片机4X4矩阵键盘检测程序问题

可以参考:
http://hi..com/%d7%f6%b6%f8%c2%db%b5%c0/blog/item/ef086222268d4f4eac34de59.html
程序中,读取4*4矩阵键盘的函数,可以得到0~f,和16。
当读出为16的时候,即是按键放手了,可以执行对应的功能程序。

⑽ 如何利用51单片机4*4矩阵键盘和1602液晶实现四位(或者多位)的显示问题

//按4X4键盘的F键 进入设定状态
//E D 键是前后移动键
//C按键是调整数值按键
#include "reg52.h"
#define uchar unsigned char
sbit RW=P2^1;
sbit RS=P2^0;
sbit E=P2^2;
bit at=0;
uchar code shen[]={"CLOCK!"};
uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};
uchar dispbuf[8],h,m,s,counter;
void delay()
{
uchar i;
for(i=0;i<255;i++);
}

/*******写命令**********/
void lcd_wmc(uchar i)
{

P0=i;
RS=0;
RW=0;
E=0;
delay();
E=1;
}

/*******写数据***********/

void lcd_wmd(uchar i)
{

P0=i;
RS=1;
RW=0;
E=0;
delay();
E=1;
}

/*******初始化液晶*******/
void lcd_init()
{
uchar i;
lcd_wmc(0x01);
lcd_wmc(0x38);
lcd_wmc(0x0c);
lcd_wmc(0x06);
lcd_wmc(0xc9);
for(i=0;i<6;i++)
lcd_wmd(shen[i]);
lcd_wmc(0xc0);
}

/*******更新缓冲区子程序*******/
void newbuf()
{
dispbuf[0]=s%10;
dispbuf[1]=s/10;
dispbuf[3]=m%10;
dispbuf[4]=m/10;
dispbuf[6]=h%10;
dispbuf[7]=h/10;
}

/*******显示子程序**********/
void disp(uchar dispadd)
{
uchar tmp;
lcd_wmc(dispadd);
tmp=dispbuf[7];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[6];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[5];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[4];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[3];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[2];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[1];
tmp=word[tmp];
lcd_wmd(tmp);
tmp=dispbuf[0];
tmp=word[tmp];
lcd_wmd(tmp);
}

/*********************键盘子程序***********************/

uchar keypro(void)
{
uchar scanl,scanh;
P1=0x0f;//先将所有行线拉低
if((P1&0x0f)!=0x0f) //如果列线有变化
{
delay();//延迟一段时间。
if((P1&0x0f)!=0x0f)//如果此时此刻列线还有变化,说明确实有按键按下
{
scanl=0xfe;
while((scanl&0x10)!=0)
{
P1=scanl; //给P1口赋扫描码,每次只拉低一行
if((P1&0xf0)!=0xf0) //如果判断为真,则说明找到了按键按下的行
{
scanh=(P1&0xf0)|0x0f; //计算识别码
return (~scanh)+(~scanl);
}
else scanl=(scanl<<1)|0x01; //否则依次将第二,第三,第四行拉低

}
}
}
return 0;//没有按键 按下 返回0
}

/********************时间调整子程序********************/
void adjustime()
{
uchar k;
static uchar add;
k=keypro();
switch(k)
{
case 0x88: if(!at){add=0xc1;EA=0;lcd_wmc(0xc1);lcd_wmc(0x0f);at=1;}
else {lcd_wmc(0xc0);lcd_wmc(0x0c);at=0;EA=1;} break;

case 0x48: if(at)
{
if(add==0xc1){add=0xc7; lcd_wmc(add);}
else {add=add-3;lcd_wmc(add);}
}
break;

case 0x28: if(at)
{
if(add==0xc7) {add=0xc1;lcd_wmc(add);}
else {add=add+3;lcd_wmc(add);}
}
break;

case 0x18: if(at)
{
if(add==0xc1) h++;
if(h==24)
h=0;
if(add==0xc4) m++;
if(m==60)
m=0;
if(add==0xc7) s++;
if(s==60)
s=0;
newbuf();
disp(0xc0);
lcd_wmc(add);
}
break;
default: break;
}
if(k!=0)
{
while((P1&0xf0)!=0xf0)
P1=0xf0;
}

}

/*********************初始化子程序**********************/
void init()
{

TMOD=0x01;
TH0=0x4c;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
counter=0;
h=12;m=0;s=0;
dispbuf[2]=10;
dispbuf[5]=10;
}

/***************************主程序************************/

void main(void)
{
init();
lcd_init();

while(1)
{
adjustime();
if(!at)
{
//闪烁
if(counter<10)
{
dispbuf[2]=10;
dispbuf[5]=10;
}
else
{
dispbuf[2]=11;
dispbuf[5]=11;
}
//更新显示缓冲区及调用显示程序
if(counter==0)
{
newbuf();
disp(0xc0);
}
else if(counter==10)
disp(0xc0);
}
}
}

/*************************定时器0的中断**********************/
void Time0() interrupt 1 using 2 //再次强调中断子程序执行时间越短越好
{
TH0=(65536-46075)/256;
TL0=(65536-46075)%256;
counter++;
if(counter==20)
{
s++;
counter=0;
if(s==60)
{
m++;
s=0;
if(m==60)
{
h++;
m=0;
if(h==24)
h=0;
}
}

}
}
这是一个数字时钟的程序,用矩阵键盘调时

阅读全文

与51单片机44键盘相关的资料

热点内容
奶粉源箱源码什么意思 浏览:165
台州程序员兼职一般去哪些网站 浏览:386
旧版本怎么下载到新的安卓 浏览:964
flash个人网站源码下载 浏览:723
javasocketbyte 浏览:264
素描基础教程pdf 浏览:541
香港商报pdf版 浏览:426
安卓手机怎么录制吉他弹奏 浏览:382
ie文件夹缓存在哪里 浏览:264
围棋排名算法 浏览:963
zigbee加密算法 浏览:464
柏杨版资治通鉴pdf 浏览:395
事业编程序员下班时间 浏览:10
linux中命令大全 浏览:38
pic单片机学习网站 浏览:163
843除6的算法 浏览:377
arduino编程视频 浏览:744
pdf背景绿色 浏览:612
记事本dos命令 浏览:275
服务器如何搭建多个节点 浏览:328