一、原理图分析
电阻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(); } } }