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