|
发表于 2006-3-18 22:31:16
|
显示全部楼层
你点击我给你回复的链接,里面是我修改后的程序,在我的机器上调试过,一切正常,我用的是Keil c7.5和Proteus 6.7sp3.我只修改了main.c中对FLAG的类型定义和DISPLAY函数中输出段码的部分.原理图未做任何修改.一切功能正常.
你的延时函数,我未细看,但在我的机器上运行正常.
以下是我修改后的main.c,注释部分的小括号中是你原来的语句
#include <REG51.H>
unsigned char flag=0; //(bit flag=0;)
unsigned int cnt =1234;
unsigned char q[4] =
{0,0,0,0};
unsigned char table[10] = {0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//段码错误,硬件原理图中你用的是共阴数码管,段驱动应该是高电平才对,你怎么正好弄反了?
//没关系,不用改段码,只要在DISPLAY中将段码取反输出即可.
/*unsigned char table[10] =
{
0x3f,
0x06,
0x5b,
0x4f,
0x66,
0x6d,
0x7d,
0x07,
0x7f,
0x6f
};
*/
void service_keyup() interrupt 0 using 1
{
flag=1;
}
void service_keydown() interrupt 2 using 2
{
flag=2;
}
void delay_1us(void) //1us延时函数
{
for(;;);
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<(unsigned int)(4*143-2);i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
{
delay_1ms();
}
}
void process(unsigned int i,unsigned char *p)
{
p[0] = i/1000;
i = i%1000;
p[1] = i/100;
i = i%100;
p[2] = i/10;
i = i%10;
p[3] = i;
}
void init_io(void)
{P0=0xff;
P1=0xff;
}
void display(unsigned char *p)
{
unsigned char i;
unsigned char sel=0x01;
for(i=0;i<4;i++)
{
P0=~sel;
P1=~(table[p]); //(P1=table[p];)
delay_nms(1);
sel = sel<<1;
}
}
main()
{
init_io();
TCON=0x05;
IE=0x85;
while(1)
{
if(flag==1)
{
cnt++;
flag=0;
}
else if(flag==2)
{cnt--;
flag=0;
}
process(cnt,q);
display(q);
}
} |
|