看了下, 写法有一些问题, 还是重改了下, 仅仅给你参考, 5年前用过89C52,现在都不用了。
#include<reg51.h>
//--?????IO--//
#define GPIO_DIG P0
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//--??????--//
unsigned char code DIG_CODE[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0?1?2?3?4?5?6?7?8?9?A?b?C?d?E?F????
uchar num[8];
uint counter=0;
unsigned long second;
void delay(uint t)
{
uint i,j;
for (i=0; i<t; i++)
for (j=0; j<1000; j++);
}
//*****************Add the interrupt for counting*************//
void time0_init()
{
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
}
void interrupt_init()
{
EA = 1;
ET0 = 1;
}
//***********Using your 74HC138 to get the scanning *******************//
void refresh()
{
static uint8 j=0;//avoid scanning always start from 0; only initialize one time;
switch(j)
{
case 0: LSA = 0; LSB = 0; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[0]];delay(2);break;
case 1: LSA = 1; LSB = 0; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[1]];delay(2);break;
case 2: LSA = 0; LSB = 1; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[2]];delay(2);break;
case 3: LSA = 1; LSB = 1; LSC = 0; j++; GPIO_DIG=DIG_CODE[num[3]];delay(2);break;
case 4: LSA = 0; LSB = 0; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[4]];delay(2);break;
case 5: LSA = 1; LSB = 0; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[5]];delay(2);break;
case 6: LSA = 0; LSB = 1; LSC = 1; j++; GPIO_DIG=DIG_CODE[num[6]];delay(2);break;
case 7: LSA = 1; LSB = 1; LSC = 1; j=0; GPIO_DIG=DIG_CODE[num[7]];delay(2);break;
default: break;
}
}
void main()
{
time0_init();
interrupt_init();
while(1)
{
refresh();
}
}
void time0_interrupt() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x67;
counter++;
if (1000==counter)// many interrupt will creates the error;
{
counter=0;
seccond++;// this is just for your reference, it's not accurate;
if (99999999==sec)
{
sec = 0;
num[0]=sec/10000000;
num[1]=sec%10000000/1000000;
num[2]=sec%1000000/100000;
num[3]=sec%100000/10000;
num[4]=sec%10000/1000;
num[5]=sec%1000/100;
num[6]=sec%100/10;
num[7]=sec%10;
}
}
}
|