注册 登录
编程论坛 单片机编程

这是一段4位共阳极数码管”从0到9循环显示数字“的程序,不知道是什么意思望前辈们来看看~~

弟大勿勃 发布于 2015-05-18 10:05, 18037 次点击
这是一段4位共阳极数码管”从0到9循环显示数字“的程序,其中有好多地方都不理解,比如说“di”是什么,如何实现数字的从0到9的来回循环显示等。望各位前辈详细讲解一下,最好是在各关键代码上详细注释一下。小弟必将虚心采纳,致谢!
程序代码:
#include "reg51.h"
#include "intrins.h"
#include"absacc.h"
#include"math.h"
typedef unsigned char BYTE;
typedef unsigned int   WORD;
/* LED口地址*/
#define led_data XBYTE[0x6000] //写命令
BYTE led_w;
BYTE
led_dm[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0:0xc0,1:0xf9,2:0xa4,3:0xb0,4:0x99,5:0x92,6:0x82,7:0xf8,8:0x80,9:0x90
BYTE di;
/*****************LED显示位置********************/
void LED_crt(BYTE val)  
{
led_data=led_dm[val];//0:0xc0,1:0xf9,2:0xa4,3:0xb0,4:0x99,5:0x92,6:0x82,7:0xf8,8:0x80,9:0x90
P2 |= 0xff;

 P2 &= led_w;
led_w>>=1;
if (led_w==0x0f) led_w=0xf7;
}
void Delay(WORD n)
{
WORD x;
while(n--)
{

 x=500;  while(x--);
}
}
void main()
{
led_w=0xf7;
di=0;
while(1)   
{
  LED_crt(di);
  di++;
  if(di>0x09) di=0;

 Delay(1000);  }
4 回复
#2
弟大勿勃2015-05-18 11:20
回复 楼主 弟大勿勃
有木有人~~
#3
tlliqi2015-05-18 14:07
不懂单片机
#4
弟大勿勃2015-05-18 20:27
#5
弟大勿勃2015-05-18 21:38
程序代码:

#include "reg51.h"
#include "intrins.h"
#include"absacc.h"
#include"math.h"
typedef unsigned char BYTE;
typedef unsigned int   WORD;
/* LED口地址*/
#define led_data XBYTE[0x6000] //写命令
BYTE led_w;
BYTE
led_dm[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0:0xc0,1:0xf9
,2:0xa4,3:0xb0,4:0x99,5:0x92,6:0x82,7:0xf8,8:0x80,9:0x90
BYTE di;
/*****************LED显示位置********************/
void LED_crt(BYTE val) // val与主函数的di对应,di初值等于0则相当于数组取第0位(数码管显示0)//
{
led_data=led_dm[val];//0:0xc0,1:0xf9,2:0xa4,3:0xb0,4:0x99,5:0x92,6:0x82,7:0xf
8,8:0x80,9:0x90
 P2 |= 0xff; //p2与1111 1111相或,使p2为1111 1111(此时位选都不亮)
 P2 &= led_w; //p2与led-w的初值1111 0111相与,相当于点亮第四位数码管
led_w>>=1; //1111 0111右移一位,变成0111 1011(第3位数码管亮)
if (led_w==0x0f) led_w=0xf7; //当led-w==0000 1111时使led-w重新置为1111 0111
}
void Delay(WORD n)
{
WORD x;
while(n--)
{
 x=500;  while(x--);
}
}
void main()
{
led_w=0xf7; //led=11110111,第四位数码管点亮
di=0;

while(1)   
{
  LED_crt(di); //选取led-dm数组中的值
  di++;//di自加
  if(di>0x09) di=0; //当di加到9的时候使di又置0
 Delay(1000); //延迟,为了使数码管循环能被肉眼清楚看到
}
}
1