找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1083|回复: 10
收起左侧

新手求解单片机矩阵键盘

[复制链接]
ID:1100223 发表于 2023-11-18 12:42 | 显示全部楼层 |阅读模式
第一个程序(一共两个)
这个代码是单片机自带的程序,按下矩阵键盘数码管可以显示对应数字。还有一个我改的,数码管却不亮了。附件有开发板原理图,两个代码编译都没问题,求解,谢谢了。图片就是原理图了,不用下载附件了.

#include "reg52.h"               


#define uint unsigned int ;        
#define uchar unsigned char ;

#define GPIO_DIG P0
#define GPIO_KEY P1


uchar KeyValue;
uchar temp;
uchar i;

uchar code smgduan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}  
void delay(unsigned int i)  //延时函数
{
        while(i--);        
}
void KeyDown(void)
{

        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f
        {
                delay(1000);
                if(GPIO_KEY!=0x0f
                {        
               
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d):       KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
               
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0)
                        {
                                delay(1000);
                                a++;
                        }
                }
        }
}


void main()
{        

        while(1)
        {        
                KeyDown();        
                GPIO_DIG=smgduan[KeyValue];        
        }               
}





#include "reg52.h"               
#include <intrins.h>

#define uint unsigned int ;
#define uchar unsigned char ;

#define GPIO_DIG P0
#define GPIO_KEY P1
sbit L0=P1^3;
sbit L1=P1^2;
sbit L2=P1^1;
sbit L3=P1^0;

uchar KeyValue;
uchar temp;
uchar i;

uchar code smgduan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(unsigned int i)
{
        while(i--);        
}
void KeyDown(void)
{
        while(1)
        {
                P1=0x7f;
                for(i=0;i<=3;i++)
                {
                        if(L0==0) KeyValue=i*4+0;
                        if(L1==0) KeyValue=i*4+1;
                        if(L2==0) KeyValue=i*4+2;
                        if(L3==0) KeyValue=i*4+3;
                        temp=P1;
                        temp=_cror_(temp,1);
                        P1=temp;
                }
        }
}

void main()
{        

        while(1)
        {        
                KeyDown();        
                GPIO_DIG=smgduan[KeyValue];        
        }               
}



屏幕截图 2023-11-18 124340.png
回复

使用道具 举报

ID:213173 发表于 2023-11-18 14:05 | 显示全部楼层
代码编译没有问题只能说没有语法问题,不能证明没有逻辑问题。虽然开发板自带的程序不算是好程序,但对于初学者比较容易理解。只有充分理解原代码,才能在此基础上优化,否则出错都找不到问题所在。
回复

使用道具 举报

ID:1100220 发表于 2023-11-18 14:12 | 显示全部楼层
可以debug看一下问题出在哪里
回复

使用道具 举报

ID:1100223 发表于 2023-11-18 14:15 | 显示全部楼层
wulin 发表于 2023-11-18 14:05
代码编译没有问题只能说没有语法问题,不能证明没有逻辑问题。虽然开发板自带的程序不算是好程序,但对于初 ...

第二个程序是我改的,也只是换了个思路,也是按照硬件来的,为啥不亮呢?
回复

使用道具 举报

ID:1100223 发表于 2023-11-18 14:45 | 显示全部楼层
菜鸡工程师 发表于 2023-11-18 14:12
可以debug看一下问题出在哪里

啊,刚用keil不知debug咋用,不过谢谢了,我去看看怎么用
回复

使用道具 举报

ID:227818 发表于 2023-11-18 16:40 | 显示全部楼层
void KeyDown(void)
{
        while(1)

第二个程序,有一个死循环?
回复

使用道具 举报

ID:1100223 发表于 2023-11-18 18:15 | 显示全部楼层
newlined 发表于 2023-11-18 16:40
void KeyDown(void)
{
        while(1)

啊,不对吗?我这个按下一个按键后,显示一个数字,然后一直循环,如果有键按下,数字就会在变,没有就不变
回复

使用道具 举报

ID:213173 发表于 2023-11-18 20:58 | 显示全部楼层
missingor 发表于 2023-11-18 14:15
第二个程序是我改的,也只是换了个思路,也是按照硬件来的,为啥不亮呢?

只要运行到KeyDown();就死在里面了,根本没有机会运行GPIO_DIG=smgduan[KeyValue];,数码管怎么亮?
回复

使用道具 举报

ID:1100223 发表于 2023-11-18 21:40 | 显示全部楼层
newlined 发表于 2023-11-18 16:40
void KeyDown(void)
{
        while(1)

哦哦,谢谢
回复

使用道具 举报

ID:1100223 发表于 2023-11-18 21:41 | 显示全部楼层
wulin 发表于 2023-11-18 20:58
只要运行到KeyDown();就死在里面了,根本没有机会运行GPIO_DIG=smgduan[KeyValue];,数码管怎么亮?

嗯嗯,谢谢了
回复

使用道具 举报

ID:227818 发表于 2023-11-19 12:11 | 显示全部楼层

不客气,我没有看懂您的按键在哪个数码管显示,所以我只好提示了下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表