C51单片机问题,共阳极数码管驱动程序不明白

这是一个共阳极数码管程序,当按P3.5时,个位加1,不断按是会按照1 2 3 4 5 6 7 8 9 显示,一直不明白怎么实现的,求解释下
#include <reg52.h>
typedef unsigned char uchar ;
typedef unsigned char uint ;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;

sbit P3_4 = P3^4;// 十位加一
sbit P3_5 = P3^5;// 个位加一

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
/********************************************************************
* 名称 : Delay()
* 功能 : 延时
* 输入 : i
* 输出 : 无
***********************************************************************/
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}

/********************************************************************
* 名称 : display()
* 功能 : 数码管显示函数
* 输入 : Dis_data
* 输出 : 无
***********************************************************************/
void display(uint Dis_data)
{

P0=table[Dis_data/1000];
P2_0 = 0; // 1
delay(2);
P2_0 = 1;

P0=table[Dis_data%1000/100];
P2_1 = 0; // 2
delay(2);
P2_1 = 1;

P0=table[Dis_data%1000%100/10];
P2_2 = 0; // 3
delay(2);
P2_2 = 1;

P0=table[Dis_data%10];
P2_3 = 0; // 4
delay(2);
P2_3 = 1;

}

/********************************************************************
* 名称 : main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main(void)
{
unsigned int a=0;

while(1)
{
if(P3_4==0) //个位加
{
delay(5);
if(P3_4==0)
{
a++;
if(a>9999)
a=0;
while(!P3_4); //松手检测
}
}
if(P3_5==0)//十位加
{
delay(5);
if(P3_5==0)
{
a=a+10;
if(a>9999)
a=0;
while(!P3_5);//松手检测
}

}
display(a); //显示

}
}

第1个回答  2015-08-14
用的是循环扫描方式,显示用4位的LED数码管。
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
定义“段”,就是对应的数字“0~9”的编码;
P0用于显示数据的输出;
sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
定义显示“权”,就是从哪个数码管上显示出来;
if(P3_4==0) //个位加
{
delay(5); //消除抖动
if(P3_4==0)
{
a++;
if(a>9999)
a=0;
while(!P3_4); //松手检测
}
}
其它的应该没问题了吧?追问

这些我都知道,我不清楚的是这段程序的显示函数是怎么实现的 P0=table[Dis_data%10]; 这一行是个位显示,要让个位显示2的话table[2]必须要取值2,但是显示函数接受的 a的值是随机的啊,取余后怎么能保证是2呢?

本回答被提问者采纳
第2个回答  2015-08-14
大师傅的合理合法登记客户发手机开发合同

单片机c51输出数码管显示为什么共阳极0是0xc0,共阴极是0x7e
因为共阳极的数码管,公共脚接的是电源VCC,所以,想要把那一个二极管点亮就必需将这个点接地,它就会发亮了,例如:要显示数字“0”,就要把“a、b、c、d、e、f”这几个发光二极管接地,其它二极管接VCC,它就会显示成一个“0”了,

51单片机四位一体共阳极数码管显示编程?
不清楚你的电路构成如何,因此先按下面的假设执行段码及位码的输出;其中,延时值可根据实验效果予以调整;设 P0 为输出七段码(共阳极数据);四位数码管有4个阳极,设位码分别与P2.4--P2.7对应,并且=1时表示可点亮数码管;sbit wma1=b2^4; \/\/对应左起第1个数码管的阳极 sbit wma2=b2^5...

请问51单片机数码管如何驱动
我来给楼主一个明确的答案,本人实际试验可行。如果是共阴的数码管,那么位选可以直接用单片机驱动,而段选需要用三极管(PNP)来驱动。如果是共阳的数码管,那么段选可以直接用单片机驱动,而位选需要用三极管(PNP)来驱动。

51单片机控制的数码管原理是什么?
问题补充:因为人的眼睛具有迟滞性,如果给一位数码管接通0.3秒地时间,然后再给另一个接通0.3秒,不断地给几个数码管轮流接通0.3秒,因为人眼的迟滞,就显示出您所要求显示的数,当然具体接通时间,要看数码管的位数等情况自己调节。

51单片机,我在学习控制数码管静态显示时,总跟我实验的结果相反(如,我...
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。参考资料:http:\/\/baike.baidu.com\/view\/556862.htm ...

C51 单片机代码问题
注意:要在主程序里面写入Int_Port();这个初始程序。这是写入数据:Display_Time(12,00,00);12点00分00秒。我的数码管是共阳极的,如果你的是共阴极的,你改以下两个地方: P0 = dis_buf[dis_index]; P2 = dis_digit;

单片机里数码管的共阴极和共阳极是怎么回事?
数码管是共阴极,意思是几段数码管的阴极都接在一起。这样只要给阴极一个高电平,所有的段码都不会亮,如果给低电平,则看对应阳极的电平高低,所以共阴极就是位选,只有它为低电平(选中这位)才能对该数码管操作。

单片机共阳数码亮共阴数码管不亮
1、检查数码管是共阴还是共阳,A表示共阳,K表示共阴。或者直接给公共端接高电平或者低电平,段码端一部分接高电平,一部分接低电平,这样数码管亮的话看公共端接的是高还是低电平就可以判断了。2、看你接的限流电阻是不是太大,大于1K的值有可能不亮,最好不要接限流电阻。做实际的实物电路再加上...

现有一个51单片机系统,P2口接一个共阳极的LED数码管,编写程序满足如下要 ...
delay()能不用别用,这东西会让你的CPU堵塞,使得其利用率大大降低,的如果代码大了,可能会让你的CPU运行起来很卡。另外你程序里出现的是P1,但你的题目描述是P2,如果真是P2口,那么我给你的程序中P1要改为P2,还有就是还不知你的硬件接的对不,要注意一点,51单片机是弱上拉的。

单片机驱动数码管
哈哈哈哈 刚才回答了你一个关于单片机驱动二极管的。现在看来,你问那个问题的原因是想用单片机驱动数码管。共阳极的数码管需要在阳极上接一个PNP的三极管。每一位用一个。数码管的段全部接到单片机的P0口。限流电阻取470欧至560欧之间。使用的时候,用CLR语句打开响应的三极管,这时,此位选通。然后送...

相似回答