微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 给自己的实验板写的矩阵键盘程序,请前辈帮小弟找错!

给自己的实验板写的矩阵键盘程序,请前辈帮小弟找错!

时间:10-02 整理:3721RD 点击:
小弟看过郭天祥的视频后,给自己的实验板写的矩阵键盘程序,但是下载后什么反应也没有,又找不出哪里不对。请各位前辈帮小弟找找错在哪里。
程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar num,temp;
sbit dula=P3^6;
sbit wela=P3^7;
uchar code table[]={
0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 ,
0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x80 ,
0xc6 , 0xc0 , 0x86 , 0x8e , 0xff};
void delay(uint z);
void display(uchar aa);
uchar keyscan();
void main()
{
        num=17;        
        dula=1;
        P0=0xff;
        dula=0;
        wela=1;
        P2=0xfe;
        wela=0;        
        while(1)
        {
                display(keyscan());
        }
}
void display(uchar aa)
{
        dula=1;
        P0=table[aa-1];
        dula=0;               
}
uchar keyscan()
{
                P1=0xf7;
                temp=P1;
                temp=temp&0xf0;
                while(1)
                {
                        delay(5);
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                switch(temp)
                                {
                                        case 0xe0: num=1;
                                                break;        
                                        case 0xd0: num=2;
                                                break;        
                                        case 0xb0: num=3;
                                                break;        
                                        case 0x70: num=4;
                                                break;        
                                }
                        while(temp!=0xf0)
                                {
                                        temp=P1;
                                        temp=temp&0xf0;
                                }
                        }                        
                }
                P1=0xfb;
                temp=P1;
                temp=temp&0xf0;
                while(1)
                {
                        delay(5);
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                switch(temp)
                                {
                                        case 0xe0: num=5;
                                                break;        
                                        case 0xd0: num=6;
                                                break;        
                                        case 0xb0: num=7;
                                                break;        
                                        case 0x70: num=8;
                                                break;        
                                }
                        while(temp!=0xf0)
                                {
                                        temp=P1;
                                        temp=temp&0xf0;
                                }
                        }                        
                }
                        
                P1=0xfd;
                temp=P1;
                temp=temp&0xf0;
                while(1)
                {
                        delay(5);
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                switch(temp)
                                {
                                        case 0xe0: num=9;
                                                break;        
                                        case 0xd0: num=10;
                                                break;        
                                        case 0xb0: num=11;
                                                break;        
                                        case 0x70: num=12;
                                                break;        
                                }
                        while(temp!=0xf0)
                                {
                                        temp=P1;
                                        temp=temp&0xf0;
                                }
                        }                        
                }
                        
                P1=0xfe;
                temp=P1;
                temp=temp&0xf0;
                while(1)
                {
                        delay(5);
                        temp=P1;
                        temp=temp&0xf0;
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                switch(temp)
                                {
                                        case 0xe0: num=13;
                                                break;        
                                        case 0xd0: num=14;
                                                break;        
                                        case 0xb0: num=15;
                                                break;        
                                        case 0x70: num=16;
                                                break;        
                                }
                        while(temp!=0xf0)
                                {
                                        temp=P1;
                                        temp=temp&0xf0;
                                }
                        }
                                       
                }
return num;
}
void delay(uint z)
{
        uint x,y;
        for(x=110;x>0;x--)
                for(y=z;y>0;y--);
}

               

我也看着郭天祥的视频在温习,感觉他这里写的太不简洁了。
可以精简一下的;

