数码管每个字段都是笔画都是和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=