单片机驱动LED数码管有很多方法,按显示方式可以分为静态显示和动态显示。在一般较为简单的系统中,为了减少成本,动态显示方案具有一定实用性,也是目前单片机数码管显示较为常用的一种显示方法。
下图为51单片机直接驱动4位置7段数码管动态显示程序的流程图
C语言程序及讲解
*******************************************************************************
程序功能为4位7段数码管动态显示程序,51单片机16ms定时选通数码管的控制端口,刷新数码管的显示内容,达到4位数码管的动态显示;16ms定时通过定时器T0实现。
*******************************************************************************
#include <reg51.h> // 引用标准库头文件
#define uchar unsigned char
#define uint unsigned int
uchar buf[4]; // 待显示数据缓冲区
void main()
{
P2=0x00; // 关闭显示
TMOD = 0x01; // T0工作方式1
/* 16ms 定时设置 */
TH0 = (16000/256);
TL0 = (16000%256);
//定时器T0打开
TR0 = 1; //启动定时
ET0 = 1;
EA = 1; //开定时器中断
//待显示数据初始化
buf[3] = 3;
buf[2] = 2; //四个待显示数据单元初始为0,1,2,3
buf[1] = 1;
buf[0] = 0;
while(1); //等待定时数码管扫描显示
}
// 定时器0中断服务子程序,定时动态扫描显示
void time0_int(void) interrupt 1
{
/* 16ms 定时设置 */
TH0 = (16000/256); //定时数据重装
TL0 = (16000%256);
display(); //扫描显示更新
}
//根据共阴极字型编码表获取0~9,A~B显示代码
uchar getcode(uchar i)
{
uchar p;
switch (i)
{
case 0: p=0x3f; break; /* 0 */
case 1: p=0x06; break; /* 1 */
case 2: p=0x5B; break; /* 2 */
case 3: p=0x4F; break; /* 3 */
case 4: p=0x66; break; /* 4 */
case 5: p=0x6D; break; /* 5 */
case 6: p=0x7D; break; /* 6 */
case 7: p=0x07; break; /* 7 */
case 8: p=0x7F; break; /* 8 */
case 9: p=0x67; break; /* 9 */
case 10: p=0x77; break; /* A */
case 11: p=0x7C; break; /* B */
case 12: p=0x39; break; /* C */
case 13: p=0x5E; break; /* D */
case 14: p=0x79; break; /* E */
case 15: p=0x71; break; /* F */
default: break;
}
return(p);
}
//数据显示更新函数
void display(void)
{
temp=0x01 //用于选通数码管,初始选通D0
for(i=0,i<4;i++)
{
P0=getcode(buf); //输出数据
P2=temp //数码管选通
temp=(temp<<0x01); //选通下一位数码管
}
} |