找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4189|回復(fù): 6
收起左側(cè)

長(zhǎng)短按鍵使用程序出問題了

[復(fù)制鏈接]
ID:139821 發(fā)表于 2016-9-19 12:47 | 顯示全部樓層 |閱讀模式
#include<reg52.h>

sbit ADDR3=P1^3;
sbit ENLED=P1^4;
sbit KEYIN4=P2^7;
sbit KEYIN3=P2^6;
sbit KEYIN2=P2^5;
sbit KEYIN1=P2^4;
sbit KEYOUT1=P2^3;
sbit KEYOUT2=P2^2;
sbit KEYOUT3=P2^1;
sbit KEYOUT4=P2^0;

unsigned char code keymodel[4][4]={
{0x31,0x32,0x33,0x20},{0x34,0x35,0x36,0x22},{0x37,0x38,0x39,0x21},{0x30,0x24,0x25,0x23}
};//0x20表示上,0x22表示左,0x21表示下,0x24表示esc,0x25表示回車,0x23表示右
unsigned char code LedChar[] = {  //數(shù)碼管顯示字符轉(zhuǎn)換表
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
        };
unsigned char pdata keysta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};//按鍵當(dāng)前狀態(tài)。
unsigned char  ledbuf[7]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};

unsigned char rh=0;
unsigned char rl=0;
unsigned char result=0;//最大只能設(shè)置100.
unsigned char keytime=0;
bit flagreturn=0;
unsigned int cnt=0;

void configtime(unsigned char ms);
void keydriver();
void retruntime();
void keyaction(unsigned char number);
void shownumber();
void main()
{        EA=1;
        ADDR3=1;
        ENLED=0;
        TMOD&=0xF0;
        TMOD|=0x01;
        configtime(1);

        while(1)
        {        keydriver();
                if((cnt>=2)&&(flagreturn==1))
                        {        retruntime();
                                cnt=0;
                        }
        }
}
void configtime(unsigned char ms)
{        unsigned long tmp;
        tmp=11059200/12*ms/1000;
        tmp=65536-tmp+18;
        rh=(unsigned char)(tmp>>8);
        rl=(unsigned char)tmp;
        TH0=rh;
        TL0=rl;
        TR0=1;
        ET0=1;
}
void keyaction(unsigned char number)
{         if(number==0x20)
                {       
                        if(result<99)
                                result++;
                }
        else if(number==0x21)
                        {        if(result>0)
                                        result--;
                        }
        else if(number==0x24)
                        {        result=0;
                                ledbuf[6]=0xFF;
                        }
        else if(number==0x25)
                {        flagreturn=1;
                }               
}
void retruntime()
{
         if(result==0)
                 {        ledbuf[6]=0x00;
                        flagreturn=0;
                }
        else
                 result--;
}
void shownumber()
{        static unsigned char i=0;
        ledbuf[0]=LedChar[result%10];
        ledbuf[1]=LedChar[result/10];
        P0=0xFF;
        P1=(P1&0xF8)|i;
        P0=ledbuf[i];
        i++;
        if(i>6)
                i=0;
}
void keydriver()
{        unsigned char i=0;
        unsigned char j=0;
        static unsigned  char  keyback[4][4]={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
        };
        static unsigned int keytimemax[4][4]={
        {1000,1000,1000,1000},{1000,1000,1000,1000},{1000,1000,1000,1000},{1000,1000,1000,1000}
        };
        for(i=0;i<4;i++)
        {        for(j=0;j<4;j++)
                        {        if(keyback[i][j]!=keysta[i][j])
                                        {        if(keysta[i][j]==0)
                                                        {keyaction(keymodel[i][j]);}
                                                keyback[i][j]=keysta[i][j];
                                        }
                                else
                                        {        if((keysta[i][j]==0)&&(keytime>=keytimemax[i][j]))
                                                        {        keyaction(keymodel[i][j]);
                                                                keytimemax[i][j]+=200;
                                                        }
                                                else
                                                        {        keytimemax[i][j]=1000;
                                                                keytime=0;
                                                        }
                                        }
                        }
        }
       
}
void keyscan()
{         static unsigned char keybuf[4][4]={
          {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
         };
         static unsigned char keyout=0;
         unsigned char i=0;
         keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEYIN1;
         keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEYIN2;
         keybuf[keyout][2]=(keybuf[keyout][2]<<1)|KEYIN3;
         keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEYIN4;
         for(i=0;i<4;i++)
         {        if(keybuf[keyout][i]&0x0F==0x00)
                         {        keysta[keyout][i]=0;
                                keytime+=4;
                        }
                else if(keybuf[keyout][i]&0x0F==0x0F)
                        keysta[keyout][i]=1;
         }
         keyout++;
         keyout=keyout&0x03;
         switch(keyout)
         {        case 0:        KEYOUT4=1; KEYOUT1=0;break;
                 case 1:        KEYOUT1=1; KEYOUT2=0;break;
                case 2:        KEYOUT2=1; KEYOUT3=0;break;
                case 3:        KEYOUT3=1; KEYOUT4=0;break;
                default :break;
         }
}
void interrupttmie0()interrupt 1
{       
        TH0=rh;
        TL0=rl;
        cnt++;
        keyscan();
        shownumber();
}

不知道哪里有問題?大神能幫我調(diào)試下???

23.png
回復(fù)

使用道具 舉報(bào)

ID:139821 發(fā)表于 2016-9-19 12:48 | 顯示全部樓層
圖片是我在調(diào)試的時(shí)候發(fā)現(xiàn)了一個(gè)問題,就是146到149行不能添加斷點(diǎn)?這又是為什么?
回復(fù)

使用道具 舉報(bào)

ID:97438 發(fā)表于 2016-9-19 17:07 | 顯示全部樓層
因?yàn)?46行到149行是不可能運(yùn)行到的。。。你寫錯(cuò)了。。。。
146和150行,你犯了錯(cuò)誤,沒有注意運(yùn)算符的優(yōu)先級(jí)。
146行 if(keybuf[keyout][i]&0x0F==0x00)應(yīng)改為 if((keybuf[keyout][i]&0x0F)==0x00)
150行你自己改一下~
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2016-9-20 09:02 | 顯示全部樓層
什么“長(zhǎng)”“短”按鍵?提問都不會(huì)!
回復(fù)

使用道具 舉報(bào)

ID:139881 發(fā)表于 2016-9-20 09:19 | 顯示全部樓層
有點(diǎn)意思
回復(fù)

使用道具 舉報(bào)

ID:139821 發(fā)表于 2016-9-21 22:17 | 顯示全部樓層
我找到問題了。
回復(fù)

使用道具 舉報(bào)

ID:21069 發(fā)表于 2019-2-2 00:51 | 顯示全部樓層
18780380513 發(fā)表于 2016-9-20 09:19
**** 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽 ****

還真有長(zhǎng)短按鍵,只是你沒見過

評(píng)分

參與人數(shù) 5黑幣 +126 收起 理由
嘉立創(chuàng)AAA + 6 很給力!
Sawardeakar + 15 很給力!
刀刀見紅 + 35 回帖助人的獎(jiǎng)勵(lì)!
areyouok + 35 回帖助人的獎(jiǎng)勵(lì)!
shuisheng + 35 絕世好帖!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表