// CLOCK-CONT // ATX-CL* 2013-11-3 // ATxmega32 でRTC8564のコントロール // ------------------------------------------------- // ATxmega32 内部 Xtal =32M // // PC0=SCL PC1=SDA // // LCD SC2004 // DB4=D4,DB5=D5,DB6=D6,DB7=D7, RS=D1 E=D0 // //---------------------------------------------------- #include #define F_CPU 32000000 //内部32M #include #include #include #include // 擬似命令 #define LED_GON PORTB.OUT |= _BV(0) #define LED_GOFF PORTB.OUT &=~_BV(0) #define LED_RON PORTB.OUT |= _BV(1) #define LED_ROFF PORTB.OUT &=~_BV(1) #define LCD_E_on PORTD.OUT |= _BV(0) #define LCD_E_off PORTD.OUT &=~_BV(0) #define LCD_RS_on PORTD.OUT |= _BV(1) #define LCD_RS_off PORTD.OUT &=~_BV(1) #define KEY_MENU bit_is_clear (PORTC.IN ,7) #define KEY_MENU_OFF bit_is_set (PORTC.IN ,7) #define KEY_RET bit_is_clear (PORTC.IN ,6) #define KEY_RET_OFF bit_is_set (PORTC.IN ,6) #define KEY_CAN bit_is_clear (PORTC.IN ,5) #define KEY_CAN_OFF bit_is_set (PORTC.IN ,5) #define KEY_LEFT bit_is_clear (PORTC.IN ,4) #define KEY_RIGHT bit_is_clear (PORTC.IN ,3) volatile uint8_t aux_d[60]; //書込データ volatile uint8_t w_data[10]; //書込データ volatile uint8_t r_data[10]; //読込データ //---------------------------------------------- // 内部 32MHz 発振子で動作させる void clock_internal_init(void) { // 内部 32 MHz 発振子を許可 OSC.CTRL |= OSC_RC32MEN_bm; // 発信器が安定するまで待つ loop_until_bit_is_set(OSC.STATUS, OSC_RC32MRDY_bp); // 設定変更を許可する CPU_CCP = CCP_IOREG_gc; // クロックを内部 32 MHz クロックに設定 CLK.CTRL = CLK_SCLKSEL_RC32M_gc; } //*---------------timer----------------------------- void wait_ms(uint16_t m ) //1=1ms { while(m--) _delay_ms(1); } //----- void wait_us(uint16_t m ) //1=1us { while(m--) _delay_us(1); } // ******* 書き込み 方法 ********************* // eeprom_busy_wait(); eeprom_write_byte((uint8_t*)MP1,cou1); // // /*-----------------------------------------------------------*/ /* LCD初期化  RS=0 --> data --> RS=1 */ /*-----------------------------------------------------------*/ void lcd_init(void) { wait_ms(100); //100ms LCD_RS_off; // RS=0 set // 1---0011 0000 lcd_put_4bit(0x30); wait_ms(10); //10ms // 2---0011 0000 lcd_put_4bit(0x30); wait_ms(10); // 3---0011 0000 lcd_put_4bit(0x30); wait_ms(1); //1ms /// 4---0010 0000 lcd_put_4bit(0x20); // 5---0010 1000 lcd_put_8bit(0x28); /* Mode=4bit / Line=2 / Font=5x7dot*/ // 6---0000 1000 lcd_put_8bit(0x08); /* 表示OFF */ // 7---0000 0001 lcd_put_8bit( 0x01 ); /* Display Clear*/ // 8---0000 0110 lcd_put_8bit( 0x06 ); /* entry mode set*/ // 9---0000 1100 lcd_put_8bit( 0x0C ); /* disply on*/ LCD_RS_on; /* RS = H */ } /*-----------------------------------------------------------*/ /* LCD 4ビット送信 */ /* 引数: char bitdata : DB7-4に与えるデータ */ /* DB4=D4 DB5=D5 DB6 = D6 DB7=D7 */ /* RS=D2 E=D3 */ /*-----------------------------------------------------------*/ void lcd_put_4bit(char bitdata) { // bitdata=bitdata >> 4; /*上位-->下位へ移動 */ bitdata=bitdata & 0xF0; /* 0000 1111 & */ unsigned char rdata; rdata = PORTD.IN; rdata=rdata & 0x0F; /*portD and 0b1111 0000 */ unsigned char portdata; portdata=(bitdata | rdata); /* OR */ PORTD.OUT = portdata; /* portdata 出力 */ LCD_E_off; // E=0 wait_ms(1); //1ms timer LCD_E_on; // E=1 wait_ms(1); //1ms timer } /*-----------------------------------------------------------*/ /* LCD 8ビット送信 */ /*-----------------------------------------------------------*/ void lcd_put_8bit(char chdat) { lcd_put_4bit(chdat); /* 上位 4bit */ lcd_put_4bit(chdat << 4); /* 下位 4bit を(左)上位シフト */ } /*-----------------------------------------------------------*/ /* LCD 文字列表示 */ /* 引数: char *str : 文字列の先頭ポインタ */ /*-----------------------------------------------------------*/ void lcd_put_str(char *str) { while(*str != 0) { lcd_put_8bit( *str ); str++; } } /*-----------------------------------------------------------*/ /* LCD表示位置の設定 */ /* 引数:char tx :x座標 */ /* 引数:char ty :y座標 */ /* 戻り値:なし */ /* tx */ /* 0123456789ABCDEF */ /* ty 0################ */ /* 1################ */ /* 2################ */ /* 3################ */ /*-----------------------------------------------------------*/ void lcd_position(char tx ,char ty) { switch(ty){ case 0: ty = 0x00; break; case 1: ty = 0x40; break; case 2: ty = 0x14; break; case 3: ty = 0x54; break; } LCD_RS_off; // RS=0 set lcd_put_8bit(0x80 | (tx + ty)); /* Address = 0 */ LCD_RS_on; /* RS = H */ } /*-----------------------------------------------------------*/ void LCD_dataout( unsigned short data ) // 数値データをLCDに表示する関数) { // 表示出来る数値は 受け取る引数unsigned short dataのデータ型範囲 unsigned char temp; // unsigned char :( 0-255), unsigned short:(0-65535), unsigned long :(0-4294967295) char strtemp[ 5 ]; // 文字コードの格納変数を定義 int i, k; // 受け取る引数 " unsigned char "data のデータ型を変更すると strtemp[ 配列数 ] 配列数 を変えましょう i=0; // unsigned charのとき:strtemp[ 3 ] (3桁), unsigned short:strtemp[ 5 ](5桁) , unsigned long:strtemp[ 10 ](10桁) do { // temp = data % 10; // 下位の桁から数字を抽出 strtemp[i++] = temp + '0'; // 数字を文字コードに変換 } while (( data /= 10 ) != 0); // 数値の桁数までループ i--; // for( k=i; k>=0; k-- ) { // 上位の桁から順次 lcd_put_8bit( strtemp[k]); // 数値文字を表示 } // } /* --------- ASC -------------------------------*/ void LCD_ASC(unsigned short data ) // ASC 表示 { unsigned char temp; unsigned char temp1; temp1 = data & 0x0F; temp = data >> 4; if(temp > 9){temp=temp-9,(temp |= 0x40); }else{(temp |= 0x30);} if(temp1 > 9){temp1=temp1-9,(temp1 |= 0x40); }else{(temp1 |= 0x30);} lcd_put_8bit(temp); lcd_put_8bit(temp1); } /*-----------------------------------------------------------*/ int main () { /* ATXmega 動作 */ clock_internal_init(); // 内部 32 MHz で動作 // clock_external_init(); // 外部 32 MHz で動作 //初期化 出力=1 入力=0 PORTA.DIR = 0x00; // 0b0000-0000 全IN PORTB.DIR = 0x03; // 0b0000-0011 PORTC.DIR = 0x00; // 0b0000-0000 PORTD.DIR = 0xF3; // 0b1111-0011 PORTA.OUT = 0x00; // pul up PORTC.OUT = 0x00; // H 出力 PORTB.OUT = 0x00; // PORTD.OUT = 0x00; // H 出力 //------------ LCD INIT ----------------- lcd_init(); //--------------------------------------- lcd_position(0,1); lcd_put_str("ATMEGA64 mama"); lcd_position(0,0); lcd_put_str("ATX-T1 "); lcd_position(0,3); lcd_put_str("Ver 2 "); LED_GON; wait_ms(300); LED_GOFF; wait_ms(300); LED_GON; wait_ms(300); LED_GOFF; wait_ms(300); LED_GON; while(1){ LED_RON; LED_GOFF; wait_ms(10000); LED_ROFF; LED_GON; } //while(1)終了 return 0; }