中断控制数码管,流水灯

按键控制,数码管显示速度的百分比,加快,变慢,用锁存器,怎么表示?

#include <STC12C5A60S2.H>

unsigned int i; // Á÷Ë®ÒÆ¶¯Î»ÖÃ
unsigned int keycode = 0; // °´¼üÊÇ·ñ°´ÏÂÁË
unsigned int ckey; // È¡°´Ï°´¼üµÄ¼üÖµ
int flag = 0; //Éè±êÖ¾¿´½ø²»½ø°´¼üº¯Êý
int agkey; // Ïû¶¶ºóÔÙÈ¡¼üÖµ
int max = 50;// ËÙ¶È¿ØÖÆ
int timer = 0; // ÁíÍâÔÙ¶¨ÒåÒ»¸öº¯Êý£¬¼ä½ÓÀ´¿ØÖÆ£¬Á÷Ë®µÆµÄËÙ¶È

void key ();// º¯ÊýÉùÃ÷£¬°´¼üº¯Êý£»

void main ()
{
TMOD = 0x01; //Ñ¡Ôñ¶¨Ê±Ä£Ê½ £¬·½Ê½1
TH0 = -9; // 2.5ms½øÈëÖжÏ
ET0 = 1; // ÔÊÐíÖжÏÒç³ö
TR0 = 1; // ´ò¿ª¶¨Ê±Æ÷
EA = 1; // ´òcpuÖжϣ¬¾Í¿ªÊ¼¼Ç¼ʱ¼ä£¬Ö»ÒªÒ»µ½Ê±¼ä¾Í½øÈëÖжϺ¯ÊýÀïÃæ£¬²»¹ÜÖ÷º¯ÊýÔËÐе½ÄÄÀï

while (1)
{
    P0 = 0x01 << i;
    i %= 8; // µ±i = 8µÄʱºò£¬iÈ¡Óà¾Í±ä»Ø0ÁË£¬¾Í¿ÉÒÔ²»ÓÃifÀ´Åжϣ¬½«Æä±äΪ0
    if (flag == 1)
    {
        key ();
        flag = 0; // ÓÖÔÙ´Î±ä»ØÁã
    }
}

}

void zhongduan () interrupt 1
{
TH0 = -9;
timer++;
if (timer >= max) //timerÀ´¼ä½Ó¿ØÖÆÁ÷Ë®µÆËÙ¶È£¬ ÒòΪ max£¬ ÎÒÃǶ¨ÒåÁËÒ»¸ö´óС£¬Ö»Óе±timer ´óÓÚÕâ¸ömaxµÄʱºò£¬ÎÒÃǵÄiÖµ²Å»á¼ÓÒ»£¬Ê¹Á÷Ë®µÆÁ÷Ò»´Î£¬ÎÒÃǵÄmaxֵԽС£¬timer¼ÓµÄԽС£¬¾Í¸ü¼ÓÀûÓÚ½øÈë¸ÃÅжÏÌõ¼þ£¬ËٶȾͼӿìÁË£¬·´Ö®£¬¾Í±äÂýÁË
{
i++;
timer = 0; // ½«Õâ¸öÕâ¸öÖµ¹éÁ㣬ÓÃÓÚÏ´μǼ£¬¸Ä±äÁ÷Ë®ËÙ¶È

}
if (max >= 100)
{
    max = 100;
}
if (max <= 10)
{
    max = 10;
}
if (keycode == 0)
{
    ckey = P2 & 0x07; // P21, P22 P23£¬ ¸ø0²Å»áÅжÏËü°´ÏÂÈ¥ÁË£¬ËùÒÔÕý³£Çé¿öÏ£¬È«Îª1£¬×ª»»³É16½øÖÆÊý£¬¾ÍÒ»Ò»¶ÔÓ¦
    if (ckey != 0x07) // ÕâÀï¾Í¿ªÊ¼ÅжÏÎÒÃÇÊÇ·ñ°´ÏÂÁ˰´¼ü£¬È»ºóÎÒÃǾͿªÊ¼Ïû¶¶
    {
        keycode = 4; // ÒòΪÖжÏÊÇ2.5ms£¬ÎÒÃǾͽøÒ»´ÎÖжϣ¬ÎªÉ¶ÒªÏû¶¶£¬ÒòΪ°´¼ü°´ÏÂÈ¥µÄʱºò£¬»á´å×Ð5µ½10msµÄ²»Îȶ¨ÆÚ¼ä£¬Ö®ºó²Å»áÎȶ¨
    }
}
else
{
    keycode--; // Ïû¶¶ËĴΣ¬ÒòΪ½øÖжϺ¯ÊýËĴΣ¬Ã¿Ò»´Î½øÈ¥µÄʱ¼ä¶¼ÊÇ2.5ms,Òª±£Ö¤ÍêÈ«Ïû¶¶
    if (keycode == 0)
    {
        agkey = P2 & 0x07; // ÔÙȡһ´Î¼üÖµ£¬¿´¿´ºÍ֮ǰ¿´µ½µÄÖµÊÇ·ñÒ»Ñù
        if (agkey == ckey)
        {
            flag = 1; // ·½±ãÒÔºó½øÖ÷º¯Êý
        }
        else
        {
            ckey = 0; // Èç¹û²»ÏàµÈ£¬ÄǾÍÊÇÎóÅöÁË£¬»òÕß°´¼ü°´¶àÁË£¬±ä»ØÔ­À´µÄÑù×Ó 
            agkey = 0;
        }
    }
}

}

void key ()
{
switch (agkey)//0111
//8421, 21 22, 23
{
case 0x03:
max = max + 1;

    break;
        
    case 0x05:
        max = max - 1;
        
    break;
    
    case 0x06:
         max = 50;
    
    break;
}
    

}