本帖最后由 darlin520 于 2012-6-9 18:18 编辑
小弟用定时器做的秒表为什么能在1602液晶上显示却不能在数码管上显示呢,原理是一样的呀??
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit du=P2^6; // 数码管段选
sbit wei=P2^7; //数码管位选
uchar code table[]={0x3f , 0x06 , 0x5b , 0x4f ,
0x66 , 0x6d ,0x7d , 0x07 , 0x7f , 0x6f}; //共阴数码管码表
uchar ms;
uchar miao;
uchar i,j,k,l; //留给数码管分段显示用
void delay(uint z) //延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
ms=0;
miao=0;
while(1)
{
i=ms/10; //用i来放ms的十位,
j=ms%10; //用j来放ms的个位
k=miao/10; //用K来放miao的十位
l=miao%10; //用l来放miao的个位
TMOD=0x01; // 设置定时器0 为工作方式方1
TH0=(65536-9174)/256; //装初值,11.0592MHZ的机器周期是1.09us,计9174次刚好约10ms
TL0=(65536-9174)%256; //装初值
EA=1; //开总中断
ET0=1; //开定时器T0中断
TR0=1; //打开定时器T0;
du=1; //打开段选
P0=table[k]; //把秒的十位数给P0显
du=0; //关闭段选,因为用到了锁存器,段选和位选都用到了P0
P0=0xff; //消影
wei=1; //打开位选
P0=0xfe; //选中第一个数码管
wei=0; //关闭位选
delay(1); //延时
du=1;
P0=table[l]; //把秒的个位给P0显示
du=0;
P0=0xff;
wei=1;
P0=0xfd; //选中第2个数码管
wei=0;
delay(1);
du=1;
P0=table; //把0.1s给P0显示
du=0;
P0=0xff;
wei=1;
P0=0xfb; //选中第3个数码管
wei=0;
delay(1);
du=1;
P0=table[j]; //把0.01s给P0显示
du=0;
P0=0xff;
wei=1;
P0=0xf7; //选中第4个数码管
wei=0;
delay(1);
}
}
void time0() interrupt 1
{
TH0=(65536-9174)/256;
TL0=(65536-9174)%256;
ms++; //每进入一次中断,0.01s位自加1、
if(ms==100)
{
ms=0;
miao++; //加到100次即1S时,秒变量自加1
if(miao==100) //加到100后秒变量清零
{
miao=0;
}
}
} |