//========================================================// // 最新 2009.5.15 // by そむてっく // LCD表示用関数 // 更新履歴 // 2009.05.11 ver 1.0 最低限度の表示プログラム // 2009.05.12 ver 1.1 液晶の表示位置指定関数追加 // 2009.05.15 ver 2.0 文字列および変数表示関数追加 // 2009.09.02 ver 2.1 lcd_printf関数改良 //========================================================// #include #include "delay.h" //関数ないでDelayMs()を使用しているため必要 #define LCD_RS RB1 //RS端子をポートBの1番ピンに #define LCD_E RB2 // E端子をポートBの2番ピンに #define PORTX PORTB //任意のポートで使用できるように(今はポートB) //********** LCDにデータを送信する関数 *************// //この関数が送信機能を持つ基本の部分です。 //********************************************// void lcd_out(char code, int flag){ //codeは送信するデータが入った変数 flagはコマンドかデータの選択をする変数 PORTX = ((code & 0xf0) | (PORTX & 0x0f)); //codeの上位4ビットと 今現在のポートの下位4ビットの状態を合わせて、出力 if(flag == 0) //flagが0ならデータ 1ならコマンド LCD_RS = 1; else LCD_RS = 0; NOP(); //時間稼ぎ LCD_E = 1; //LCDのE端子に5Vを出力 NOP(); NOP(); NOP(); LCD_E = 0; //LCDのE端子を0Vに } //********** LCDに文字データを送信する関数 ************// void lcd_data(char asci){ //asciは文字データが入った変数 lcd_out(asci,0); //LCDにデータを送信する関数に文字データを渡す lcd_out(asci<<4,0); //データを4ビットシフトして送信用関数に渡す DelayUs(50); } //********** LCDにコマンドを送信する関数 **************// void lcd_cmd(char cmd){ //cmdにはコマンドデータが入ってます lcd_out(cmd,1); //コマンドデータを送信用関数に渡す lcd_out(cmd<<4,1); //コマンドデータを4ビットシフトして送信用関数に渡す DelayMs(2); } //********** LCDの画面をリセットするコマンドを送る関数 *******// void lcd_clear(){ lcd_cmd(0x01); //画面リセットコマンドを送信 DelayMs(15); } //********** LCDを初期化する関数 *********************// void lcd_init(){ //液晶を使うために必要な初期化の手順 DelayMs(15); //始めに15ms以上待つ lcd_out(0x30,1); //8bitモード設定 DelayMs(5); //4.1ms以上待つ lcd_out(0x30,1); //再度8bitモードに設定 DelayMs(1); //100μs以上待つ lcd_out(0x30,1); //またまた8bitモードに設定 DelayMs(1); // lcd_out(0x20,1); //4bitモードに設定 DelayMs(1); // lcd_cmd(0x2C); //ファンクション設定 lcd_cmd(0x08); //ディスプレイOFF lcd_cmd(0x0E); //ディスプレイON lcd_cmd(0x06); //エントリーモードセット lcd_cmd(0x02); //カーソルをホームに移動 } //********** LCDを使いやすくするための関数群 ***************// // //**************************************************// //********** LCDの描画位置を指定する関数 ****************// void lcd_pos(char line,char col){ if(line == 1) //lineが1なら lcd_cmd(0x80 + col -1); //一行目の先頭アドレスにcolを足した位置に移動 else if(line == 2) //2の時も同様に lcd_cmd(0xc0 + col-1); DelayUs(50); } //********** LCDに文字列を表示する関数 *****************// void lcd_printf(char *data,...){ int kazu,keta=0,buf,i; char *p,moji[5],*p2; va_list ap; va_start(ap,data); for(p = data; *p!='\0';p++){ if(*p == '%'){ p++; switch(*p){ case 'c': lcd_data(va_arg(ap,char)); break; case 'd': kazu = va_arg(ap,int); buf = kazu; while(1){ buf = buf/10; keta++; if(buf == 0)break; } for(i=keta-1;i>=0;i--){ moji[i] = kazu%10 + '0'; kazu = kazu/10; } for(i=0;i