标题: 矩阵键盘问题? [打印本页]

作者: 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)

QQ截图20161130201321.png

作者: 一米阳光我和你    时间: 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仿真一下,确认有效。
实例62 4×4矩阵式键盘.rar (44.79 KB, 下载次数: 15)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社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 编辑
king@ 发表于 2016-11-30 21:08
明白!多谢!

你在本网站提了许多问题,我给你推荐的张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,有100个案例,几乎覆盖了你所有的问题,难道还不值得你去看看这本书吗?
一个一个问,多吃力啊!还大多得不到满意解答,何必呢?

作者: king@    时间: 2016-11-30 21:28
zl2168 发表于 2016-11-30 21:09
你在本网站提了许多问题,我给你推荐的张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus ...

学什么看相应的内容,不懂提问,百度,
作者: king@    时间: 2016-11-30 21:29
king@ 发表于 2016-11-30 21:28
学什么看相应的内容,不懂提问,百度,

尽力学习理解
作者: 咆哮的阿杰    时间: 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
咆哮的阿杰 发表于 2016-11-30 23:40
switch(Tmp)
        {
                 case 1: KeyNO = 0; break;

以实测,程序没有问题!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1