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

51单片机4×4矩阵键盘仿真哪里找,第1张

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])

}

}

}

}

//功能:4*4矩阵键盘控制LED位移显示

//槐档MCU:AT89S52

//晶振:12MHZ

#include <reg52.h>

#define uint unsigned int

#define uchar unsigned char

//延时函数

void _delay_ms(uint x)

{

uchar i

while(x--)

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

}

//键盘扫描函数

void Scan_Key(void)

{

P1=0xfe//PD口(11101111)第1行为低

if((P1&0xf0)!=0xf0)//如果不等于0X0F则有按下

{

_delay_ms(10)//延时10MS,去抖

if((P1&0xf0)!=0xf0)//如果TEMP不等于0X0F,则说明铅缺乱有键按下扮举

{

switch(P1)//判断TEMP的值

{

case 0xee:P2=0xfebreak

case 0xde:P2=0xfcbreak

case 0xbe:P2=0xf8break

case 0x7e:P2=0xf0break

}

}

}

P1=0xfd

if((P1&0xf0)!=0xf0)

{

_delay_ms(10)

if((P1&0xf0)!=0xf0)

{

switch(P1)

{

case 0xed:P2=0xe0break

case 0xdd:P2=0xc0break

case 0xbd:P2=0x80break

case 0x7d:P2=0x00break

}

}

}

P1=0xfb

if((P1&0xf0)!=0xf0)

{

_delay_ms(10)

if((P1&0xf0)!=0xf0)

{

switch(P1)

{

case 0xeb:P3=0xfebreak

case 0xdb:P3=0xfcbreak

case 0xbb:P3=0xf8break

case 0x7b:P3=0xf0break

}

}

}

P1=0xf7

if((P1&0xf0)!=0xf0)

{

_delay_ms(10)

if((P1&0xf0)!=0xf0)

{

switch(P1)

{

case 0xe7:P3=0xe0break

case 0xd7:P3=0xc0break

case 0xb7:P3=0x80break

case 0x77:P3=0x00break

}

}

}

}

void main(void)

{

while(1)

{

Scan_Key()

}

}


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

原文地址: http://outofmemory.cn/yw/12568695.html

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

发表评论

登录后才能评论

评论列表(0条)

保存