tag 标签: 七段共阴极数码管

相关博文
  • 热度 2
    2014-2-28 14:34
    875 次阅读|
    0 个评论
      驱动逻辑: 在点亮其中任意一段时,其它的段要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  = { { '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_count ++ ; /* if( led_tab  == '\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_count ++ ; break; case 9: led_num_three=(unsigned char)( playing_timer%60)/10; led_3_display( led_tab  ) ; led_count ++ ; break; case 10: led_num_four= (unsigned char)playing_timer%10; led_4_display( led_tab  ) ; led_count ++ ; break; } if( led_tab  == '\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'; "