/*矩阵键盘扫描程序:线反转法(经典矩阵键盘检测程序)
动态扫描显示数码管、线反转法检测4×4矩阵键盘
P1口流水灯实时显示P3口电平(熄灭表示高电平、点亮表示低电平)
用程序状态寄存器PSW中的PSW^5,作为全局标志位
// Header:P3口低4位接矩阵键盘行、高4位接矩阵键盘列
// File Name:经典矩阵键盘检测程序(线反转法)
// Author:田
// Date:2012年12月7日                             */
#include<reg52.h>//STC89C52RC 头文件
#include<intrins.h>//_crol_函数的头文件
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
uchar num;//定义全局变量
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阳极数码管字符表
void delay(uint xms)  //延时函数
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++);
}
void display(num)          //显示函数
{
        uchar numwe,xwei;
        xwei=6;//用几位数码管显示?
        numwe=0xfe;//初始化数码管位选控制                       
        for(;xwei!=0;xwei--)
        {
                dula=1;        //开段选锁存器
                P0=table[num];//送显示数
                dula=0;        //关段选锁存器
                P0=0xff;//消影
                wela=1;        //开位选锁存器
                P0=numwe;//送数码管位选控制
                wela=0;         //关位选锁存器
                numwe=_crol_(numwe,1); //对数码管位选控制 左移位
                delay(1);//调用延时函数
        }
}
void keyscan()//矩阵键盘扫描函数 开始
{
        uchar x,y,key,temp;//定义:行坐标x、列坐标y、按键key
        temp=0x0f;// 0000 1111
        P3=temp;//P3口:4列送0000、4行送1111;
        if (P3!=temp)//1判断是否有按键按下;
        {
                 delay(10);//延时10毫秒消抖动;
                P3=temp;//P3口:列送0000、行送1111;
                if (P3!=temp)//2次判断是否有按键按下;
                {
                        x=P3&temp;//取按下矩阵键盘的行坐标
                        temp=~temp;//按位取反,线反转使用;
                        P3=temp;//线反转P3口:4列送高电平、4行送低电平;
                        y=P3&temp;//取按下矩阵键盘的列坐标
                        key=x|y;//行坐标x、列坐标y 进行或运算组合在一起。
                        while(P3!=temp);//按键释放检测语句
                        P1=key;//用流水灯显示当前的P3口状态
                        switch (key)        //进入开关多分支语句判断
                        {
                                case 0xee:        num=0;        F0=1;
                                        break;
                                case 0xde:        num=1;        F0=1;
                                        break;
                                case 0xbe:        num=2;        F0=1;
                                        break;
                                case 0x7e:        num=3;        F0=1;
                                        break;
                                case 0xed:        num=4;        F0=1;
                                        break;
                                case 0xdd:        num=5;        F0=1;
                                        break;
                                case 0xbd:        num=6;        F0=1;
                                        break;
                                case 0x7d:        num=7;        F0=1;
                                        break;
                                case 0xeb:        num=8;        F0=1;
                                        break;
                                case 0xdb:        num=9;        F0=1;
                                        break;
                                case 0xbb:        num=10;        F0=1;
                                        break;
                                case 0x7b:        num=11;        F0=1;
                                        break;
                                case 0xe7:        num=12;        F0=1;
                                        break;
                                case 0xd7:        num=13;        F0=1;
                                        break;
                                case 0xb7:        num=14;        F0=1;
                                        break;
                                case 0x77:        num=15;        F0=1;
                                        break;
                                default://出错处理!
                                        F0=0;//程序状态字 置0
                                        break;
                        }       
                }
        }
}//矩阵键盘扫描函数 结束
void init()//初始化函数
{
        F0=0;//程序状态字:上电数码管不显示、以及出错处理
        num=0;
}
void main()  //主函数 开始
{
        init();        //调用 初始化函数
        while(1)//大循环 开始
        {
                keyscan();//调用按键扫描函数
                if (F0==1)//判断是否正确按下了矩阵按键
                {
                        display(num);//调用 显示函数
                }
                else//错误按键处理(关闭数码管显示、关闭流水灯)
                {
                        dula=1; //开U1锁存器
                        P0=0xff;//送关闭数据
                        dula=0; //关U1锁存器
                        wela=1;   //开U2锁存器
                        P0=0xff;  //送关闭数据
                        wela=0;    //关U2锁存器
                        P1=0xff;//熄灭流水灯
                        delay(100);
                        P1=~P1;//流水灯闪烁
                        delay(100);
                }               
        }//大循环 结束
}//主函数 结束

但是,我想知道我错在哪里了?

前辈,指点小弟一下吧。

顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶

首先你得确定你的矩阵硬件电路,和郭的一样,不然的话不做更改肯定还是不行!

有道理 我的板子就和郭天祥的不一样 就改了 可以运行来自: Android客户端

看看键盘是否接在P2口上来自: Android客户端

看看键盘是否接在P2口上来自: Android客户端

怎么那么多 while(1)

switch case语句中,case后面的判断数据是不一样的,你四个里面都一样,按下键盘后,当然不能实现功能

请加注释再放电路图,我给你弄到任务区去  速度

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top