这个就是前面的历程的一个综合定时器T0控制流水灯,T1控制时间,通过数码管显示出来。代码如下:
本文引用地址://m.amcfsurvey.com/article/201611/321309.htm//Led流水灯,五位数码管100000秒计时
#include//头文件
#include//循环左旋函数所在头文件
#define uint unsigned int//宏定义无符号整形
#define uchar unsigned char//宏定义无符号字符型
sbit weixuan=P2^7;//声明P2.7为位选端口
sbit duanxuan=P2^6;//声明P2.6为段选端口
uint number1,number2,aa,number; //number1:T0计满次数;number2:T1计满次数;number:显示的秒数;aa:P0端口显示赋值
uint no1,no2,no3,no4,no5;//分别代表五个数码管显示的数字(字符断码数字序号)
void delay(uint);//声明延时函数
void display(uint,uint,uint,uint,uint);//声明数码管显示函数
uchar code table[]={//字符断码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//C语言编码定义
void main()//主函数入口
{
aa=0xfe;//aa初始化,点亮第一的LED
//定时器初始化
TMOD=0x11;//TMOD赋值,确定T0/T1工作方式
TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1计算初值
TL0=(65536-46080)%6;
TH1=(65536-46080)/256;
TL1=(65536-46080)%6;
EA=1;//总中断打开
ET0=1;//开T0/T1中断
ET1=1;
TR0=1;//TR0/TR1置位,启动定时器
TR1=1;
while(1)//不可少的大循环
{
display(no1,no2,no3,no4,no5);//数码管显示
}
}
//延时函数主体
void delay(uint s)
{
uint i,j;
for(i=s;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
//显示数码管显示函数主体
void display(uint no1,uint no2,uint no3,uint no4,uint no5)//数码管显示函数主体
{
//数码管1显示①送断码;②选择要显示数码管
duanxuan=1;//打开段选锁存器
P0=table[no5];//送断码
duanxuan=0;//关闭(锁住)锁存器
P0=0xff;//必不可少的清屏
weixuan=1;//打开位选锁存器
P0=0xfe;//选择数码管
weixuan=0;//关闭锁存器
delay(2);//延时
//数码管2显示
duanxuan=1;
P0=table[no4];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfd;
weixuan=0;
delay(2);
//数码管3显示
duanxuan=1;
P0=table[no3];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfb;
weixuan=0;
delay(2);
//数码管4显示
duanxuan=1;
P0=table[no2];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xf7;
weixuan=0;
delay(2);
//数码管5显示
duanxuan=1;
P0=table[no1];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xef;
weixuan=0;
delay(2);
}
//定时器T0方式一中断服务程序
void T0_time_no1()interrupt1
{
TH0=(65536-46080)/256;//预装初始值
TL0=(65536-46080)%6;
number1++;