
你这是44键盘扫描。
key和key1分别对应行和列。
如果(key+1 && key1+1) 为真的话,则说明有按键按下。
为什么要+1呢?这和你设定的键盘扫描编码有关。
如果没有按键,则二者至少有一个为-1,表达式(key+1 && key1+1)为假,反之则为真。
……
main()
{
uchar m;
P0 = 0xFF;
P1 = 0xFF;
delay(10);
lcd_init();
lcd_pos(0);
m = 0;
while(cdis1[m]!='\0' ) {
lcd_wdat(cdis1[m]);
m++;
} //执行上面这些,液晶屏,显示什么没有?
while(1);
}
/
矩阵按键实验
实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字
S1-S4:0-3
S5-S8:4-7
S9-S12:8-B
S13-S16:C-F。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
/
#include "reg52h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue; //用来存放读取到的键值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/
函 数 名 : delay
函数功能 : 延时函数,i=1时,大约延时10us
/
void delay(u16 i)
{
while(i--);
}
/
函 数 名 : KeyDown
函数功能 : 检测有按键按下并读取键值
输 入 : 无
输 出 : 无
/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时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)) //检测按键松手检测
{
delay(1000);
a++;
}
}
}
}
/
函 数 名 : main
函数功能 : 主函数
输 入 : 无
输 出 : 无
/
void main()
{
LSA=0; //给一个数码管提供位选
LSB=0;
LSC=0;
while(1)
{
KeyDown(); //按键判断函数
GPIO_DIG=smgduan[KeyValue]; //
}
}
第一个程序,在定时中断函数中,延时,并不合适。
第二个程序,不稳定,还是按键检测,太拖拉了。
44 矩阵键盘的检测,不用写这么多的程序。
我的百度空间里面有实用的程序。
C语言的语句可以这样写
#include<stdioh>
void main()
{
float fxx;
unsigned char str[10];
fxx = 125;
sprintf(str,"%82f\n",fxx); //将125转换成82(2位小数)格式以ASCII方式存储到str字符串中
}
由于1620液晶模块支持ASCII码,所以只要将str中的内容送到1602就行了。至于1602的 *** 作我就不写了(其实我也没用过,但知道怎么用,应该不难)
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
dula=1;
//P0=table[num];
dula=0;
//delayms(500);
}
void matrixkeyscan()
{
uchar temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp != 0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
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;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp != 0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
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;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp != 0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
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;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp != 0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
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;
}
display(key);
}
}
}
void main()
{
P0=0;
dula=1;
dula=0;
P0=0xc0;
wela=1;
//P0=0xc0;
wela=0;
while(1)
{
matrixkeyscan();
}
}
if(key_l!=0xf0)
{
delay_nms(5);
key_l=P1;
……
在第4行加 while( key_l!=0xf0 );
等待按键释放,按键不放开就一直在此处等待,知道按键释放,此语句执行完。再往下执行
以上就是关于51单片机。4*4矩阵键盘程序,帮我看下if((key1+1)&&(key+1))这条语句是什么意思和在程序的作用全部的内容,包括:51单片机。4*4矩阵键盘程序,帮我看下if((key1+1)&&(key+1))这条语句是什么意思和在程序的作用、51单片机C语言编程矩阵式键盘LCD显示设计,程序没错,但在显示器上按键值不能显示,求各位大神指点指点、求助程序:51单片机矩阵键盘是否按下检测程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)