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()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)