单片机 数码管的点亮

来源:百度知道 编辑:UC知道 时间:2024/06/17 02:23:57
首先,我是单片机初学者。晚上才看到数码管的点亮方式,于是自己尝试着写了个程序,其目的是8个数码管由低到高一次显示其顺序:最低的显示1,次低显示2···最高显示8.一下是我的程序:

#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int

uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delayms (uint x)
{
uint i,j;

for(i=x;i>0;i--)
for(j=120;j>0;j--);
}

void main()
{
uint i;

while(1)
{
P1_2=0;
for(i=1;i<9;i++)
{
P1_1=0;
P1_0=1;
P0=table[i];
P1_0=0;
P0=0xff;
P1_1=1;
P0=table[i-1];
P1_1=0;
P0=0;
delayms(1500);
}
}
}

然后问题出来了,首先根本不能实现我说的功能。

自己也尝试检查了下,发现从第二个P0=table[i-1]开始就没执行了,其值也没变。

请高人帮忙解答下午什么,怎么改正?
各位高人如果有时间,烦劳用软件测试下,P0=table[i-1];
P1_1=0;
P0=0;
delayms(1500);
现在主要的问题是这几句根本就不执行了,虽然知道了问题出在这,也大概明白怎么修改,就修改了也没用,不执行这句怎么改也白搭。所以,怎么才

虽然不知道你电路怎么连得,但是这个实验是51单片机的一个经典实验,也是初学者容易犯错误的实验,所以我大体可以帮你分析下.
"其目的是8个数码管由低到高一次显示其顺序",你的意思是同时显示吧.
你的程序主要语句我依次给你标号.
1. P1_1=0;
2. P1_0=1;
3. P0=table[i];
4. P1_0=0;
5. P0=0xff;
6. P1_1=1;
7. P0=table[i-1];
8. P1_1=0;
9. P0=0;

第二行和第四行是的P1_0是操作的段选,此时第3行给P0赋值是数码管要显示的数.
第6和第8行是位选,所以第7行代码中,赋给P0的值应该是选择第几个数码管,而你这里却是赋的一个要显示的数,当然出错了.

这样要怎么改你应该明白了吧?

当然有问题了
P1是位选,你就控制了P1.0和P1.1两位数码管不停刷新不同的数字,当然了。而且延时也太长了。还是好好了解一下数码管动态显示

错误有很多:
1、 P1_0、 P1_1、 P1_2等没有定义;
2、八个数码管即有8位位选,但只用P1_0、 P1_1是不够的,就算你P1口有译码器也要有3个输出口要用上;
3、主程序里i=9后没有清1,i=9后只能停留在9;
4、你使用的是动态驱动,即显每只数码管都要经过:位选、段选、P0赋值、关段选、延时。