该模板采用定时计数器0中断,每隔20*50us去刷新一位数码管
定义了三个窗口,通过SMG_flag变量进行切换
定义了只针对继电器的操作函数,led的操作函数,其中蜂鸣器直接关闭
#include <reg52.h>
#include <intrins.h>
sbit AUXR = 0x8e;
unsigned char code duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
//锁存器通道选择函数
void select_HC573 ( unsigned char channal )
{
switch ( channal )
{
case 4:
P2 = ( P2 & 0x1f ) | 0x80;
break;
case 5:
P2 = ( P2 & 0x1f ) | 0xa0;
break;
case 6:
P2 = ( P2 & 0x1f ) | 0xc0;
break;
case 7:
P2 = ( P2 & 0x1f ) | 0xe0;
break;
case 0:
P2 = ( P2 & 0x1f ) | 0x00;
break;
}
}
//单位数码管显示函数
void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
select_HC573 ( 0 );
P0 = 0x01 << pos_SMG;
select_HC573( 6 );
select_HC573 ( 0 );
P0 = value_SMG;
select_HC573( 7 );
select_HC573 ( 0 );
}
//全位数码管静态显示
void state_SMG_all ( unsigned char value_SMG_all )
{
select_HC573 ( 0 );
P0 = 0xff;
select_HC573( 6 );
select_HC573 ( 0 );
P0 = value_SMG_all;
select_HC573( 7 );
select_HC573 ( 0 );
}
//继电器单独操作函数
void state_relay ( unsigned char value_relay )
{
select_HC573 ( 0 );
if ( value_relay == 0 )
{
P0 =0x00;
}
else
{
P0 =0x10;
}
select_HC573 ( 5 );
select_HC573 ( 0 );
}
//led灯光控制函数
void state_led ( unsigned char value_led )
{
select_HC573 ( 0 );
P0 = 0xff;
select_HC573 ( 4 );
P0 = value_led;
select_HC573 ( 4 );
select_HC573 ( 0 );
}
//初始化系统,关闭继电器和蜂鸣器
void init_sys ()
{
select_HC573 ( 0 );
P0 = 0xff;
select_HC573 ( 4 );
select_HC573 ( 0 );
P0 = 0x00;
select_HC573 ( 5 );
select_HC573 ( 0 );
}
//定时计数器0产生50us的中断,用于进行数码管的刷新
//===================================================================================
void init_timer0 (void) //50微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0xCE; //设置定时初值
TH0 = 0xCE; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
unsigned char count_50us = 0;
unsigned char flash_count = 0;//数码管刷新位
void timer0_service () interrupt 1
{
count_50us++;
if ( count_50us % 50 == 0 ) //根据不同的SMG_flag切换不同的显示窗口
{
if ( SMG_flag == 1 )//窗口1
{
if ( ++flash_count > 5 )//其中的数字根据该窗口显示位数决定
{
flash_count = 0;
}
}
else if ( SMG_flag == 2 )//窗口2
{
if ( ++flash_count == 8 )//其中的数字根据该窗口显示位数决定
{
flash_count = 0;
}
}
else if ( SMG_flag == 3 )//窗口3
{
if ( ++flash_count > 4 )//其中的数字根据该窗口显示位数决定
{
flash_count = 0;
}
}
flash_SMG (); //刷新数码管一位
}
/*用于刷新其他函数
if ( count_50us == 200 )
{
count_50us = 0;
flash_ds1302 = 1;
if ( SMG_flag == 1 )
{
flash_temperature = 1;
}
}
if ( count_50us % 20 == 0 )
{
relay_ledrunning ();
}
**/
}
void flash_SMG ()
{
state_SMG_all ( 0xff );
if ( SMG_flag == 1 )
{
switch ( flash_count )
{
case 0 :
state_SMG ( 0 , duanma[] );
break;
case 1 :
state_SMG ( 1 , duanma[] );
break;
case 2 :
state_SMG ( 5 , duanma[] );
break;
case 3 :
state_SMG ( 6 , duanma[] );
break;
case 4 :
state_SMG ( 7 , duanma[] );
break;
case 5 :
state_SMG_all ( 0xff );
break;
}
}
else if ( SMG_flag == 2 )
{
switch ( flash_count )
{
case 0 :
state_SMG ( 0 , duanma[] );
break;
case 1 :
state_SMG ( 1 , duanma[] );
break;
case 2 :
state_SMG ( 3 , duanma[] );
break;
case 3 :
state_SMG ( 4 , duanma[] );
break;
case 4 :
state_SMG ( 5 , duanma[] );
break;
case 5 :
state_SMG ( 6 , duanma[] );
break;
case 6 :
state_SMG ( 7 , duanma[] );
break;
case 7 :
state_SMG_all ( 0xff );
break;
}
}
else if ( SMG_flag == 3 )
{
switch ( flash_count )
{
case 0 :
state_SMG ( 0 , duanma[] );
break;
case 1 :
state_SMG ( 1 , duanma[] );
break;
case 2 :
state_SMG ( 6 , duanma[] );
break;
case 3 :
state_SMG ( 7 , duanma[] );
break;
case 5 :
state_SMG_all ( 0xff );
break;
}
}
}
void main ()
{
init_sys();
init_timer0 ();
while ( 1 )
{
}
}