#include "lib/lib_common.h" // 共通ヘッダ // コンフィギュレーション設定 _CONFIG1(JTAGEN_OFF & // JTAGの仕様 GCP_OFF & // コードプロテクト GWRP_OFF & // 書き込みプロテクト BKBUG_OFF & // バックグラウンドデバッグ COE_OFF & // クリップオンエミュレーション ICS_PGx1 & // ICDピン選択 FWDTEN_OFF) // WDT // 32MHz 水晶発振子8MHz * PLL 4 _CONFIG2(IESO_OFF & // 2速度スタートアップ FNOSC_PRI & // 発振器選択 8MHz:FNOSC_FRC 32MHz:FNOSC_FRCPLL 主発信器:FNOSC_PRI FCKSM_CSDCMD & // クロック切り替えクロックモニタ OSCIOFNC_ON & // OSCOピン機能 ON:RA3をI/O// IOL1WAY_OFF & // RPレジスタプロテクト I2C1SEL_PRI & // I2Cのピン選択 POSCMOD_XT) // 主発振器選択 なし:POSCMOD_NONE HS:POSCMOD_HS //////////////////////////////////////////////////////////////////////////////// // 定数宣言 // チェック用LED #define LED_G A9 // UART1ピン設定 #define TX1 P1 // out B1 #define RX1 P0 // in B0 // SDカードのピン設定 #define SD_CS A4 // out #define SD_SCK P9 // out B9 #define SD_SDI P11 // in B11 #define SD_SDO P10 // out B10 //////////////////////////////////////////////////////////////////////////////// // ヘッダのインクルード #include "lib/lib_time.h" // Fosc,delayとか #include "lib/lib_timer.h" // タイマ //#include "lib/lib_uart.h" // UART #include "lib/lib_sd.h" // SDカード //#include "lib/lib_nokia3300.h" // LCD NOKIA3300 //////////////////////////////////////////////////////////////////////////////// // 変数宣言 FIL fo = { 0 }; BYTE sd_buff[2048] = { 0 }; char temp_str[50] = { 0 }; WORD timer1_count = 0; int seg_flag=0; ////////////////////////////// FIL f_lipo; int volt_times=0; int t_timer=0; int m_timer=0; int h_timer=0; int seg_pos=0; int t_sw=0; int t_psw=0; int t_ri=0; int t_setflag=0; char hot_flag=0;//hour or time #define SEG1 0b0000000001010000 #define SEG2 0b0000001100110100 #define SEG3 0b0000000101110100 #define SEG4 0b0000000001111000 #define SEG5 0b0000000101101100 #define SEG6 0b0000001101101100 #define SEG7 0b0000000001011100 #define SEG8 0b0000001101111100 #define SEG9 0b0000000101111100 #define SEG0 0b0000001101011100 //////////////////////////////////////////////////////////////////////////////// // 関数のプロトタイプ宣言 // UART1割り込み void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void); // タイマ割り込み void __attribute__ ((interrupt, no_auto_psv)) _T1Interrupt(void); void __attribute__ ((interrupt, no_auto_psv)) _T2Interrupt(void); void __attribute__ ((interrupt, no_auto_psv)) _T3Interrupt(void); //////////////////////////////////////////////////////////////////////////////// // メイン int main( void ) { delay_ms(100); // 最初、ちょっと待つ //------------------------------------------------------------------------------------------- // ポートやモードの初期設定 //------------------------------------------------------------------------------------------- CLKDIV = 0; // クロックの分周1:1に設定 AD1PCFG = 0xffff; // AN0~5, 9~12 全アナログポートをデジタルに指定 // ポートの初期設定 TRISA = 0b0000000000000011; // RA0~15 all-out TRISB = 0b1000000000000000; // RB0~15 all-out TRISC = 0b0000000000000000; // RC0~15 all-out //------------------------------------------------------------------------------ // タイマ初期設定 //------------------------------------------------------------------------------ TIMER_Open(3, TIMER_PRI_256,TIMER_Cycle(1000.0, 256)); TIMER_SetConfig(3, TIMER_INT_ON, 6); TIMER_Open(2, TIMER_PRI_8, TIMER_Cycle(5.0, 8)); TIMER_SetConfig(2, TIMER_INT_ON, 5); TIMER_Open(1, TIMER_PRI_8, TIMER_Cycle(2.0, 8)); TIMER_SetConfig(1, TIMER_INT_ON, 6); //------------------------------------------------------------------------------------------- // SDカードの初期化 //------------------------------------------------------------------------------------------- SD_SetPin(1, SPI_HW, SD_CS, SD_SCK, SD_SDI, SD_SDO, NO_USE, NO_USE); SD_Initialize(); // UART_WriteString( 1, "SD Initialize OK!!!!!!\r\n" ); // SDカードの情報表示 SD_GetState( temp_str ); // UART_WriteString( 1, temp_str ); // ファイル、フォルダすべて検索して表示 SD_SearchOutput("", "*", AM_RDO | AM_HID | AM_SYS | AM_VOL | AM_DIR | AM_ARC, 0); // UART_WriteString( 1, "NOKIA6100 Initialize OK!!!!!!!\r\n" ); //------------------------------------------------------------------------------------------- //変数の初期化 //------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------- // 起動チェック LED点滅 //------------------------------------------------------------------------------------------- Output_Low(LED_G); delay_ms(200); Output_High(LED_G); delay_ms(200); Output_Low(LED_G); delay_ms(200); Output_High(LED_G); delay_ms(200); //================================================ //文字列表示 //================================================ int count = 0; int i=0; volt_times=1; t_timer=0; m_timer=37; h_timer=17;t_ri=8; TIMER_Start(1); TIMER_Start(3); t_sw=0;seg_pos=0;t_setflag=0;hot_flag=0;t_psw=0; while(1) { } return 0; } void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void) { _U1RXIF = 0; // 割り込みフラグクリア^ } void __attribute__ ((interrupt, no_auto_psv)) _T3Interrupt(void) {//時刻計測割り込み _T3IF = 0; // 割り込みフラグクリア volt_times=volt_times<<1; t_timer++; if(t_timer>59){ t_timer=0; m_timer++; if(m_timer>59){ m_timer=0; h_timer++; if(h_timer>23) h_timer=0; } } if(volt_times>=0x0f00) volt_times=1; seg_flag=!seg_flag; } void __attribute__ ((interrupt, no_auto_psv)) _T2Interrupt(void) { //時刻セット(UI用)割り込み _T2IF = 0; // 割り込みフラグクリア static char rt1=0,rt2=0; seg_flag=1; if(rt1==1&&PORTAbits.RA0==0){ if(PORTAbits.RA1==0){//+回転のとき if(hot_flag==0) h_timer++; else if(hot_flag==1) m_timer++; else { t_ri++; if(t_ri>11) t_ri=11; } } else{//-回転のとき if(hot_flag==0) h_timer--; else if(hot_flag==1)m_timer--; else{ t_ri--; if(t_ri<4) t_ri=4; } } } if(m_timer>59) m_timer=0; if(m_timer<0) m_timer=59; if(h_timer>23) h_timer=0; if(h_timer<0) h_timer=23; rt1=PORTAbits.RA0; } void __attribute__ ((interrupt,no_auto_psv)) _T1Interrupt(void) {//表示用割り込み _T1IF=0; int seg7num[10]={ SEG0, SEG1, SEG2, SEG3, SEG4, SEG5, SEG6, SEG7, SEG8, SEG9}; switch(seg_pos%t_ri){ case 0://4桁目 if(t_setflag==0){//時計表示 PORTBbits.RB3=0; PORTC=seg7num[h_timer/10]|seg_flag<<1; PORTBbits.RB0=1; } else{//時刻点滅表示 PORTBbits.RB3=0; if(seg_pos<120&&hot_flag==0) PORTC=0;//全消し else PORTC=seg7num[h_timer/10]; PORTBbits.RB0=1; } break; case 1://3桁目 if(t_setflag==0){//時計表示 PORTBbits.RB0=0; PORTC=seg7num[h_timer%10]|seg_flag<<1; PORTBbits.RB1=1; } else{//時刻点滅表示 PORTBbits.RB0=0; if(seg_pos<120&&hot_flag==0) PORTC=0;//全消し else PORTC=seg7num[h_timer%10]; PORTBbits.RB1=1; } break; case 2://3桁目 if(t_setflag==0){//時計表示 PORTBbits.RB1=0; PORTC=seg7num[m_timer/10]|seg_flag<<1; PORTBbits.RB2=1; } else{//時刻点滅表示 PORTBbits.RB1=0; if(seg_pos<120&&hot_flag==1) PORTC=0;//全消し else PORTC=seg7num[m_timer/10]; PORTBbits.RB2=1; } break; case 3://4けた目 if(t_setflag==0){ PORTBbits.RB2=0; PORTC=seg7num[m_timer%10]|seg_flag<<1; PORTBbits.RB3=1; } else{ PORTBbits.RB2=0; if(seg_pos<120&&hot_flag==1) PORTC=0;//全消し else PORTC=seg7num[m_timer%10]; PORTBbits.RB3=1; } break; default: PORTBbits.RB3=0; break; } seg_pos++; if(seg_pos>240) seg_pos=0; if(PORTBbits.RB15==0) t_sw++; else t_sw=0; if(PORTBbits.RB15==0&&t_psw==1){ hot_flag++; if(hot_flag==3) hot_flag=0; t_sw=0; } t_psw=PORTBbits.RB15; if(t_sw>1500){ t_sw=0;t_timer=0; if(t_setflag==0){ TIMER_Stop(3); TIMER_Start(2); t_setflag=1;//タイムセット中は 1 } else{ TIMER_Stop(2); TIMER_Start(3); t_setflag=0;//時計中は 0 } } }