194027lm 发表于 2011-3-24 09:24:06

请高人帮我看看,矩阵键盘问题

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#define uchar unsigned char
#define uintunsigned int

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                                         0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
                   函数声明
------------------------------------------------*/
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
/*------------------------------------------------
                   主函数
------------------------------------------------*/
void main()
{
uchar key;
P2=0x00;      //1数码管亮 按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan();//调用键盘扫描,
switch(key)
{
case 0x7e:P1=dofly;break;//0 按下相应的键显示相对应的码值
case 0x7d:P1=dofly;break;//1
case 0x7b:P1=dofly;break;//2
case 0x77:P1=dofly;break;//3
case 0xbe:P1=dofly;break;//4
case 0xbd:P1=dofly;break;//5
case 0xbb:P1=dofly;break;//6
case 0xb7:P1=dofly;break;//7
case 0xde:P1=dofly;break;//8
case 0xdd:P1=dofly;break;//9
case 0xdb:P1=dofly;break;//a
case 0xd7:P1=dofly;break;//b
case 0xee:P1=dofly;break;//c
case 0xed:P1=dofly;break;//d
case 0xeb:P1=dofly;break;//e
case 0xe7:P1=dofly;break;//f
}
}
}
/*------------------------------------------------
            键盘扫描程序
------------------------------------------------*/

uchar keyscan(void)
{
        uchar scancode,tmpcode;
        P3 = 0xf0;                                                               // 发全0行扫描码
        if ((P3&0xf0)!=0xf0)                                        // 若有键按下
        {
               delay(1000);                                                // 延时去抖动
                if ((P3&0xf0)!=0xf0)                                // 延时后再判断一次,去除抖动影响
                {
                        scancode = 0xfe;
                        while((scancode&0x10)!=0)                // 逐行扫描
                        {
                                P3 = scancode;                                // 输出行扫描码
                                if ((P3&0xf0)!=0xf0)                // 本行有键按下
                                {
                                       
                                  
                                  tmpcode = (P3&0xf0)|0x0f;

                                        /* 返回特征字节码,为1的位即对应于行和列 */
                                       
                                        return(~(~scancode)+(~tmpcode));
                                       
                                       
                                }
                                else scancode = (scancode<<1)|0x01;                // 行扫描码左移一位
                        }   
                }
        }
        return(0);                                                                // 无键按下,返回值为0        
}

/*------------------------------------------------
               延时程序
------------------------------------------------*/
void delay(uint i)//延时函数
{
while(i--);
}

这个是我编的程序,用PROTUES仿真,只能显示0到3,从4开始按下键盘一点反应都没有,请高人指点一下,小弟不胜感激!!!谢谢大家了

点击此处下载 ourdev_624964W4LHNN.rar(文件大小:14K) (原文件名:数码管显示4×4键盘矩阵按键.rar)

194027lm 发表于 2011-3-24 09:46:39

怎么没有人啊!小弟急啊!

JQ_Lin 发表于 2011-3-25 17:05:32

回复【楼主位】194027lm
-----------------------------------------------------------------------

在上传的“数码管显示4×4键盘矩阵按键.rar” 中,没有提供 keyboard.hex 文件。

194027lm 发表于 2011-3-29 15:12:05

回复【2楼】JQ_Lin
-----------------------------------------------------------------------

忘记上传了,现在怎么传上去?指点一下!

JQ_Lin 发表于 2011-3-29 21:07:27

把仿真工程文件“数码管显示4×4键盘矩阵按键.DSN”和 keyboard.hex 一起压缩成为一个 XXX.rar 压缩文件,上传后,复制链接到回帖中来。

194027lm 发表于 2011-3-30 14:52:06

回复【4楼】JQ_Lin
-----------------------------------------------------------------------
弄上来了,麻烦大哥帮看一下,小弟感激不尽啊!


点击此处下载 ourdev_626814RW0F5J.rar(文件大小:15K) (原文件名:矩阵键盘.rar)

194027lm 发表于 2011-4-2 15:57:14

大家帮帮忙啊!

cumtgao 发表于 2011-4-2 16:54:29

你发的文件连0-3都显示不了!

cumtgao 发表于 2011-4-2 16:56:36

都发的什么啊?一个是空文件一个什么都按不了

194027lm 发表于 2011-4-6 17:52:59

可以啊!我在这里仿真可以成功啊,按最左边的这一列的按键就显示0到3啊
页: [1]
查看完整版本: 请高人帮我看看,矩阵键盘问题