51单片机。4*4矩阵键盘程序,帮我看下if((key1+1)&&(key+1))这条语句是什么意思和在程序的作用

51单片机。4*4矩阵键盘程序,帮我看下if((key1+1)&&(key+1))这条语句是什么意思和在程序的作用,第1张

你这是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单片机矩阵键盘是否按下检测程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9271588.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存