热度 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'; "