C\C++/임베디드 시스템

임베디드시스템 FND 숫자 증가 제어

sundori 2023. 11. 8. 23:41
#include <mega128.h>
 
#define LED_CON *((unsigned char *)0x8000)
#define SET_CON *((unsigned char *)0x8100)
#define LCD_CON *((unsigned char *)0x8200)
#define LCD_DATABUS *((unsigned char *)0x8300)

#define FND1 2 // 공동 캐소드 2(FND 4개 중 첫 번째)
#define FND2 3 // 공동 캐소드 3(FND 4개주 두 번째)
#define FND3 4
#define FND4 5

#define FND1_ON (1 << FND1) // FND1을 켜기 위해 FND1 핀에 5V 입력 
#define FND2_ON (1 << FND2)
#define FND3_ON (1 << FND3) 
#define FND4_ON (1 << FND4) 

#define FND1_OFF (0 << FND1) // FND1을 켜기 위해 FND1 핀에 5V 입력 
#define FND2_OFF (0 << FND2)
#define FND3_OFF (0 << FND3) 
#define FND4_OFF (0 << FND4)

char Num[11] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X27, 0X7F, 0X6F};
// 0~9를 표시하기 위해 배열 선언

int FndCnt;

// Timer 0 overflow interrupt service routine

interrupt [TIM0_OVF] void timer0_ovf_isr(void) // per 1ms
{
    static int cnt = 0; cnt++;
    if(cnt == 1)
    {
        cnt = 0;
        FndCnt++;
        if(FndCnt == 9999){
            FndCnt = 0;
        }
    }
    TCNT0 += 0X06;
}
void main(void){
    DDRB = 0x00; // PORTB INPUTPORT Set
    
    /*timer interrupt register setting*/  
    TCCR0 = 0x04; 
    TCNT0 = 0x06;
    TIMSK = 0x01;
    MCUCR = 0x80;
    
    // Externel I/O initialization
    LED_CON = 0X00;
    SET_CON = 0X00;
    
    SREG = 0X80;// 전역 인터럽트 허용
    
    while(1){
        int cnt = 0; cnt++;
        static char j, k, l, m =0;
        j = FndCnt / 1000;
        k = FndCnt % 1000 / 100;
        l = FndCnt % 100 / 10;
        m = FndCnt % 10;
        
        switch(cnt){
            case 1: SET_CON = FND1_ON|FND2_OFF|FND3_OFF|FND4_OFF; LCD_DATABUS = Num[j]; break;
            case 2: SET_CON = FND2_ON|FND1_OFF|FND3_OFF|FND4_OFF; LCD_DATABUS = Num[k]; break;
            case 3: SET_CON = FND3_ON|FND1_OFF|FND2_OFF|FND4_OFF; LCD_DATABUS = Num[l]; break;
            case 4: SET_CON = FND4_ON|FND1_OFF|FND2_OFF|FND3_OFF; LCD_DATABUS = Num[m]; break;
            default: cnt = 0; // cnt 초기화
        }
    }
}