BASIC4MCU | 질문게시판 | 답변2 : 74HC245
페이지 정보
작성자 master 작성일2018-03-09 16:34 조회14,191회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=297
본문
// CONFIG1#pragma config FOSC=HS // Oscillator Selection bits(HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)#pragma config WDTE=OFF // Watchdog Timer Enable bit(WDT enabled)#pragma config PWRTE=ON // Power-up Timer Enable bit(PWRT disabled)#pragma config MCLRE=ON // RE3/MCLR pin function select bit(RE3/MCLR pin function is MCLR)#pragma config CP=OFF // Code Protection bit(Program memory code protection is disabled)#pragma config CPD=OFF // Data Code Protection bit(Data memory code protection is disabled)#pragma config BOREN=OFF // Brown Out Reset Selection bits(BOR enabled)#pragma config IESO=ON // Internal External Switchover bit(Internal/External Switchover mode is enabled)#pragma config FCMEN=ON // Fail-Safe Clock Monitor Enabled bit(Fail-Safe Clock Monitor is enabled)#pragma config LVP=ON // Low Voltage Programming Enable bit(RB3/PGM pin has PGM function,low voltage programming enabled)// CONFIG2#pragma config BOR4V=BOR40V // Brown-out Reset Selection bit(Brown-out Reset set to 4.0V)#pragma config WRT=OFF // Flash Program Memory Self Write Enable bits(Write protection off)#include//#define FND_C_EN PORTBbits.RB0#define KEY_EN PORTBbits.RB1#define FND_D_EN PORTCbits.RC2#define _XTAL_FREQ 20000000//#define COM_EN {FND_C_EN=1; FND_C_EN=0;}#define SEG_EN {FND_D_EN=1; FND_D_EN=0;}//unsigned char seg[13]={0b11101011,0b00101000,0b10110011,0b10111010,0b01111000,// 0~40b11011010,0b11011011,0b11101000,0b11111011,0b11111010,// 5~90x10,0x00,0x02 //-, ,_};//char key_buf=0xFF;unsigned int num=0;//void key_input(void){ TRISD=0x00; KEY_EN=0; key_buf=PORTD; KEY_EN=1; TRISD=0xFF; }//void fnd_999(void){PORTD=8; COM_EN; PORTD=seg[num/1000 ]; SEG_EN; __delay_ms(5);PORTD=2; COM_EN; PORTD=seg[num/100%10]; SEG_EN; __delay_ms(5);PORTD=4; COM_EN; PORTD=seg[num/10 %10]; SEG_EN; __delay_ms(5);PORTD=1; COM_EN; PORTD=seg[num %10]; SEG_EN; __delay_ms(5);}//void main(){TRISBbits.TRISB1=1; // key_IN/TRISBbits.TRISB0=0; // FND_C_ETRISCbits.TRISC2=0; // FND_D_ENTRISEbits.TRISE0=0;ANSELH=0x00;while(1){key_buf=key_input();fnd_999();if(++num>9999)num=0;}}
void key_input(void){ TRISD=0x00; KEY_EN=0; key_buf=PORTD; KEY_EN=1; TRISD=0xFF; }
포트를 입력으로 변경하고
입력 받을 때 약간의 딜레이를 줘야하는 경우도 있습니다.
문제가 생기면 적색 색칠한 곳에 수us 정도의 딜레이를 준 후에 읽어보세요
만약 윗자리의 숫자가 아랫자리에 영향을 끼치는 경우에는
void fnd_999(void){PORTD=seg[num/1000 ]; SEG_EN; PORTD=8; COM_EN; __delay_ms(5); PORTD=0; COM_EN;PORTD=seg[num/100%10]; SEG_EN; PORTD=2; COM_EN; __delay_ms(5); PORTD=0; COM_EN;PORTD=seg[num/10 %10]; SEG_EN; PORTD=4; COM_EN; __delay_ms(5); PORTD=0; COM_EN;PORTD=seg[num %10]; SEG_EN; PORTD=1; COM_EN; __delay_ms(5); PORTD=0; COM_EN;}딜레이 후에 FND COMMON 핀을 clear 시키면 도움이 됩니다.
이래도 잔상이 남는다면 라인 제일 마지막에 수us~수십us 정도의 딜레이를 추가하세요
보통 12V 구동의 큰 FND를 구동 할 때 TR의 turn off time이 길어지면서 문제가 많이 생깁니다.
댓글 0
조회수 14,191등록된 댓글이 없습니다.