单片机学习笔记四:定时计数器中断方式实现数码管动态刷新
主函数
#include <reg52.h>
#include "intrins.h"
#include "display.h"
void Timer0Init(void);
void Display();
void display_Service();
unsigned int num=1234;
unsigned int systemTimer = 0;
unsigned char systemFlag = 1;
unsigned char timer0Cnt;
sbit LED = P3^4;
void main()
{
Timer0Init();
do
{
if(systemTimer%50 == 0)
LED = ~LED;
}while(systemTimer<5000); //5s=5000/1ms
systemFlag = 0;
LED =1;
/*******软件延时********
while(systemTimer<50000)
{
systemTimer++;
}
***********************/
while(1)
{
display_Service();
}
}
void display_Service()
{
ledbuf[0] = num/1000;
ledbuf[1] = num/100%10;
ledbuf[2] = num/10%10;
ledbuf[3] = num%10;
}
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式 GATE C/T M1 M0
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值65536-50000)%256
TH0 = 0xFC; //设置定时初值65536-50000)/256
TF0 = 0; //清除TF0标志
ET0 = 1;//定时器0的中断开关
EA = 1;//中断总开关
TR0 = 1; //定时器0开始计时
}
/*****************************************
1.中断服务函数一定是一个没有返回值的函数
2.中断服务函数一定是没有参数的函数
3.中断服务函数名后跟关键字 interrupt
4.interrupt n 0-4 5个中断源 8*n+0003H
0003H INT0 000BH T0 0013H INT1 001BH T1 0023H ES
5.中断服务函数不能被主程序或者其它程序所调用
6. n后面跟using m (0-3)工作寄存器组
*****************************************/
void Timer0_ISR(void) interrupt 1
{
TR0 = 0;
if(systemFlag == 1)
{
systemTimer++;
}
Display();
TL0 = 0x18; //设置定时初值65536-50000)%256
TH0 = 0xFC; //设置定时初值65536-50000)/256
TR0 = 1;
}
显示函数
#include <reg52.h>
#include "intrins.h"
#include "display.h"
//unsigned char num, num2=0;
unsigned char code leddata[]={0xDD,0x05,0x9B,0x97,0x47,0xD6,0xDE,0x85,0xDF,0xC7,0x02};//数码管断码表
unsigned char ledbuf[]={10,10,10,10};//数据显示缓冲区
unsigned char code PLACE_CODE[]={0xFB,0xDF,0xBF,0x7F};//位选信号
void Display()
{
static unsigned char i=0;
//1.送段码
//2.送位码
//3.延时1ms小于10ms
//4.消隐
switch(i)
{
case 0:
GPI0_DIG = 0x00;
GPI0_DIG = leddata[ledbuf[0]];
GPIO_PLACE = PLACE_CODE[0];
i++;
break;
case 1:
GPI0_DIG = 0x00;
GPI0_DIG = leddata[ledbuf[1]];
GPIO_PLACE = PLACE_CODE[1];
i++;
break;
case 2:
GPI0_DIG = 0x00;
GPI0_DIG = leddata[ledbuf[2]];
GPIO_PLACE = PLACE_CODE[2];
i++;
break;
case 3:
GPI0_DIG = 0x00;
GPI0_DIG = leddata[ledbuf[3]];
GPIO_PLACE = PLACE_CODE[3];
i=0;
break;
default:break;
}
}
请先 后发表评论~