微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 定时器控制数码管扫描显示

定时器控制数码管扫描显示

时间:11-24 来源:互联网 点击:
************************************************************************************

功能:定时器控制两位数码管扫描显示
器件:STC12C5A32S2两个数码管
************************************************************************************/
#include "config.h "

#defineuintunsigned int
#defineucharunsignedchar
#defineulongunsignedlong

int num;//显示数据
int FrontDot = 0;//个位显示
int BehindDot = 0;//小数显示
uint xms = 0;//毫秒数

uint LEDDATA0[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uint LEDDATA1[10] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef};

// 延时约(0.001 * n)秒
void delay(unsigned int n)
{
int i;
ulong msNum = 923;//指令循环923次为一秒
for(i = 0; i < n; i++){
while(msNum--);
}
}

void timer0() interrupt 1
{
TH0 = 0xfc;//重要!!第一次计数满后会从0开始计数,应该在中断程序中重设计数初值
TL0 = 0x65;
xms++;
if(xms == 1000){
num++;
if(num > 99)num = 0;
FrontDot = num / 10;
BehindDot = num % 10;
xms = 0;
}
}

// 定时器0初始化
void timer0_init()
{
TMOD = 0x01;//设定定时器0为工作方式1,中断只需一次设定
TH0 = 0xfc;//设定计数初值
TL0 = 0x65;
EA = 1;//开总中断
ET0 = 1;//开定时中断0
TR0 = 1;//启动定时器0,计数满后执行中断服务程序timer0()
}

//主函数
void main(void)
{
int x=0;
num = 0;
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 0;
P0_4 = 0;

timer0_init();

for(;;){
if(x++ > 100)x=0;
switch(x%2)
{
delay(100);
case 0:
P0_4 = 0; // 关闭
P2 = LEDDATA0[BehindDot]; //设置数字
P0_3 = 1; // 开启
break;
case 1:
P0_3 = 0;
P2 = LEDDATA1[FrontDot];
P0_4 = 1;
break;
}
}
}

数码管扫描显示先关闭不需要显示的数码管,再设置要显示的数码管的数字,最后开启要显示的数码管,不然数码管会显示有问题

因为先开启要显示的数码管它会显示上一次设置的数字,在设置数字的话,会有上次的余辉。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top