2020单片机V2.0-试题3 排队叫号

利用1个独立按键(每20ms检验一次是否按下),往队伍里插人,数码管显示当前排队号码排序,用下划线表示空位。窗口每隔600ms处理一个人的事务。事务结束后排队第一位离开队伍,其他号码往前进一位。当前排队人数不会超过8人。
比如一开始连按3次,数码管显示1 2 3 _ _ _ _ _,600ms后数码管显示2 3 _ _ _ _ _ _。排队号码每8个数循环一次,比如当前5 6 7 8 _ _ _ _,此时按下按键,数码管显示5 6 7 8 1 _ _ _。

/************************************************

                            排 队 叫 号 (例程)

************************************************/

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit x = P2 ^ 0;
sbit y = P2 ^ 1;
sbit z = P2 ^ 2;
sbit Key = P2 ^ 3;

uchar i = 0, count, number, first = 0;
uint list[9] = {10, 10, 10, 10, 10, 10, 10, 10, 10};
uchar code table[] = {
    0x3f, 0x06, 0x5b, 0x4f, //0,1,2,3
    0x66, 0x6d, 0x7d, 0x07, //4,5,6,7
    0x7f, 0x6f, 0x08        //8,9, _
};

void init();
void display();        //数码管显示数字
void digit(uchar num); //数码管位选
void delay(uint z);    //延时(ms)

void main()
{
    init();
    while (1)
        display();
}

void time0() interrupt 1
{
    TH0 = (65536 - 20000) / 256; //20ms
    TL0 = (65536 - 20000) % 256;
    count++;
    if (!Key) //每20ms检测一次按键
    {
        delay(5);
        if (!Key)
        {
            i = 0;
            while (list[i] != 10)  //找到最后一位排队
                i++;
            if (i == 8)
                i--;
            else if (i == 0)
                list[i] = first + 1;
            else
            {
                if (list[i - 1] == 8)
                    list[i] = 1;
                else
                    list[i] = list[i - 1] + 1;
            }
        }
        while (!Key)
            ;
    }
    if (count == 30) //每600ms队列前进1位
    {
        count = 0;
        if (list[0] != 10)
            first = list[0]; //记录处理完的人的序号
        for (i = 0; i < 8; i++)
            list[i] = list[i + 1];
    }
}

/* 初始化 */
void init()
{

    TMOD = 0x01;
    TH0 = (65536 - 20000) / 256; //20ms
    TL0 = (65536 - 20000) % 256;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
}

/* 延时(ms) */
void delay(uint z)
{
    uint x, y;
    for (x = z; x > 0; x--)
        for (y = 110; y > 0; y--)
            ;
}

/* 数码管显示数字 */
void display()
{
    uchar j = 0;
    for (j = 0; j < 8; j++) //输出数组中的数
    {
        digit(j);
        P0 = table[list[j]];
        delay(1);
        P0 = 0; //消影
    }
}

/* 数码管位选 */
void digit(uchar num)
{
    switch (num)
    {
    case 0:x = 1;y = 1;z = 1;break;
    case 1:x = 1;y = 1;z = 0;break;
    case 2:x = 1;y = 0;z = 1;break;
    case 3:x = 1;y = 0;z = 0;break;
    case 4:x = 0;y = 1;z = 1;break;
    case 5:x = 0;y = 1;z = 0;break;
    case 6:x = 0;y = 0;z = 1;break;
    case 7:x = 0;y = 0;z = 0;break;
    }
}

暂无评论

相关推荐

微信扫一扫,分享到朋友圈

2020单片机V2.0-试题3 排队叫号