左边数码管显示产品数量1000,右边数码管显示产品个数和批次分别是6和10
用三个按键,一个用来选择要改变的数字,另外两个按键用来加减,再用一个传感器来计数,自动加一
不知道你这个问题是否已经解决, 如果还没有解决的话:针对问题的具体解决方案如下:
1.确定硬件连接方案,将左边的数码管连接在P1口,右边的数码管连接在P2口,根据具体型号确定使用共阴极数码管还是共阳极数码管,确定哪些管脚接VCC,哪些管脚接GND。
2.编写驱动程序,通过P1口驱动左边的数码管显示产品数量为1000。由于51单片机的IO口最多可以输出高电平5V,需要通过外部电路将其放大到数码管所需的电压(一般为7V-12V)。具体实现方法是将P1口设置为输出模式,然后将P1口的输出与一个经过放大电路之后的电压比较器输入端相接,在程序中分别将数码显示的数据(1,0,0,0)对应的码(0x7C,0x58,0x38,0x3F)赋值给P1口,从而实现在数码管上显示产品数量。
3.编写驱动程序,通过P2口驱动右边的数码管以及对应的批次信息显示。由于要显示的内容比较复杂,需要将其分别拆分成“产品个数”和“批次”两个部分。其中“产品个数”只需要在数码管上显示数字即可,与左边的数码管驱动方式相同;“批次”需要将10个数码管依次进行扫描并切换显示,虽然不需要实现动态扫描,但是扫描的过程依然需要在程序中明确表示。针对这一部分的具体驱动程序实现如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit P2_0 = P2^0; //用P2.0~P2.3分别表示数码管的CS1~CS4引脚
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
uchar code num_table[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F
}; //数码管数字的显示码
uchar code batch_table[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00
}; //数码管批次的显示码
//在P2口的n个数码管中显示数字num
void display_num(uchar num, uchar n) {
uchar code *table=num_table;
if (n == 5) { table = num_table; } //第一个数码管
if (n == 6) { table = num_table; } //第二个数码管
if (n == 7) { table = batch_table; } //批次的第一个数码管
if (n == 8) { table = batch_table; } //批次的第二个数码管
if (n == 9) { table = batch_table; } //批次的第三个数码管
if (n == 10) { table = batch_table; } //批次的第四个数码管
P2_0 = P2_1 = P2_2 = P2_3 = 1; //关闭所有数码管
P2 &= 0xFF00; P2 |= (1<<(n-1)); //打开n对应的数码管,1<<1:0x0002, 1<<2:0x0004, 1<<3:0x0008
P0 = table[num];
}
void main() {
uint i = 0;
uchar num = 0, batch = 0;
while (1) {
//左边的数码管显示产品数量1000
P1 = 0xFF; //清空P1口输出
P1 = 0x08; //输出高电平到P1.3口
display_num(num, 5); //右边的第一个数码管显示产品个数
display_num(batch / 1000, 7); //右边的第一个数码管显示批次的千位
display_num(batch % 1000 / 100, 8); //右边的第二个数码管显示批次的百位
display_num(batch % 100 / 10, 9); //右边的第三个数码管显示批次的十位
display_num(batch % 10, 10); //右边的第四个数码管显示批次的个位
num++; //每次num加1,模拟产品数量的增加
i++;
if (i >= 100) { //每过100次循环,模拟批次增加
i = 0;
batch++;
}
}
}