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
大师傅的合理合法登记客户发手机开发合同

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

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

关于51单片机P0口驱动数码管的问题
加接上拉排阻后就有了高电平驱动能力,输出电流能力 取决于上拉排阻的阻值 上拉电阻阻值小,其输出高电平时提供的电流就大 但输出低电平时从单片机IO口灌入的电流就越大

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

51单片机控制的数码管原理是什么?
数码管其实是由发光二极管组成,有共阴极和共阳极之分,对于共阳极来说,一位数码管由8个二极管组成,他们的阳极接在一起接+5v电源,而各个阴极与某个端口,如p1的8个引脚相连,当某个引脚输出低电平的时候数码管对应的二极管亮。问题补充:因为人的眼睛具有迟滞性,如果给一位数码管接通0.3秒地时间,...

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

51单片机共阳极数码管显示程序里编码为什么会有共阴极的编码?_百度知 ...
你好!共阴和共阳的编码其实是通用的,用的时候,只要取反就行了 P0=~Data_[temp\/100];~就是取反了

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

单片机大神看看那里错了。蜂鸣器一直响 我是51 单片机,共阳极数码管
学习单片机要对应单片机的原理图,你只附了程序,没有电路图,我不知道硬件连接是怎么样的,只能你自己去检查一下是不是蜂鸣器和P0、P3.4、P2.6、P2.7有连接,来检查问题。

51单片机数码管如何依次点亮?
51单片机数码管依次点亮:选择数码管操作称为位选,根据自己的开发板原理图找到位选对应的管脚,以共阴极为例。要在编程时执行选中操作,只要给对应管脚低电平即可。段选同样。如果每个单独连接占用管脚太多,很浪费硬件资源,所以采用多位串联控制。数码管通常有两种不同的接法,共阴极和共阳极,共阴极顾...

相似回答