04-共阳数码管的动态显示
共阳数码管的动态显示
代码如下:
#include <REGX52.H>
void Display_Dynamic();
unsigned char month = 1;
void Delay_ms(unsigned int xms) {
unsigned int i,j;
for(i = 0;i<xms;i++) {
for(j=0;j<299;j++);
}
}
void Delay(unsigned char t) {
while(t--) {
// 此代替了中断,没有这一步会出问题
Display_Dynamic();
}
}
void _74HC138(unsigned char n) {
switch(n) {
case 4: // LED使能
P2 = (P2 &0x1f)|0x80;
break;
case 5: // 蜂鸣器/继电器
P2 = (P2 &0x1f)|0xa0;
break;
case 6: // 数码管位选
P2 = (P2 &0x1f)|0xc0;
break;
case 7: // 数码管段选
P2 = (P2 &0x1f)|0xe0;
break;
case 0:
P2 = (P2 &0x1f)|0x00;
break;
}
}
void SystemInit(void) {
_74HC138(5);
P0 = 0x00;
_74HC138(4);
P0= 0xff;
}
void Nixie(unsigned char Location,Number) {
unsigned int code num[11] ={
0xc0, // 0 1100 0000
0xf9, // 1 1111 1001 abged 为0
0xa4, // 2 1010 0100
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
0xbf
};
switch(Location) {
case 1: _74HC138(6); P0=0x01;break;
case 2: _74HC138(6); P0=0x02;break;
case 3: _74HC138(6); P0=0x04;break;
case 4: _74HC138(6); P0=0x08;break;
case 5: _74HC138(6); P0=0x10;break;
case 6: _74HC138(6); P0=0x20;break;
case 7: _74HC138(6); P0=0x40;break;
case 8: _74HC138(6); P0=0x80;break;
}
_74HC138(7);
P0 = num[Number];
Delay_ms(5);
P0 = 0xFF;
}
// 数码显示函数
void Display_Dynamic() {
Nixie(1,2); // 2
Delay_ms(2);
Nixie(2,0); // 0
Delay_ms(2);
Nixie(3,1); // 1
Delay_ms(2);
Nixie(4,8); // 8
Delay_ms(2);
Nixie(5,10); // - 1011 1111
Delay_ms(2);
Nixie(6,10); // - 1011 1111
Delay_ms(2);
Nixie(7,month/10); // 十位
Delay_ms(2);
Nixie(8,month%10); // 个位
Delay_ms(2);
}
void main() {
unsigned char i,j;
SystemInit();
while(1) {
Display_Dynamic();
month++;
//Delay_ms(500);
if(month > 12) {
month = 1;
}
// 此为上述的延迟函数
Delay(100);
}
}