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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1786|回復: 4
打印 上一主題 下一主題
收起左側(cè)

數(shù)碼管顯示簡易加法計算器顯示延時問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
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àn)在出現(xiàn)按鍵按下后數(shù)碼管顯示要延時很久才出現(xiàn),想了好久,沒明白究竟為什么?求教大神了。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

板凳
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;                              
}
回復

使用道具 舉報

地板
ID:100982 發(fā)表于 2022-8-1 15:55 | 只看該作者
lkc8210 發(fā)表于 2022-7-26 17:10
void Timer0Init(void)                //1毫秒@11.0592MHz
{               
        TMOD &= 0xF0;

定時器設(shè)置不對嗎?
回復

使用道具 舉報

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 2一3sex性hd| 老牛影视av一区二区在线观看 | 日韩一区二区在线视频 | 99视频免费在线观看 | 91久久| 欧美 日韩 国产 成人 在线 91 | 久久国内精品 | 在线国产一区二区三区 | 久在线视频播放免费视频 | 亚洲精品九九 | 中文字幕一区二区三区四区五区 | 天天色图 | 欧美一区二区三区,视频 | 欧美一区二区三区精品免费 | 综合久久久久 | 亚洲视频国产 | 91在线观看免费视频 | 亚洲欧美中文日韩在线v日本 | 国产精品成人国产乱一区 | 欧美成人一区二免费视频软件 | 精品欧美一区二区三区久久久 | 日韩成人精品视频 | 亚洲欧美在线一区 | 亚洲免费在线观看 | 91精品久久久久久久久久入口 | 极品久久| 国产亚洲成av人片在线观看桃 | 一区二区日本 | 国产精品污www在线观看 | 国产成人精品a视频一区www | 久久久久国产一区二区三区不卡 | 午夜精品久久久久久久久久久久久 | 久久专区 | 午夜久久久久久久久久一区二区 | av激情在线 | 日本不卡一区二区三区在线观看 | 亚洲成人精选 | 国产日韩精品视频 | 羞羞视频免费观看 | 中文字幕乱码视频32 | 亚洲小说图片 |