標(biāo)題: 新手求解單片機(jī)矩陣鍵盤(pán) [打印本頁(yè)]

作者: missingor    時(shí)間: 2023-11-18 12:42
標(biāo)題: 新手求解單片機(jī)矩陣鍵盤(pán)
第一個(gè)程序(一共兩個(gè))
這個(gè)代碼是單片機(jī)自帶的程序,按下矩陣鍵盤(pán)數(shù)碼管可以顯示對(duì)應(yīng)數(shù)字。還有一個(gè)我改的,數(shù)碼管卻不亮了。附件有開(kāi)發(fā)板原理圖,兩個(gè)代碼編譯都沒(méi)問(wèn)題,求解,謝謝了。圖片就是原理圖了,不用下載附件了.

#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)  //延時(shí)函數(shù)
{
        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 (1007.35 KB, 下載次數(shù): 72)

屏幕截圖 2023-11-18 124340.png

作者: wulin    時(shí)間: 2023-11-18 14:05
代碼編譯沒(méi)有問(wèn)題只能說(shuō)沒(méi)有語(yǔ)法問(wèn)題,不能證明沒(méi)有邏輯問(wèn)題。雖然開(kāi)發(fā)板自帶的程序不算是好程序,但對(duì)于初學(xué)者比較容易理解。只有充分理解原代碼,才能在此基礎(chǔ)上優(yōu)化,否則出錯(cuò)都找不到問(wèn)題所在。
作者: 菜雞工程師    時(shí)間: 2023-11-18 14:12
可以debug看一下問(wèn)題出在哪里
作者: missingor    時(shí)間: 2023-11-18 14:15
wulin 發(fā)表于 2023-11-18 14:05
代碼編譯沒(méi)有問(wèn)題只能說(shuō)沒(méi)有語(yǔ)法問(wèn)題,不能證明沒(méi)有邏輯問(wèn)題。雖然開(kāi)發(fā)板自帶的程序不算是好程序,但對(duì)于初 ...

第二個(gè)程序是我改的,也只是換了個(gè)思路,也是按照硬件來(lái)的,為啥不亮呢?
作者: missingor    時(shí)間: 2023-11-18 14:45
菜雞工程師 發(fā)表于 2023-11-18 14:12
可以debug看一下問(wèn)題出在哪里

啊,剛用keil不知debug咋用,不過(guò)謝謝了,我去看看怎么用
作者: newlined    時(shí)間: 2023-11-18 16:40
void KeyDown(void)
{
        while(1)

第二個(gè)程序,有一個(gè)死循環(huán)?
作者: missingor    時(shí)間: 2023-11-18 18:15
newlined 發(fā)表于 2023-11-18 16:40
void KeyDown(void)
{
        while(1)

啊,不對(duì)嗎?我這個(gè)按下一個(gè)按鍵后,顯示一個(gè)數(shù)字,然后一直循環(huán),如果有鍵按下,數(shù)字就會(huì)在變,沒(méi)有就不變
作者: wulin    時(shí)間: 2023-11-18 20:58
missingor 發(fā)表于 2023-11-18 14:15
第二個(gè)程序是我改的,也只是換了個(gè)思路,也是按照硬件來(lái)的,為啥不亮呢?

只要運(yùn)行到KeyDown();就死在里面了,根本沒(méi)有機(jī)會(huì)運(yùn)行GPIO_DIG=smgduan[KeyValue];,數(shù)碼管怎么亮?
作者: missingor    時(shí)間: 2023-11-18 21:40
newlined 發(fā)表于 2023-11-18 16:40
void KeyDown(void)
{
        while(1)

哦哦,謝謝
作者: missingor    時(shí)間: 2023-11-18 21:41
wulin 發(fā)表于 2023-11-18 20:58
只要運(yùn)行到KeyDown();就死在里面了,根本沒(méi)有機(jī)會(huì)運(yùn)行GPIO_DIG=smgduan[KeyValue];,數(shù)碼管怎么亮?

嗯嗯,謝謝了
作者: newlined    時(shí)間: 2023-11-19 12:11
missingor 發(fā)表于 2023-11-18 21:40
哦哦,謝謝

不客氣,我沒(méi)有看懂您的按鍵在哪個(gè)數(shù)碼管顯示,所以我只好提示了下。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1