利用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;
}
}
暂无评论
要发表评论,您必须先 登录