//========================================================// // 最新 2009.5.15 // by そむてっく // LCD表示用関数 // 更新履歴 // 2009.05.11 ver 1.0 最低限度の表示プログラム // 2009.05.12 ver 1.1 液晶の表示位置指定関数追加 // 2009.05.15 ver 2.0 文字列および変数表示関数追加 //========================================================// #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の描画位置を指定する関数 ****************// 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 *num,...) { va_list list; int i,k,n=0,m=0,count=0,mojisuu=0,size=0,data2=0; char data[5]; char moji[20]; char keta[5]; for(k=0;*(num+k) != '\0' ;k++){ if(*(num+k) == '%'){ data[count] = k; count++; } mojisuu++; } va_start(list,num); if(count > 0){ for(i=0;i