找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 959|回复: 4
收起左侧

数码管显示简易加法计算器显示延时问题

[复制链接]
ID:100982 发表于 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论坛上的教程写的简易加法计算器,现在出现按键按下后数码管显示要延时很久才出现,想了好久,没明白究竟为什么?求教大神了。

回复

使用道具 举报

ID:404160 发表于 2022-7-26 14:34 | 显示全部楼层
shownum()中的最后一个for(i。。。)语句的i是0,要做255次循环,LED显存数据是空,即显示的”空“
回复

使用道具 举报

ID:161164 发表于 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 发表于 2022-8-1 15:55 | 显示全部楼层
lkc8210 发表于 2022-7-26 17:10
void Timer0Init(void)                //1毫秒@11.0592MHz
{               
        TMOD &= 0xF0;

定时器设置不对吗?
回复

使用道具 举报

ID:100982 发表于 2022-8-1 15:56 | 显示全部楼层
飞云居士 发表于 2022-7-26 14:34
shownum()中的最后一个for(i。。。)语句的i是0,要做255次循环,LED显存数据是空,即显示的”空“

这个i是上一句的i,不是0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表