原创 七段共阴极数码管 

2014-2-28 14:34 874 2 2 分类: MCU/ 嵌入式
qq图片20140219092937.jpgqq图片20140219092911.jpg

 

驱动逻辑:

在点亮其中任意一段时,其它的段要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'; " > 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条