欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 數碼管顯示簡易加法計算器顯示延時問題 [打印本頁]

作者: wifen    時間: 2022-7-22 15:52
標題: 數碼管顯示簡易加法計算器顯示延時問題
#include <reg52.h>


unsigned char code ledchar[] = {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,//0-9
                                           0x77,0x7C,0x39,0x5E,0x79,0x71 } ;                           //a-f
unsigned char keycode[4][4] = {{ 0x31, 0x32, 0x33, 0x26 }, //數字鍵 1、數字鍵 2、數字鍵 3、向上鍵
                                           { 0x34, 0x35, 0x36, 0x25 }, //數字鍵 4、數字鍵 5、數字鍵 6、向左鍵
                                           { 0x37, 0x38, 0x39, 0x28 }, //數字鍵 7、數字鍵 8、數字鍵 9、向下鍵
                                           { 0x30, 0x1B, 0x0D, 0x27 }} ; //數字鍵 0、 ESC 鍵、 回車鍵、 向右鍵}
unsigned char keysta[4][4] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char ledbuf[6] = {0x00,0x00,0x00,0x00,0x00,0x00};

sbit keyout1 = P2^7;
sbit keyout2 = P2^6;
sbit keyout3 = P2^5;
sbit keyout4 = P2^4;

sbit keyin1 = P2^3;
sbit keyin2 = P2^2;
sbit keyin3 = P2^1;
sbit keyin4 = P2^0;

sbit ADDRA = P1^0;
sbit ADDRB = P1^1;
sbit ADDRC = P1^2;

void Timer0Init(void);
void keyscan();
void keyaction(unsigned char keycode);
void keydriver();
void shownum(unsigned long num);

void main()
{
        EA = 1;
        Timer0Init();
        ET0 = 1;
        TR0 = 1;

        ledbuf[0] = ledchar[0];
       
        while(1)
        {
                keydriver();
       
        }
}

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;

        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;
                }
                else if((keybuf[keyout][i] & 0x0f) == 0x0f)
                {
                        keysta[keyout][i] = 1;       
                }       
        }
       
        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 keydriver()
{
        static unsigned char keyback[4][4] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
        unsigned char i;
        unsigned char j;
        for(i = 0;i < 4;i++)
        {
                for(j = 0;j < 4;j++)
                {
                        if(keyback[i][j] != keysta[i][j])
                        {
                                if(keyback[i][j] != 0)
                                {
                                        keyaction(keycode[i][j]);

                                }
                                keyback[i][j] = keysta[i][j];
                        }
                       
                }       
        }
}

void shownum(unsigned long num)
{
        unsigned char buf[6];
        signed char i = 0;
       
        for(i = 0;i < 6; i++)
        {
                buf[i] = num % 10;
                num /= 10;
        }
        for(i = 5;i >= 1;i--)
        {
                if(buf[i] == 0)
                {
                        ledbuf[i] = 0x00;
                }
                else
                {
                        break;
                }
        }
        for(;i >= 0;i--)
        {
                ledbuf[i] = ledchar[buf[i]];                       
        }
       
}


void ledscan()
{
        static unsigned char i = 0;
        P0 = 0x00;
       
        switch (i)
        {
                case 0: ADDRC=0; ADDRB=0; ADDRA=0; i++; P0=ledbuf[5]; break;
                case 1: ADDRC=0; ADDRB=0; ADDRA=1; i++; P0=ledbuf[4]; break;
                case 2: ADDRC=0; ADDRB=1; ADDRA=0; i++; P0=ledbuf[3]; break;
                case 3: ADDRC=0; ADDRB=1; ADDRA=1; i++; P0=ledbuf[2]; break;
                case 4: ADDRC=1; ADDRB=0; ADDRA=0; i++; P0=ledbuf[1]; break;
                case 5: ADDRC=1; ADDRB=0; ADDRA=1; i=0; P0=ledbuf[0]; break;
                default: break;
        }       

}



void keyaction(unsigned char keycode)
{
        static unsigned long add = 0;
        static unsigned long result = 0;

        if((keycode >= 0x30) && (keycode <= 0x39))
        {
                add = (keycode - 0x30) + (add*10);
                shownum(add);
        }
        else if(keycode == 0x26)
        {
                result = result + add;
                add = 0;
                shownum(result);
        }
        else if(keycode ==  0x0D)
        {
                 result = result + add;
                add = 0;
                shownum(result);
        }
        else if(keycode == 0x1B )
        {
                result = 0;
                add = 0;
                shownum(add);       
        }       
}

void Timer0Init(void)                //1毫秒@11.0592MHz
{
               
        TMOD &= 0xF0;               
        TL0 = 0x66;               
        TH0 = 0xFC;                               
}

void InterruptTimer0() interrupt 1
{       
        TH0 = 0xFC;       
        TL0 = 0x66;               
       
        keyscan();
        ledscan();
}


根據51論壇上的教程寫的簡易加法計算器,現在出現按鍵按下后數碼管顯示要延時很久才出現,想了好久,沒明白究竟為什么?求教大神了。


作者: 飛云居士    時間: 2022-7-26 14:34
shownum()中的最后一個for(i。。。)語句的i是0,要做255次循環,LED顯存數據是空,即顯示的”空“
作者: lkc8210    時間: 2022-7-26 17:10
void Timer0Init(void)                //1毫秒@11.0592MHz
{               
        TMOD &= 0xF0;
        TMOD |= 0x01;//mode 1: 16bit Timer               
        TL0 = 0x66;               
        TH0 = 0xFC;                              
}

作者: wifen    時間: 2022-8-1 15:55
lkc8210 發表于 2022-7-26 17:10
void Timer0Init(void)                //1毫秒@11.0592MHz
{               
        TMOD &= 0xF0;

定時器設置不對嗎?
作者: wifen    時間: 2022-8-1 15:56
飛云居士 發表于 2022-7-26 14:34
shownum()中的最后一個for(i。。。)語句的i是0,要做255次循環,LED顯存數據是空,即顯示的”空“

這個i是上一句的i,不是0




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