以前做而论道写过一个“按键按下的先后顺序判断”的程序,可见:
http://hi.baidu.com/do_sermon/item/e3d3a8d627fa39bd32db9045
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/e236ca004289f6037aec2cc1.html
(下面的链接,是百度改版前的,已经无效了,留做纪念)
这是分别统计“进入”和“退出”人数的。
后来,有网友要求把这两种数字合并,形成一个“在场人数”的统计显示器。
应此要求,做而论道完成了设计,电路、程序在 PROTEUS 中仿真运行时,截图如下:
图片链接:http://xiangce.baidu.com/picture/detail/bfea0b76230691d197a8d5f30951d4d175878b88
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/65c7c57bdab44aedb6de295ab31c8701a38bfbda.html#
//人数统计程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit K3 = P3^2;
sbit K4 = P3^3;
uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
// 0 1 2 3 4 5 6 7 8 9
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc2,0x89,0xff};
// A b C d E F G H [ ]
uchar DispD[] = {0, 0, 0, 0, 0, 0};
uchar DispW[] = {1, 2, 4, 8, 16, 32};
//------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
//------------------------------------
void display(void)
{
uint i;
for (i = 0; i < 6; i++) {
P0 = table[DispD[i]];
P2 = ~DispW[i];
delay(2);
P2 = 255; //关闭显示
}
}
//------------------------------------
void main()
{
unsigned long num = 0;
while(1) {
display();
//--------------------------
if (K3 == 0) {
display();
if (K3 == 0) {
while(K3 == 0) display();
while(K4 == 1) display();
num++;
if (num >= 999999) num = 0;
DispD[0] = num % 10;
DispD[1] = num / 10 % 10;
DispD[2] = num / 100 % 10;
DispD[3] = num / 1000 % 10;
DispD[4] = num / 10000 % 10;
DispD[5] = num / 100000 % 10;
while(K4 == 0) display();
}
}
//--------------------------
if (K4 == 0) {
display();
if (K4 == 0) {
while(K4 == 0) display();
while(K3 == 1) display();
num--;
if (num >= 999999) num = 999999;
DispD[0] = num % 10;
DispD[1] = num / 10 % 10;
DispD[2] = num / 100 % 10;
DispD[3] = num / 1000 % 10;
DispD[4] = num / 10000 % 10;
DispD[5] = num / 100000 % 10;
while(K3 == 0) display();
}
}
//--------------------------
}
}
//在程序中,数字分解的部分,也可以单独写成一个函数。
//=====================================================