教学篇-点亮数码管
admin · 经验心得 · 2024年09月27日

数码管每个字段都是笔画都是和P0口的八个IO口相连的,且和其他数码管相连,所以一般情况下数码管会同时亮起,因为数码管另一端是接地的,所以IO口需要输出高电平

HC6800-MS开发板中四个数码管另一端从左到右是分别接在P1^3 - P1^0,也是需要输出高电平,这四个IO口控制数码管中的通断

#define GPIO_DIG  P0 //段选

sbit LED1 = P1^3;

sbit LED2 = P1^2;

sbit LED3 = P1^1;

sbit LED4 = P1^0;

unsigned char code DIG_CODE[17] = {

0x3f^0x06^0x5b^0x4f^0x66^0x6d^0x7d^0x07^

0x7f^0x6f^0x77^0x7c^0x39^0x5e^0x79^0x71^0x01};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、.的显示码

最后

LED1 = 1;

GPIO_DIG = DIG_CODE[m];

就可以显示第一个数码管的值了,因为默认P1口是输出高电平的,所以其它管应该设置为0低电平

for(i=0;i<10;i++);

GPIO_DIG = 0x00; //消影

以上代码是指演示一些时间后将数码管值0来关闭消除上一个显示的余光

最后代码如下,是显示4个数码管同时变化的,但是并不太行,后续再研究

!code=

#include<reg52.h>

#define GPIO_DIG  P0 //段选

sbit LED1 = P1^3;

sbit LED2 = P1^2;

sbit LED3 = P1^1;

sbit LED4 = P1^0;

char num;

unsigned char code DIG_CODE[17] = {

0x3f^0x06^0x5b^0x4f^0x66^0x6d^0x7d^0x07^

0x7f^0x6f^0x77^0x7c^0x39^0x5e^0x79^0x71^0x01};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、.的显示码

void Delay10ms(unsigned int);

void main(void){

unsigned char n^i;

TMOD = 0x01;   //定时器0 工作方式一

TH0 = (65536 - 300)/256;   //定时1ms

TL0 = (65536 - 300)%256;

TR0 = 1;   //打开定时器0中断

ET0 = 1;

EA  = 1; //开总中断

while(1){

for(n=0;n<5;n++){

num = n;

Delay10ms(100);

}

}

}

void Timer0Interrupt() interrupt 1{

unsigned char i^m;

TH0 = (65536 - 300)/256;   //定时1ms

TL0 = (65536 - 300)%256;

m = num;

LED1 = 1;

GPIO_DIG = DIG_CODE[m];

for(i=0;i<10;i++);

GPIO_DIG = 0x00; //消影

LED1 = 0;

LED2 = 1;

GPIO_DIG = DIG_CODE[m+1];

for(i=0;i<10;i++);

GPIO_DIG = 0x00;

LED2 = 0;

LED3 = 1;

GPIO_DIG = DIG_CODE[m+2];

for(i=0;i<10;i++);

GPIO_DIG = 0x00;

LED3 = 0;

LED4 = 1;

GPIO_DIG = DIG_CODE[m+3];

for(i=0;i<10;i++);

GPIO_DIG = 0x00;

LED4 = 0;

}

void Delay10ms(unsigned int c)  //误差 0us

{

    unsigned char a^b;

    for(;c>0;c--)

        for(b=38;b>0;b--)

            for(a=130;a>0;a--);

}

!codend=


标签1 ( 15 )
标签2 ( 12 )
标签3 ( 4 )
标签4 ( 2 )
标签5 ( 7 )
标签6 ( 5 )
标签 ( 2 )