本帖最后由 时光找茬 于 2014-6-6 11:56 编辑
终于改好了,发光二极管自己亮的,数码管送段选前应关闭位选。
改好后程序:
/* 用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,
用定时器1的方式1实现数码管的前两位59s循环计时。 */
#include //头文件
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ //编码数码管
0X3F,0X06,0X5B,0X4F,
0X66,0X6D,0X7D,0X07,
0X7F,0X6F,0X77,0X7C,
0X39,0X5E,0X79,0X71};
***it led1=P1^0;
***it dula=P2^6;
***it wela=P2^7;
uchar num0,num1,num,shi,ge;
void display(uchar,uchar);
void delayms(uint);
void main()
{
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
TMOD=0X11; //设置定时器工作模式,T0,T1均为方式1
TR0=1; //启动定时器0
TR1=1; //启动定时器1
TH0=(65536-50000)/256; //定时器0装入初值
TL0=(65536-50000)%256;
TH1=(65536-50000)/256; //定时器1装入初值
TL1=(65536-50000)%256;
while(1)
{
display(shi,ge);
}
}
void display(uchar shi,uchar ge)
{
// P0=0XFF;
dula=0;
wela=1;
P0=0XFE;
wela=0;
P0=0XFF;
dula=1; //数码管十位
P0=table[shi];
dula=0;
delayms(5);
// P0=0XFF;
dula=0;
wela=1;
P0=0XFD;
wela=0;
P0=0XFF;
dula=1;
P0=table[ge];
dula=0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//定时器0
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num0++;
if(num0==4)
{
num0=0;
led1=~led1;
}
}
//定时器1
void T1_time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num1++;
if(num1==20)
{
num1=0;
num++;
if(num==60)
num=0;
shi=num/10;
ge=num%10;
}
}
|