久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開(kāi)始

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

數(shù)碼管顯示簡(jiǎn)易加法計(jì)算器顯示延時(shí)問(wèn)題

[復(fù)制鏈接]
ID:100982 發(fā)表于 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 }, //數(shù)字鍵 1、數(shù)字鍵 2、數(shù)字鍵 3、向上鍵
                                           { 0x34, 0x35, 0x36, 0x25 }, //數(shù)字鍵 4、數(shù)字鍵 5、數(shù)字鍵 6、向左鍵
                                           { 0x37, 0x38, 0x39, 0x28 }, //數(shù)字鍵 7、數(shù)字鍵 8、數(shù)字鍵 9、向下鍵
                                           { 0x30, 0x1B, 0x0D, 0x27 }} ; //數(shù)字鍵 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();
}


根據(jù)51論壇上的教程寫(xiě)的簡(jiǎn)易加法計(jì)算器,現(xiàn)在出現(xiàn)按鍵按下后數(shù)碼管顯示要延時(shí)很久才出現(xiàn),想了好久,沒(méi)明白究竟為什么?求教大神了。

回復(fù)

使用道具 舉報(bào)

ID:404160 發(fā)表于 2022-7-26 14:34 | 顯示全部樓層
shownum()中的最后一個(gè)for(i。。。)語(yǔ)句的i是0,要做255次循環(huán),LED顯存數(shù)據(jù)是空,即顯示的”空“
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-7-26 17:10 | 顯示全部樓層
void Timer0Init(void)                //1毫秒@11.0592MHz
{               
        TMOD &= 0xF0;
        TMOD |= 0x01;//mode 1: 16bit Timer               
        TL0 = 0x66;               
        TH0 = 0xFC;                              
}
回復(fù)

使用道具 舉報(bào)

ID:100982 發(fā)表于 2022-8-1 15:55 | 顯示全部樓層
lkc8210 發(fā)表于 2022-7-26 17:10
void Timer0Init(void)                //1毫秒@11.0592MHz
{               
        TMOD &= 0xF0;

定時(shí)器設(shè)置不對(duì)嗎?
回復(fù)

使用道具 舉報(bào)

ID:100982 發(fā)表于 2022-8-1 15:56 | 顯示全部樓層
飛云居士 發(fā)表于 2022-7-26 14:34
shownum()中的最后一個(gè)for(i。。。)語(yǔ)句的i是0,要做255次循環(huán),LED顯存數(shù)據(jù)是空,即顯示的”空“

這個(gè)i是上一句的i,不是0
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一二三区 | 91精品国产91久久综合桃花 | 成人国产精品免费观看 | 久久中文字幕一区 | 成人精品一区二区三区四区 | 成年人网站免费 | 中午字幕在线观看 | 精品少妇一区二区三区在线播放 | 国产福利视频 | 免费成人高清在线视频 | 日韩精品一二三 | 国产一区| 亚洲一区视频在线 | 久久天堂 | 日韩免费 | 久久精品久久精品久久精品 | 国产偷录叫床高潮录音 | 日本aa毛片a级毛片免费观看 | 午夜免费福利影院 | 欧美a∨| 国产欧美精品一区二区 | 亚洲免费精品一区 | 亚洲成人一级 | 日本久久久久久 | 日日av| 亚洲欧美成人在线 | 国产在线视频一区二区董小宛性色 | 五月婷婷激情 | 国内精品在线视频 | 99爱国产 | 午夜a区 | 国产精品一区在线 | 国产精品99999999 | 亚洲一区二区日韩 | 国产一区二区中文字幕 | 国产精产国品一二三产区视频 | 中文字幕日韩在线 | 久久av资源网 | 亚洲精品视频观看 | 免费看国产a | 欧美精品欧美精品系列 |