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

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

给一个键盘扫描程序参考:

void delay(unsigned int a)

{

unsigned int i,j

for(i=0i<ai++)

for(j=0j<120j++)

}

uchar kbscan(void)

{

unsigned char sccode,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

}

}

}

return 0  //无键按下,返回0

}

uchar getkey(void)

{

unsigned char key,keyval=0xff

key=kbscan()

switch(key)

{

case 0x11:keyval=1break

case 0x12:keyval=2break

case 0x14:keyval=3break

case 0x18:keyval=10break //+

case 0x21:keyval=4break

case 0x22:keyval=5break

case 0x24:keyval=6break

case 0x28:keyval=11break //-

case 0x41:keyval=7break

case 0x42:keyval=8break

case 0x44:keyval=9break

case 0x48:keyval=12break //清悔圆肢除

case 0x81:keyval=13break

case 0x82:keyval=0break

case 0x84:keyval=14break //小数点

case 0x88:keyval=15break //确认

default:keyval=16break

}

return(keyval)

}

51单片机4×4矩阵键盘仿真哪里找

4*4 矩阵键盘布局如下,检测按键,然后通过 LCD1602 显示出来

第一行:The key value is

第二行:每按一次键,键值依次显示出来,整行显示完后,清屏,键值

从左开始显示

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载岁卜)

0.png

单片机源程序如下:

/**************************************************************************************

* LCD1602液晶显示实验 *

实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示

注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。

***************************************************************************************/

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

#include "lcd.h"

typedef unsigned int u16 //对数据类型进行声明定义

typedef unsigned char u8

#define LCD1602_DATAPINS P0

#define GPIO_KEY P1

u8 KeyValue,k=0,n=0,miss=1

u8 Disp[]="The key value is"

u8 cmy[17]={'1','2','3','/','4','5','6','%','7','8','9','@','*','0','#','='}

u8 dp[17]={'乎帆穗 ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','轿岁 ',' ',' ',' ',' '}

/*******************************************************************************

* 函 数 名 : main

* 函数功能 : 主函数

* 输入 : 无

* 输出 : 无

*******************************************************************************/

void KeyDown(void)

{

char a=0

GPIO_KEY=0x0f

if(GPIO_KEY!=0x0f)//读取按键是否按下

{

Lcd1602_Delay1ms(10)//延时10ms进行消抖

if(GPIO_KEY!=0x0f)//再次检测键盘是否按下

{n=1

//测试列

GPIO_KEY=0X0F

switch(GPIO_KEY)

{

case(0X07):KeyValue=0break

case(0X0b):KeyValue=1break

case(0X0d): KeyValue=2break

case(0X0e):KeyValue=3break

}

//测试行

GPIO_KEY=0XF0

switch(GPIO_KEY)

{

case(0X70):KeyValue=KeyValuebreak

case(0Xb0):KeyValue=KeyValue+4break

case(0Xd0): KeyValue=KeyValue+8break

case(0Xe0):KeyValue=KeyValue+12break

}

while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测

{

Lcd1602_Delay1ms(1)

a++

}

}

}

}

void main(void)

{

u8 i,m

LcdInit()

for(i=0i<16i++)

{

LcdWriteData(Disp[i])

}

while(miss)

{

LcdWriteCom(0x80+0x40)

KeyDown()

if(n==1)

{dp[k]=cmy[KeyValue]

n=0

k++

}

for(m=0m<16m++)

{LcdWriteData(dp[m])}

if(k==16)

{ for(m=0m<16m++)

{dp[m]=' '}

Lcd1602_Delay1ms(1000)

LcdWriteCom(0x01)

Lcd1602_Delay1ms(1000)

k=0

for(i=0i<16i++)

{

LcdWriteData(Disp[i])

}

}

}

}


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

原文地址:https://www.54852.com/yw/12376912.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存