一、原理图分析
电阻R15~R22起到限流作用,防止烧坏数码管;com1~com8为数码管的8个公共端,用于控制哪个数码管显示;a1~g1为数码管的7个段,显示0~F,dp1为小数点。
Y7C控制数码管的段码,即控制数码管显示0~F的数值;Y6C控制数码管的公共端,即选择使用哪一个数码管。
在此,数码管为共阳数码管F3461BH,低电平点亮,原理如下图:
0~9的编码值可直接从提供的资源包中查找
二、程序编写
1、选择从左往右数的第一个数码管显示数字2:
#include<reg51.h>
unsigned char code duanma[16]=
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//用数组保存0~F的16个数值的编码
void main()
{ P2=0xA0;P0=0x00;P2=0x80;P0=0xFF; //关闭蜂鸣器、继电器等外设
P2=0xC0;P0=0x01;P2=0xE0;P0=0xa4; //开Y6C,选择从左往右数的第一个数码管亮;开Y7C,显示数字2
}
2、实现功能:8个数码管分别依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此反复。
#include<reg51.h>
unsigned char i,j;
unsigned char code duanma[16]=
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//用数组保存0~F的16个数值的编码,方便通过调用数组使用其值
void delay()//延时函数
{
int i,j;
for(i=0;i<500;i++)
for(j=0;j<600;j++);
}
void main()
{ P2=0xA0;P0=0x00;P2=0x80;P0=0xFF; //关闭蜂鸣器、继电器等外设
for(i=0;i<8;i++)
{
for(j=0;j<10;j++)//8个数码管分别依次显示0~9的值
{ P2=0xC0;P0=0x01<<i;//依次左移i位,从左往右依次选择数码管显示
P2=0xE0;P0=duanma[j];//每个数码管显示0~9的数字后轮到下一个数码管依次显示
delay();delay();
}
for(i=0;i<16;i++)//8个数码管同时显示0~F的值
{
P2=0xC0;P0=0xff;
P2=0xE0;P0=duanma[i];
delay();delay();
}
}
}