数码管显示原理

选用共阳极数码管,IO输出0表示亮,输出1表示不亮。

推导出共阳极显示0-9的十六进制如下:
数字显示-共阳
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //定义段选信号
sbit wela=P2^7; //定义位选信号
void main()
{
wela=1; //位选为高电平,选择某个数码管
P0=0x01; //P0=0000 0001,打开第一个数码管
wela=0; //关闭位选锁存器
//显示0
// dula=1; //段选锁存器打开
// P0=0x40; //P0=0100 0000,0表示亮
// dula=0; //段选锁存器关闭;
//显示1
// dula=1; //段选锁存器打开
// P0=0xf9; //P0=1111 1001,
// dula=0; //段选锁存器关闭;
//显示2
// dula=1; //段选锁存器打开
// P0=0x24; //P0=0010 0100,
// dula=0; //段选锁存器关闭;
//显示3
// dula=1; //段选锁存器打开
// P0=0x30; //P0=0011 0000,
// dula=0; //段选锁存器关闭;
//显示4
// dula=1; //段选锁存器打开
// P0=0x19; //P0=0001 1001,
// dula=0; //段选锁存器关闭;
//显示5
// dula=1; //段选锁存器打开
// P0=0x12; //P0=0001 0011,
// dula=0; //段选锁存器关闭;
//显示6
// dula=1; //段选锁存器打开
// P0=0x02; //P0=0000 0010,
// dula=0; //段选锁存器关闭;
// //显示7
// dula=1; //段选锁存器打开
// P0=0xf8; //P0=1111 1000,
// dula=0; //段选锁存器关闭;
// //显示8
// dula=1; //段选锁存器打开
// P0=0x00; //P0=0000 0000,
// dula=0; //段选锁存器关闭;
// //显示9
dula=1; //段选锁存器打开
P0=0x10; //P0=0001 0000,
dula=0; //段选锁存器关闭;
while(1);
}
对应共阴极的数码管
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
}
注:code关键字表示编码,在单片机c语言中,定义数组是占用内存空间的,定义编码是直接分配到程序空间中,编译后编码占用的是程序存储空间而非内存空间。
数字显示 延时从1-f显示 共阴
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //定义段选信号
sbit wela=P2^7; //定义位选信号
unsigned char code tableK[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};
uint num;
void delayms(uint);
void main()
{
wela=1; //位选为低电平,选择某个数码管
P0=0xfe; //P0=1111 1110,打开第一个数码管,延时从1-f显示
wela=0; //关闭位选锁存器
// dula=1;
// P0=tableK[1];
// dula=0;
while(1)
{
for(num=0;num<16;num++)
{
dula=1;
P0=tableK[num];
dula=0;
delayms(500);
}
};
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}