单片机学习笔记四:定时计数器中断方式实现数码管动态刷新

主函数

#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;

}

}

举报
评论 0