单片机7段数码管动态显示程序代码及其说明如下:
#include
#include
#include
unsigned char data dis_digit; //dis_digit---位选通值, 传送到P2口用于选通当
//前数码管的数值, 如等于0xfe时,选通P2.0口数码管
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
扩展资料:
驱动方式:
直流驱动。
是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。优点是编程简单,显示亮度高,缺点是占用I/O端口多。
动态显示驱动:
是将所有数码管通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示。将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制。
当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
参考资料来源:百度百科-七段数码管
照着这个去改写吧:
单片机7段数码管动态显示程序代码及其说明如下:
#include
#include
#include
unsigned char data dis_digit; //dis_digit---位选通值, 传送到P2口用于选通当
//前数码管的数值, 如等于0xfe时,选通P2.0口数码管
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8]; // dis_buf --- 显于缓冲区基地址
unsigned char data dis_index; // dis_index --- 显示索引, 用于标识当前显示的数码 //管和缓冲区的偏移量
Void delay(int t)
{
int i;
while(t--) {
for(i=0;i<120;i++)
{;}
}
}
Void main()
{
P0 = 0xff;
P2 = 0xff;
TMOD = 0x01; //定时器0工作于方式1
TH0 = 0x8C;
TL0 = 0x8B;
IE = 0x8A; //开总中断和定时器1中断允许
dis_buf[0] = dis_code[0x1];
dis_buf[1] = dis_code[0x2];
dis_buf[2] = dis_code[0x3];
dis_buf[3] = dis_code[0x4];
dis_buf[4] = dis_code[0x5];
dis_buf[5] = dis_code[0x6];
dis_buf[6] = dis_code[0x7];
dis_buf[7] = dis_code[0x8];
dis_digit = 0xf9; //控制在数码管上显示的数字效果,按位
dis_index = 0;
TR0 = 1;
while(1);
}
Void timer0() interrupt 1
//定时器0中断服务程序, 用于数码管的动态扫描
//dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
//dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值,
//如等于0xfe时, 选通 P2.0口数码管 dis_buf --- 显于缓冲区基地址
{
TH0 = 0x8C;
TL0 = 0x8B;
P2 = 0xff; // 先关闭所有数码管
P0 = dis_buf[dis_index]; // 显示代码传送到P0口
P2 = dis_digit;
dis_digit = _crol_(dis_digit,2); // 位选通值左移, 下次中断时选通下一位数码管
delay(500);
dis_index++;
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}