牛羊敲代码 2019-03-01 20:24 采纳率: 0%
浏览 923

关于C51单片机的矩阵键盘程序问题

程序目的:对4x4的矩阵键盘进行控制,
按下16个按键分别使第一个数码管显示0~F。

以下为我编写的程序,程序无错但烧写后的结果很奇怪,不明白是哪里错了。

#include "reg52.h"
sfr P4=0xc0;

unsigned char code keynum[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x70};

sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;

void HC138(unsigned int k)
{
switch (k)
{
case 4:
P2=0x80;
break;
case 5:
P2=0xa0;
break;
case 6:
P2=0xc0;

break;
case 7:
P2=0xe0;
break;
}
}

void delay(unsigned char t)
{
while(t--);
}

void DisplaySMG(unsigned int i)
{
HC138(7);
P0=keynum[i];
delay(6000);
}

int value=0;

void Scankey()
{
R1=0;
R2=R3=R4=1;

if(C1 == 0)
{
while(C1 == 0);
value=1;
DisplaySMG(value);
}
else if(C2==0)
{
while(C2==0);
value=2;
DisplaySMG(value);
}
else if(C3==0)
{
while(C3==0);
value=3;
DisplaySMG(value);
}
else if(C4==0)
{
while(C4==1);
value=4;
DisplaySMG(value);
}
R2=0;
R1=R3=R4=1;

if(C1==0)
{
while(C1==0);
value=5;
DisplaySMG(value);
}
else if(C2==0)
{
while(C2==0);
value=6;
DisplaySMG(value);
}
else if(C3==0)
{
while(C3==0);
value=7;
DisplaySMG(value);
}
else if(C4==0);
{
while(C4==0);
value=8;
DisplaySMG(value);
}
R3=0;
R2=R1=R4=1;

if(C1==0)
{
while(C1==0);
value=9;
DisplaySMG(value);
}
else if(C2==0)
{
while(C2==0);
value=10;
DisplaySMG(value);
}
else if(C3==0)
{
while(C3==0);
value=11;
DisplaySMG(value);
}
else if(C4==0);
{
while(C4==0);
value=12;
DisplaySMG(value);
}
R4=0;
R2=R3=R1=1;

if(C1==0)
{
while(C1==0);
value=13;
DisplaySMG(value);
}
else if(C2==0)
{
while(C2==0);
value=14;
DisplaySMG(value);
}
else if(C3==0)
{
while(C3==0);
value=15;
DisplaySMG(value);
}
else if(C4==0);
{
while(C4==0);
value=16;
DisplaySMG(value);
}
}

void main()
{
HC138(4);
P0=0xff;
HC138(5);
P0=0x00;
HC138(6);
P0=0x01;
HC138(7);
P0=0x00;
C1=1;C2=1;C3=1;C4=1;
while(1)
{
Scankey();
}

}

  • 写回答

2条回答 默认 最新

  • JonathanYan 2019-03-01 21:39
    关注

    请问出现了什么问题,描述的细致一些


    补充,有两次

    } else if(C4==0); {
    

    语句多加了分号,你找一下


    另外,按键识别需要考虑按键抖动,相关方法你可以百度一下
    而且按键识别写成循环比较好

    void Scankey() {
        R1=0;
        R2=R3=R4=1;
    
        int value = 0;
        int cValue = 0
    
        for( int i = 0; i < 4; i++ ){
            //如果你的P3或P4只用来读列线,可以直接cKey = P3/P4;
            unsigned char cKey = C1 * 8 + C2 * 4 + C3 * 2 + C4 * 1;
    
            //若无按键,直接返回
            if( cKey != 15 ) {
                cValue = cKey;
    
                //你的程序只考虑显示按键对应的数值,不用考虑按键次数的影响,可以跳过这个do-while
                do{
                    //有按键,等待按键释放
                    do{
                        delay(100);//不知道delay函数一下延时多久,我觉得0.1s比较好
                        cKey = C1 * 8 + C2 * 4 + C3 * 2 + C4 * 1;
                    } while( cKey != 15 );
    
                    //按键抬起,等待抖动结束
                    delay(20);//等待20ms去抖动,防止多次触发按键
                    cKey = C1 * 8 + C2 * 4 + C3 * 2 + C4 * 1;
                } while( cKey != 15);//若抖动结束依然有按键,可能是接触不良,继续等待
    
                switch(cValue){
                    case 0x0111: value = 1 + i * 4; break;
                    case 0x1011: value = 2 + i * 4; break;
                    case 0x1101: value = 3 + i * 4; break;
                    case 0x1110: value = 4 + i * 4; break;
                    default: value = 0;
                }
                break;
            }
    
            R2 = R1; R3 = R2; R4 = R3; R1 = 1;
        }
    
        if(cValue)
            DisplaySMG(value);
    }
    

    若问题解决麻烦点个采纳

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误