找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机入门课堂实例:数码管显示4x4矩阵键盘的键号(仿真+代码)

查看数: 20293 | 评论数: 1 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-12-25 10:11

正文摘要:

目录 数码管显示4x4矩阵键盘的键号              2 摘要              2     关键词  &n ...

回复

ID:115923 发表于 2020-3-24 20:31
------------------------------------
P1.0 P1.1 P1.2 P1.3
p1.4 S1 S5 S9 S13
P1.5 S2 S6 S10 S14
P1.6 S3 S7 S11 S15
P1.7 S4 S8 S12 S16
------------------------------------
实现原理:
当高电平端口与低电平端口短接时,高电平端口会被拉成低电平
------------------------
算法分析:
1,检查是否有键按下:
P1=f0h (即0-3置1,4-7置0)
检查P1口是否是0F0H
是,则无键按下
否,则有键按下
2,扫描按下的键值:
循环(依次将4至7口单独置0)
检查0-3口是否有低电平端
确定被按下的键
返回键值
3,键盘防抖:
抖动原因:键按下时,会产生电压的波动,持续约10MS
去抖方法:10MS扫描一次,使前后两次均有键按下
********************************************************/
#include<ytc51.h>
uchar jps,ks; //键盘缓存
/*键盘扫描程序1,检查是否有按键*/
uchar keyfun()
{
uchar key_c;
P2 = P2 & 0x03;
P2 = P2 | 0x3c;
key_c = P2;
if((key_c & 0xfc) == 0x3c) return (0);
else return(1);
}
/*键盘扫描程序2,确定按键数值*/
uchar keyscan()
{
uchar i,k;
P2 = P2 & 0x03;
P2 = P2 | 0xbc;
if((P2 & 0x3c) != 0x3c)
{
i = 0;
k = (~P2) & 0x3c;
}
else
{
P2 = P2 & 0x03;
P2 = P2 | 0x7c;
if((P2 & 0x3c) != 0x3c)
{
i = 1;
k = (~P2) & 0x3c;
}
}
k = k>>3;
if( k==4 ) k=3;
k=i*4+k+1;
return(k);
}
/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 3 /*当定时器中断时执行此函数*/
{
TH1=(0xffff-9259)/256; /*T0初始化*/
TL1=(0xffff-9259)%256;
WR = 1;
if((ks == 0) && ( keyfun() ))
{
jps = keyscan();
}
ks = keyfun();
}
/**********************************************************************
函数功能: 上电初始化函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x10;/*Time0/1为16计数器*/
TH1=(0xffff-9216)/256;/*10ms*/
TL1=(0xffff-9216)%256;/*10ms*/
TR1=1;
SCON = 0x00;//串口工作模式设置
IE=0x88; /*EA=1 ET1=1*/
P0=0xff;
P2=0xff;
}

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表