驱动逻辑:
在点亮其中任意一段时,其它的段要off,然后用定时器按顺序点亮需要的段以组合起来想要显示的内容。
控制IO的IO方向是可选的(led是电流控制器件,通过设置IO的方向可以控制端口的电流),用设为输出的方式来点亮led,设为输入的方式来关灭led。
#ifndef _led_c_
#define _led_c_
#define DIR_1 PCDIR.1
#define DIR_2 PCDIR.2
#define DIR_3 PCDIR.5
#define DIR_4 PCDIR.7
#define DIR_5 PCDIR.9
#define DIR_6 PBDIR.6
#define DIR_7 PBDIR.9
#define OD_1 PCOD.1
#define OD_2 PCOD.2
#define OD_3 PCOD.5
#define OD_4 PCOD.7
#define OD_5 PCOD.9
#define OD_6 PBOD.6
#define OD_7 PBOD.9
__X unsigned char led_process_state ;
__X unsigned char led_num_one ;
__X unsigned char led_num_two ;
__X unsigned char led_num_three ;
__X unsigned char led_num_four ;
__X unsigned char led_count ;
__X unsigned long led_timer ;
//void led_key_display(unsigned char num_val , unsigned char timer) ;
void led_1_display(unsigned char num_val );
void led_2_display(unsigned char num_val );
void led_3_display(unsigned char num_val );
void led_4_display(unsigned char num_val );
void __interrupt led_process( void ) ;
/***********************************************************
// 对应的数字显示控制
***********************************************************/
__X unsigned char led_tab[10][8] = { { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , '\0'} , // 0
{ 'b' , 'c' , '\0' }, // 1
{ 'a' , 'b' , 'd' , 'e' , 'g' , '\0'}, // 2
{ 'a' , 'b' , 'c' , 'd' , 'g' , '\0'}, // 3
{ 'b', 'c' , 'f' , 'g' , '\0'}, // 4
{ 'a' , 'c' , 'd' , 'f' , 'g' , '\0'}, // 5
{ 'a' , 'c' , 'd' , 'e' , 'f' , 'g' , '\0'}, // 6
{ 'a' , 'b' , 'c' , '\0'}, // 7
{ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , '\0'}, // 8
{ 'a' , 'b' , 'c' , 'd' , 'f' , 'g' , '\0'} // 9
} ;
/***********************************************************
// Timer interruption
***********************************************************/
void __interrupt led_process( void )
{
__asm{ BSET DIR_1 BSET DIR_2 BSET DIR_3 BSET DIR_4 BSET DIR_5 BSET DIR_6 BSET DIR_7 }
switch( led_process_state )
{
case 0:
//LED_D_MID
__asm{ BCLR DIR_3 BCLR OD_3 BCLR DIR_4 BSET OD_4 }
led_process_state ++ ;
break;
case 1:
//LED_D_MP3
__asm{ BCLR DIR_7 BCLR OD_7 BCLR DIR_3 BSET OD_3 }
led_process_state ++ ;
break;
case 2:
//LED_D_PN
__asm{ BCLR DIR_3 BCLR OD_3 BCLR DIR_6 BSET OD_6 }
led_process_state ++ ;
break;
case 3:
//LED_D_RF
__asm{ BCLR DIR_3 BCLR OD_3 BCLR DIR_7 BSET OD_7 }
led_process_state ++ ;
break;
case 4:
// LED_D_SD
__asm{ BCLR DIR_1 BCLR OD_1 BCLR DIR_5 BSET OD_5 }
led_process_state ++ ;
break;
case 5:
// LED_D_TRI
led_process_state ++ ;
__asm{ BCLR DIR_1 BCLR OD_1 BCLR DIR_6 BSET OD_6 }
break;
case 6:
//LED_D_USB
__asm{ BCLR DIR_6 BCLR OD_6 BCLR DIR_2 BSET OD_2 }
led_process_state ++ ;
led_count = 0 ;
break;
case 7:
led_num_one = (unsigned char)playing_timer/600 ;
led_1_display( led_tab[led_num_one][led_count] ) ;
led_count ++ ;
/*
if( led_tab[led_num_one][led_count] == '\0')
{
led_count = 0 ;
led_process_state ++ ;
}*/
break;
case 8:
led_num_two =(unsigned char)( playing_timer/60)%10 ;
led_2_display( led_tab[led_num_two][led_count] ) ;
led_count ++ ;
break;
case 9:
led_num_three=(unsigned char)( playing_timer%60)/10;
led_3_display( led_tab[led_num_three][led_count] ) ;
led_count ++ ;
break;
case 10:
led_num_four= (unsigned char)playing_timer%10;
led_4_display( led_tab[led_num_four][led_count] ) ;
led_count ++ ;
break;
}
if( led_tab[led_num_one][led_count] == '\0')
{
led_count = 0 ;
led_process_state ++ ;
if( led_process_state > 10 )
led_process_state = 0 ;
}
}
/***********************************************************
//第一个数码管的七段显示控制
***********************************************************/
void led_1_display(unsigned char num_val )
{
switch(num_val)
{
case 'a':
//led_1_a();
__asm{ BCLR DIR_1 BCLR OD_1 BCLR DIR_2 BSET OD_2 }
break ;
case 'b':
// led_1_b();
__asm{ BCLR DIR_1 BCLR OD_1 BCLR DIR_3 BSET OD_3 }
break ;
case 'c':
// led_1_c();
__asm{ BCLR DIR_4 BCLR OD_4 BCLR DIR_1 BSET OD_1 }
break ;
case 'd':
// led_1_d() ;
__asm{ BCLR DIR_5 BCLR OD_5 BCLR DIR_1 BSET OD_1 }
break ;
case 'e':
//led_1_e() ;
__asm{ BCLR DIR_1 BCLR OD_1 BCLR DIR_4 BSET OD_4 }
break ;
case 'f':
//led_1_f() ;
__asm{ BCLR DIR_2 BCLR OD_2 BCLR DIR_1 BSET OD_1 }
break ;
case 'g':
// led_1_g() ;
__asm{BCLR DIR_3 BCLR OD_3 BCLR DIR_1 BSET OD_1 }
break ;
dault :
break ;
}
}
/***********************************************************
//第二个数码管的七段显示控制
***********************************************************/
void led_2_display(unsigned char num_val )
{
switch(num_val)
{
case 'a':
//led_2_a();
__asm{ BCLR DIR_2 BCLR OD_2 BCLR DIR_3 BSET OD_3 }
break ;
case 'b':
// led_2_b();
__asm{ BCLR DIR_2 BCLR OD_2 BCLR DIR_4 BSET OD_4 }
break ;
case 'c':
// led_2_c();
__asm{ BCLR DIR_5 BCLR OD_5 BCLR DIR_2 BSET OD_2 }
break ;
case 'd':
// led_2_d() ;
__asm{ BCLR DIR_2 BCLR OD_2 BCLR DIR_6 BSET OD_6 }
break ;
case 'e':
//led_2_e() ;
__asm{ BCLR DIR_2 BCLR OD_2 BCLR DIR_5 BSET OD_5 }
break ;
case 'f':
//led_2_f() ;
__asm{ BCLR DIR_3 BCLR OD_3 BCLR DIR_2 BSET OD_2 }
break ;
case 'g':
// led_2_g() ;
__asm{ BCLR DIR_4 BCLR OD_4 BCLR DIR_2 BSET OD_2 }
break ;
dault :
break ;
}
}
/***********************************************************
//第三个数码管的七段显示控制
***********************************************************/
void led_3_display(unsigned char num_val )
{
switch(num_val)
{
case 'a':
//led_3_a();
__asm{ BCLR DIR_5 BCLR OD_5 BCLR DIR_4 BSET OD_4 }
break ;
case 'b':
// led_3_b();
__asm{ BCLR DIR_3 BCLR OD_3 BCLR DIR_5 BSET OD_5 }
break ;
case 'c':
// led_3_c();
__asm{ BCLR DIR_4 BCLR OD_4 BCLR DIR_5 BSET OD_5 }
break ;
case 'd':
// led_3_d() ;
__asm{ BCLR DIR_6 BCLR OD_6 BCLR DIR_1 BSET OD_1 }
break ;
case 'e':
//led_3_e() ;
__asm{ BCLR DIR_6 BCLR OD_6 BCLR DIR_3 BSET OD_3 }
break ;
case 'f':
//led_3_f() ;
__asm{ BCLR DIR_4 BCLR OD_4 BCLR DIR_3 BSET OD_3 }
break ;
case 'g':
// led_3_g() ;
__asm{ BCLR DIR_5 BCLR OD_5 BCLR DIR_3 BSET OD_3 }
break ;
dault :
break ;
}
}
/***********************************************************
//第四个数码管的七段显示控制
***********************************************************/
void led_4_display(unsigned char num_val )
{
switch(num_val)
{
case 'a':
//led_4_a();
__asm{ BCLR DIR_7 BCLR OD_7 BCLR DIR_6 BSET OD_6 }
break ;
case 'b':
// led_4_b();
__asm{ BCLR DIR_6 BCLR OD_6 BCLR DIR_7 BSET OD_7 }
break ;
case 'c':
// led_4_c();
__asm{ BCLR DIR_5 BCLR OD_5 BCLR DIR_6 BSET OD_6 }
break ;
case 'd':
// led_4_d() ;
__asm{ BCLR DIR_6 BCLR OD_6 BCLR DIR_4 BSET OD_4 }
break ;
case 'e':
//led_4_e() ;
__asm{ BCLR DIR_4 BCLR OD_4 BCLR DIR_6 BSET OD_6 }
break ;
case 'f':
//led_4_f() ;
__asm{ BCLR DIR_6 BCLR OD_6 BCLR DIR_5 BSET OD_5 }
break ;
case 'g':
// led_4_g() ;
__asm{ BCLR DIR_5 BCLR OD_5 BCLR DIR_7 BSET OD_7 }
break ;
dault :
break ;
}
}
/***********************************************************
//初始化Timer timer_interval = 1ms
***********************************************************/
void led_init(void)
{
SetVector( TIMER4_TRAP, led_process);
TIMER4_ICR = 0x31;
TIMER4_CR = 0xD005;
TIMER4_PRD = TMRxPRD( 1 );
TIMER4_VAL = 0x00;
led_timer = 0 ;
led_process_state = 0 ;
}
#endif
es'�:Nn-����^�000pt; font-family:'Times New Roman'; " >
文章评论(0条评论)
登录后参与讨论