标题: 矩阵键盘问题? [打印本页]
作者: king@ 时间: 2016-11-30 20:12
标题: 矩阵键盘问题?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};
uchar Pre_KeyNO = 16,KeyNO = 16;
void DelayMS(uint ms)
{
uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void Keys_Scan()
{
uchar Tmp;
P1 = 0x0f;
DelayMS(1);
Tmp = P1 ^ 0x0f;
switch(Tmp)
{
case 1: KeyNO = 0; break;
case 2: KeyNO = 1; break;
case 4: KeyNO = 2; break;
case 8: KeyNO = 3; break;
default: KeyNO = 16;
}
P1 = 0xf0;
DelayMS(1);
Tmp = P1 >> 4 ^ 0x0f;
switch(Tmp)
{
case 1: KeyNO += 0; break;
case 2: KeyNO += 4; break;
case 4: KeyNO += 8; break;
case 8: KeyNO += 12;
}
}
void main()
{
P0 = 0x00;
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0)
Keys_Scan();
if(Pre_KeyNO != KeyNO)
{
P0 = ~DSY_CODE[KeyNO];
Pre_KeyNO = KeyNO;
}
DelayMS(100);
}
}
下面这段程序是什么意思?有谁能详细跟我解释一下吗?
P1 = 0xf0;
if(P1 != 0xf0)
Keys_Scan();
-
QQ截图20161130201321.png
(16.51 KB, 下载次数: 81)
作者: 一米阳光我和你 时间: 2016-11-30 20:42
确认按键是否弹起
作者: zl2168 时间: 2016-11-30 20:56
本帖最后由 zl2168 于 2016-11-30 21:01 编辑
下面这段程序是什么意思?有谁能详细跟我解释一下吗?
P1 = 0xf0;//列线置低电平
if(P1 != 0xf0)//若P1不等于0xf0(前输出数据),表明有键按下(有键按下时会改变P1口状态)
Keys_Scan();//调用键扫描子函数
作者: zl2168 时间: 2016-11-30 21:04
我给你推荐的案例程序语句条条有注解,便于阅读理解,便于自学。
作者: zl2168 时间: 2016-11-30 21:06
本帖最后由 zl2168 于 2016-11-30 21:08 编辑
实例62 4×4矩阵式键盘
与你的几乎一模一样
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
作者: king@ 时间: 2016-11-30 21:08
zl2168 发表于 2016-11-30 20:56
下面这段程序是什么意思?有谁能详细跟我解释一下吗?
P1 = 0xf0;//列线置低电平
if(P1 ...
明白!多谢!
作者: zl2168 时间: 2016-11-30 21:09
本帖最后由 zl2168 于 2016-11-30 21:11 编辑
你在本网站提了许多问题,我给你推荐的张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,有100个案例,几乎覆盖了你所有的问题,难道还不值得你去看看这本书吗?
一个一个问,多吃力啊!还大多得不到满意解答,何必呢?
作者: king@ 时间: 2016-11-30 21:28
学什么看相应的内容,不懂提问,百度,
作者: king@ 时间: 2016-11-30 21:29
尽力学习理解
作者: 咆哮的阿杰 时间: 2016-11-30 23:40
switch(Tmp)
{
case 1: KeyNO = 0; break;
case 2: KeyNO = 1; break;
case 4: KeyNO = 2; break;
case 8: KeyNO = 3; break;
default: KeyNO = 16;
}
我怎么觉得你这段程序有问题呢?高位给0,低位给1。
然后我按下一个键,这个键对应的行和列都是0吧,也就是说,低位只有一个数为0,
那么tmp怎么会出现1,2,4,8呢。
除非楼主的单片机键盘是按下去接到了高电平
作者: xsynet 时间: 2016-12-1 08:32
P1 = 0xf0;//给口赋值
if(P1 != 0xf0)说明P1口的值改变了,有键按下,P1口值才会改变
Keys_Scan();//调用键盘扫描函数
作者: sss123 时间: 2016-12-1 13:13
不是单片机的附带资料里都会有这些资料吗~
作者: 6549649 时间: 2016-12-1 20:05
确认按键是否弹起
作者: 问问1 时间: 2016-12-1 20:41
把程序重新好好地找找错误
作者: 问问1 时间: 2016-12-1 20:41
作者: king@ 时间: 2016-12-1 20:58
以实测,程序没有问题!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |