用定时器0实现数码管的0-99变化
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6;//段选
sbit wela = P2^7;/位选
uint n=0;//个位
uint b=0;//十位
uint m=0;//控制十位
uint o=0;//整体的计时
uchar W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//位选
uchar D[16] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//段码
uchar num1;//定时器
void time(uint xms)//用软件延时给予数码管动态显示更简单
{
uint i , j ;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
TMOD = 0x01;
TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;
EA = 1;
ET0 = 1;
TR0 = 1;//定时器
while(1)
{
if(n>9)//个位只有9个数,所以当n=10(即显示A的时候)变为0
n=0;
if(num1==20)//定时器用的50ms
{
num1=0;
n++;//每秒n+1来实现数组的选择
o++;//时间+1
m++;
if(m==10)//没当10秒时,b+1实现十位的变化
{
m=0;
b++;
}
/*******0-9*******/
if(o<=9)
{
dula = 1;
P0 = D[n];
dula = 0;
wela = 1;
P0 = W[0];
dula = 0;
}
}
/*******10-99******/
if(o>9)
{
dula = 1;
P0 = D[n];
dula = 0;
P0 = 0xFF;//消影
wela = 1;
P0 = W[1];
dula = 0;
/*十位*/
time(1);//实现动态显示
dula = 1;
P0 = D[b];
dula = 0;
P0 = 0xFF;//消影
wela = 1;
P0 = W[0];
dula = 0;
time(1);
}
}
}
void T0_time() interrupt 1 //定时器部分
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
}
通过这段代码可以了解到定时器中断的基本用法