Vol.910 10.Jan.2025

BDFフォントエディッタ(サイズ拡大) OLED応用例(リアルタイム時計) WindowsVistaマシンの電源が入らない

F BDFフォントパターンエディッタ(2) 〜フォントサイズ拡張

by fjk

 abc909でフォントエディッタを紹介したが、16x16ドットパターンまでしか対応していなかった。しかし、次項の時計を作るため、もっと大きなパターンも作成したくなった。
 そこで、abc909に32x32ドットパターンまで編集できる機能を追加した。しかし、ROM書込やファイルのデータは最大16x16ドットのままで変更していないので、少し使いづらいところがある。
 「パターンエディッタ」タイトル下の赤枠部は16x16ドットの編集画面で、新たに32x32ドットの拡張画面を追加した。


(AA-AGまでの列を非表示にしている。拡張画面も使わない時は非表示にしてもよい)

【フォントエディッタの使い方】  BDF_Edita4.xlsm(zip)

  1. 編集画面内でマウスをWクリックすると、点が描画・消去され、その状態が拡張画面にも反映される。
  2. 編集画面下の枠移動アイコンを押すと、拡張画面の赤枠が移動し、その内容が編集画面に反映される。
  3. OfsX、OfsYに直接数値を入力し、「移動」ボタンを押すと、拡張画面の赤枠が移動する。
    (OfsX、OfsYを直接変更したときは、必ず「移動」ボタンを押しておくこと!)
  4. コピーなど編集画面が変わる場合、その結果は拡張画面(の赤枠内)にも反映される。
  5. 拡張画面下の茶色アイコンは拡張画面のパターンを上下左右に移動する(はみ出た部分は消える)。
  6. 「全消去」ボタンは拡張画面と編集画面の消去。「消去」ボタンは編集画面のみ消去。
  7. 「拡大」ボタンは編集画面のパターンを(赤枠の位置に係わらず)2×2倍に拡大し拡張画面に表示する。
  8. ROM書込やファイルのデータは最大16x16ドットで、32x32ドットは4つのデータで構成。すなわち、ファイルに保存するときは、(文字コード付きで)4つに分けて保存・読み出すこと。
    ※ROMやファイルには、編集画面の16x16、16x8(上半分)、8x16(右半分)、8x8(右上1/4)dot単位(C2、E2で指定)で書き込むこともできるが、読出しは、16x16と8x16ドットのみ。
※ データの保存には「HEXデータ記録」の他に「BDF転送」も使用できるが、拡張文字の場合、フォントパターンデータを分割する方式なので、オリジナルのCSVファイルに保存した方がよさそう。
 
【フォントエディッタの使用例】 〜半角数値拡大文字の作成・保存・書込
@ 半角(8x16dot)BDFファイルを読み込む
A 文字入力(C23)に半角数値を入力
B「パターン表示」をクリック(元データを表示)
C「パターンコピー」をクリック(編集画面にコピー)
D「拡大」をクリック(パターンを4倍に拡大)
E 拡大画面の赤枠を編集したい位置にセット
F 編集画面でマウスを使ってドットを編集
G 必要な分だけ、手順E−Fを繰り返す【編集終り】
H 保存ファイル名(C1)、保存サイス(C2,E2)を確認
I 保存・書込みたいパターンを編集画面に表示
J「BDF転送」をクリック(ROM書込、CSVで保存する場合)
K Code(B23)にコードを決めて16進数で入力
L「Hexデータ記録」をクリック【保存終り】
M 書き込みたいROMアドレスをAD2セルに入力
N「転送データ作成」をクリック
O「転送」または「転送+」をクリック【書込終り】
P 残りのパターンもI−Oで繰り返す
Q CorSize(C2)を8に戻して、Aから繰り返す
 
☆4つのパターンを読み出すときは、拡張画面の赤枠を読み出したい位置に合わせてから、(CSVファイルの)「読み込んで表示」などを実行

【備忘録】 〜今回利用したEXCEL_VBAのあれこれ   ([]はoption)

  1. ブックを開いた時の実行コードを記述(参考にしたページ
    (1)Workbook_Open プロシージャ
    「Microsoft Excel Objects」内の「ThisWorkbook」に記述
    (2)Auto_Open プロシージャ
    標準モジュールに記述。
    どのモジュールに記述しても問題ないが、2つ以上のモジュールに記述するとエラー
  2. Offsetを使おう(参考にしたページ
    表形式のデータを扱うには、表の左上をベースとして、offsetを使うと行、列の指定が容易
    Range(表の左上).Offset(行Offset, 列Offset)[.select]
  3. コピー・移動(参考にしたページ
    最も簡単なコピーは、以下のcopyメソッドで簡単にコピーできる
    Range(コピー元範囲).Copy Range(コピー先の左上)
    しかし、コピー元とコピー先の範囲が重なる場合、次の2段階で行う必要がある
    Range(コピー元範囲).Copy
    Range(コピー先).PasteSpecial [Paste:=(貼付条件)・・]
  4. 罫 線 (参考にしたページ
    罫線は、以下の書式などで指定できる。
    Range(範囲).Borders(引く箇所).Linestyle=罫線の種類
    なお、複数のパラメータを指定したい場合は、withを使うと便利。
  5. 範囲をCellsを使って指定するには (参考にしたページ
    RangeとCellsを組み合わせて指定する
    Range(Cells(左上行.左上列), Cells(右下行,右下列))
★ Excelプログラムのソースリスト
★ 【おまけ】横幅を狭めたBDF_Edita4B


P PICミニBBシリーズ(20)  〜応用例(リアルタイム時計)

by fjk

 OLED+RTCの応用例として時計(電池バックアップ付)を作成した。RTCはabc898で紹介したDS1307を使用。
 OLEDの表示文字は8x16dot文字を基本とし、時分は16x32dotの拡大(半角数字)文字とした。拡大文字は16x16dot文字を縦に2つ並べて表示し、拡大文字フォントデータは、ギリシャ文字の後(ROMアドレス:0x051C0から)に、コード番号0x2659〜0x266Cとして、2文字セットでROMに書き込んだ。
 なお、CPU基板上のプッシュスイッチを押すと、時計/メモリの表示を切り替えることができる(Jコマンドも同じ)。

【ハード】

回路図

RTC回路(ICソケットで嵩上)

【ソフト】
・RA5ピンのプルアップを忘れないこと!(MCCでWPUを設定)
・曜日に漢字を使っているので、MPLABXでソースをコンパイルすると、警告が出るが、無視!
 
RTC用のターミナルからのコマンドは
 : RTCデータを取得し表示
 : 時計とROMの表示切替え
 : 時刻の設定(”Thh:mm:ss”)
 : 日時の設定(”Yyy/MM/dd/w”)
   w(1〜7)は1が日曜
 
・以下のメモリアクセスコマンド、
 K、L   (abc908参照)、
 W、R、Q、U、P、S (abc902参照)
 も同時使用可能

時計表示例(RTCの表裏は通常と逆)

※ J、T、Yコマンド以外を実行するときは、時計表示を止めてから・・ 
※ 時計動作中、プログラムをPICに書き込むと、RTCとの通信がロックすることがある。
  (→電源を入れ直して下さい)
 
★ PICプログラムのソースリスト


W WindowsVista マシンの電源が入らない 〜いよいよwindows11?

by fjk

 年の終わりに近づいた日でした。先日まで動作していた(ネット非接続でEDIUS_NEO搭載の)WindowsVistaマシンの電源が急に入らなくなった(ファンも廻らない)。そういえば、2008年に組み立ててから16年も経過していて、落雷被害にも遭ってマザーボードを交換したマシンである。
 いよいよダメかなとも思いつつ、故障の原因を考えてみると、
    @ ATX電源が故障
    A 電源スイッチの故障
    B マザーボード等の故障
 などが考えられるが、マザーボードについている電源LEDも点灯しないので、@の可能性が高い。
 
 そこで、全ての配線を取り外し、アイネックスのATX電源検証ボードKM-02Bを使って、電源の動作を確認したところ、チャンとLEDが点灯し、正常に動作しているようにみえる。
 しかし、念のためと手持ちのATX電源と交換してみると、今度は電源ランプが点灯し、ファンも回り、正常にBIOSが立ち上げってきた。
 バックアップ用のボタン電池(CR2032)を交換し、日付と時刻などBIOSを設定し直し、一端電源を切る。SATA接続のWindowsHDDを接続し、再度電源をONにすると、無事Vistaが正常に起動した。ATX電源不良が故障の原因であった。一時は諦めていたVistaマシンは、もう少し寿命が延びたようだ。
 Wndows10のサポートも2025年10月14日までと、そろそろwindows11マシンへの移行を本格的に検討する時期かな・・(今なら、windows11へ無料でアップグレードできますが・・)。
 windouws11へのアップグレードができない環境のパソコンの場合、サポート終了後3年間はセキュリティ更新のみ利用出来る「拡張セキュリティ更新ESUプログラム」(有償)も有りますが・・。


電源単独では大丈夫そう・・。でも起動しない

念のためと、電源を交換してみると・・


【BDFフォントエディッタのVBAプログラム】

abc909に追加した関数のみ紹介(詳細は BDFEdita4.bas[zip] を参照)

' ---   これ以前は、何カ所かで追加・修正したが、BDFEDita3.basとほぼ同じなので、省略 ---

Function DrawBgLine()
        With Range("BQ2:CV33")
            .Borders.LineStyle = xlNone
            .BorderAround Weight:=xlMedium, Color:=vbBlack
        End With
        With Range("CG2:CG33")
            .Borders(xlEdgeLeft).Color = vbCyan
        End With
        With Range("BQ18:CV18")
            .Borders(xlEdgeTop).Color = vbCyan
        End With
        Call DrawCsrBox
End Function

Function DrawCsrBox()
    OfsX = Range("AQ36"): OfsY = Range("AQ38")
    With Range(Cells(2 + OfsY, 69 + OfsX), Cells(17 + OfsY, 84 + OfsX))
        .BorderAround Weight:=xlMedium, Color:=vbRed
    End With
End Function

Function SetEditScrn()
     Range("BQ2:CV33").Borders.LineStyle = xlNone
    OfsX = Range("AQ36"): OfsY = Range("AQ38")
    With Range(Cells(2 + OfsY, 69 + OfsX), Cells(17 + OfsY, 84 + OfsX))
        .Copy Range("AI5:AX20")
    End With
    Call DrawBgLine
End Function

Function OfsetCopy()
    OfsX = Range("AQ36"): OfsY = Range("AQ38")
    Range("AI5:AX20").Copy Range("BQ2").Offset(OfsY, OfsX)
    Call DrawBgLine
End Function

Sub AllClear()
    Dim rtn As Integer
    rtn = MsgBox("全パターンを消去して良いですか?", vbYesNo + vbQuestion, "確認")
    If rtn = vbYes Then
        Range("BQ2:CV33").Clear
        Range("AI5:AX20").Clear
        Call DrawBgLine
    End If
End Sub

Private Sub auto_open()
    OfsX = 0: Worksheets("16dot").Range("AQ36") = 0
    OfsY = 0: Worksheets("16dot").Range("AQ38") = 0
End Sub

Sub ShiftRight()
    Dim selectAddr As Variant
    selectAddr = Selection.Address
    Range("BQ2:CU33").Copy
    Range("BR2").PasteSpecial
    Range("BQ2:BQ33").Clear
    Range(selectAddr).Select
    Call SetEditScrn
End Sub

Sub ShiftLeft()
    Dim selectAddr As Variant
    selectAddr = Selection.Address
    Range("BR2:CV33").Copy
    Range("BQ2").PasteSpecial
    Range("CV2:CV33").Clear
    Range(selectAddr).Select
    Call SetEditScrn
End Sub

Sub ShiftDown()
    Dim selectAddr As Variant
    selectAddr = Selection.Address
    Range("BQ2:CV32").Copy
    Range("BQ3").PasteSpecial
    Range("BQ2:CV2").Clear
    Range(selectAddr).Select
    Call SetEditScrn
End Sub

Sub ShiftUp()
    Dim selectAddr As Variant
    selectAddr = Selection.Address
    Range("BQ3:CV33").Copy
    Range("BQ2").PasteSpecial
    Range("BQ33:CV33").Clear
    Range(selectAddr).Select
    Call SetEditScrn
End Sub

Sub Enlarge()
    Dim row, col As Integer
    Dim rtn As Variant
    rtn = MsgBox("パターンを拡大しますか? (全データが変更されます)", vbYesNo + vbQuestion, "確認")
    If rtn = vbYes Then
    For row = 0 To 15
      For col = 0 To 15
         If Range("AI5").Offset(row, col) = "" Then
             Range("BQ2").Offset(row * 2, col * 2) = ""
             Range("BQ2").Offset(row * 2 + 1, col * 2) = ""
             Range("BQ2").Offset(row * 2, col * 2 + 1) = ""
             Range("BQ2").Offset(row * 2 + 1, col * 2 + 1) = ""
         Else
             Range("BQ2").Offset(row * 2, col * 2) = "●"
             Range("BQ2").Offset(row * 2 + 1, col * 2) = "●"
             Range("BQ2").Offset(row * 2, col * 2 + 1) = "●"
             Range("BQ2").Offset(row * 2 + 1, col * 2 + 1) = "●"
         End If
      Next
    Next
    Call SetEditScrn
    End If
End Sub


【OLEDとRTC(DS1307)を使ったPIC用プログラム】

・abc910-18326.cファイル: abc910-18326.c + myProject.h(zip)
・i2c_SSD1306.c/hファイル: i2c_SSD1306.c/h + Font_5x7.h (zip)
・i2c_MEM.cファイル:     i2c-MEM.c/h(zip)
・ターミナルとの通信に利用するEUSARTのコード追加はリンク先を参照

RTC-DS1307.c/h(zip)(abc898に追加・修正したもの)

/********************************(RTC-DS1307.c)***
 *  RTC (DS1307) ライブラリ
 ****************************************************/

#include "string.h"
#include "myProject.h"

#define DS1307  0x68    // RTCのI2Cアドレス

#define NO_PRINTF

//===   RTC用変数(2進数で格納)
                
uint16_t J_Week[]={'日','月','火','水','木','金','土'};
char     D_Week[][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};

uint8_t DayTm[] = { 0,	// Seconds
                    30,	// minutes
                    10,	// Hours(24h)
                    4,	// day[week]
                    1,	// date
                    1,	// month
                    25,	// year (下2桁)
                    0	// SQW/OUT
                 };

static uint8_t ClockMd = 1;    // 起動時は時計表示モード
static uint8_t Sec = 0;

/****** 汎用関数 ***************************/
//---- BCD数を2進数に変換
uint8_t bcd2bin(uint8_t bcd){
    return  ((bcd >> 4)& 0x0F) * 10 + (bcd & 0x0F);
}

//---- 2進数をBCD数に変換
uint8_t bin2bcd(uint8_t bin){
    return  (uint8_t)((uint16_t)(bin/10) << 4)+(bin % 10);
}

//---- 文字列から数値を取り出し、1バイト配列に逆順で格納
/*      buf:    取り出した数値を格納する1バイト配列
 *      src:    数値を取り出す文字列
 *      delim:  区切り文字を文字列にしたもの
 *  (戻り値): 取得出来た数値の数                   */
uint8_t get_NumRev(uint8_t *buf, char *src, char *delim){
    char    *ptr;
    uint8_t bt, n = 0;
    ptr = strtok(src, delim);
    while(ptr != NULL){
        bt = (uint8_t)atoi(ptr);  //無効データでも0を返す
        *buf-- = bt;
        n++;
        ptr = strtok(NULL, delim);
    }
    return n;
}

/****** RTC用関数 ******************************/
//--- RTCのadr番地にdatデータを書き込む
void RTC_write(uint8_t adr, uint8_t dat){
    uint8_t bf[3];
    bf[0] = adr;                     // Address = adr
    bf[1] = dat;                     // Set Data
    I2C1_WriteNBytes(DS1307, bf, 2); // Write Data
}

//--- RTCのadr番地のデータを読み込む
uint8_t RTC_read(uint8_t adr){
    uint8_t bf[3];
    bf[0] = adr;                     // Address = adr
    I2C1_WriteNBytes(DS1307, bf, 1); // Set Address
    I2C1_ReadNBytes(DS1307, bf, 1);  // Read Data
    return bf[0];
}

//--- RTCの全てのrtcデータをbuf[]読み込む
void RTC_readAll(uint8_t *buf,uint8_t bcd){
    uint8_t rtc[8],i;
    rtc[0] = 0;                       // Address = 0
    I2C1_WriteNBytes(DS1307, rtc, 1); // Set Address
    I2C1_ReadNBytes(DS1307, rtc, 8);  // Read Data
    for(i = 0; i < 8; i++){
        if(bcd) buf[i] = bcd2bin(rtc[i]);
        else    buf[i] = rtc[i];
    }
}

//--- RTCの全てにrtcデータを書き込む
void RTC_writeAll(uint8_t *buf){
    uint8_t rtc[8],i;
    rtc[0]=0;                         // Address = 0
    for(i=0; i < 8; i++){
        rtc[i+1] = bin2bcd(buf[i]);
    }
    I2C1_WriteNBytes(DS1307, rtc, 9);
}

//--- RTCの指定アドレスからnバイトのデータを書き込む
void RTC_writePrt(uint8_t *buf, uint8_t adr, uint8_t n){
    uint8_t rtc[9],i;
    rtc[0] = adr;                      // Address = adr
    for(i = 0;i < n; i++){
        rtc[i+1] = bin2bcd(buf[adr+i]);
    }
    I2C1_WriteNBytes(DS1307, rtc, n+1);
}

//--- RTCの初期化(通常は使用しない)
void RTC_init(){
    RTC_writeAll(DayTm);
}

/*======================================
 * 	BCDデータ表示サブルーチン
 *=====================================*/
//--- BCDデータを文字変換し文字列に差し込む
char *RTC_HsetBCD(char *str, uint8_t bcd,uint8_t zero){
    uint8_t hcd;
    if( (zero>0) & ((bcd>>4)==0) )
        hcd = 0x20;  
    else
        hcd = 0x30 + (bcd >> 4);
    *str++ = hcd;
    hcd = 0x30 + (bcd & 0x0F);
    *str++ = hcd;
    return str;
}

//--- BCDデータを全角文字列に変換して表示
/*	x:表示x位置、pg:表示ページ位置、gap:表示文字間ドット数
 *	bcd:表示したいBCD文字、zero:ゼロサプレスが無し(0)/有り(1)	*/
void RTC_ZprtBCD(uint8_t x, uint8_t pg, uint8_t gap, uint8_t bcd,uint8_t zero){
    uint16_t kcd;
    if( (zero>0) & ((bcd>>4)==0) )
        kcd = 0x2121;  
    else
        kcd = 0x2330 + (bcd >> 4);
    i2cOLED_ZchrX(x,pg,kcd,2);
    kcd = 0x2330 + (bcd & 0x0F);
    i2cOLED_ZchrX(x+16+gap,pg,kcd,2);  
}

//--- BCDデータを拡張全角文字列に変換して表示
/*	x:表示x位置、pg:表示ページ位置、gap:表示文字間ドット数
 *	bcd:表示したいBCD文字、zero:ゼロサプレスが無し(0)/有り(1)	*/
void RTC_2ZprtBCD(uint8_t x, uint8_t pg, uint8_t gap, uint8_t bcd,uint8_t zero){
    uint16_t kcd;
    if( (zero>0) & ((bcd>>4)==0) ){
        kcd = 0x2121;
        i2cOLED_ZchrX(x,pg,kcd,2);        
        i2cOLED_ZchrX(x,pg+2,kcd,2);      
    }else{
        kcd = 0x2659 + (bcd >> 4)*2;
        i2cOLED_ZchrX(x,pg,kcd,2);
        i2cOLED_ZchrX(x,pg+2,kcd+1,2);      
    }
    kcd = 0x2659 + (bcd & 0xF)*2;
    i2cOLED_ZchrX(x+16+gap,pg,kcd,2);
    i2cOLED_ZchrX(x+16+gap,pg+2,kcd+1,2);   
}

//---- RTC データをOLED に表示(BCDデータを利用)
void RTC_prtOLED(){
    char buf[20];
    uint8_t d;
    uint16_t kcd;
    RTC_readAll(DayTm,0);
    strcpy(buf,"2000/01/01(");
    RTC_HsetBCD(buf+2,DayTm[6],0);
    RTC_HsetBCD(buf+5,DayTm[5],1);
    RTC_HsetBCD(buf+8,DayTm[4],1);
    d = DayTm[3] & 0x0F;
    i2cOLED_HstrX(0,0,buf);
    i2cOLED_ZchrX(92,0,J_Week[d],0);
    i2cOLED_HchrX(112,0,')');
    RTC_2ZprtBCD(0,3,4,DayTm[2],1);
    i2cOLED_HchrX(40,3,0xA5);    i2cOLED_HchrX(40,5,0xA5);
    RTC_2ZprtBCD(50,3,4,DayTm[1],0);
    RTC_ZprtBCD(90,5,0,DayTm[0],0); 
}

/***** コマンド処理 *********************/
//---- I(read_tIme)コマンド(テスト用)	"I"
void i2cRTC_cmd_I(){
    char buf[20];
    RTC_readAll(DayTm,0);
    strcpy(buf,"2000/01/01(   )");
    RTC_HsetBCD(buf+2,DayTm[6],0);
    RTC_HsetBCD(buf+5,DayTm[5],0);
    RTC_HsetBCD(buf+8,DayTm[4],0);
    buf[12] = 0x30 + (DayTm[3]& 0x0F);
    puts(buf);  i2cOLED_HstrX(0,0,buf);
    strcpy(buf," 00:00:00     ");
    RTC_HsetBCD(buf+1,DayTm[2],0);
    RTC_HsetBCD(buf+4,DayTm[1],0);
    RTC_HsetBCD(buf+7,DayTm[0],0);
    puts(buf);i2cOLED_HstrX(0,2,buf);
}

//---- Jコマンド (OLED表示切り替え))	"J"
void cmd_J(){
    ClockMd ^= 1;
    i2cOLED_Clr(0,7,0);
}

//---- Y(Year)コマンド(日付設定用)		"Yyy/MM/dd/w"
void i2cRTC_cmd_Y(char *str){
    uint8_t n;
    n = get_NumRev(DayTm+6, str+1, "/");
    if((n > 0)&&(n < 5)){
        RTC_writePrt(DayTm, 3, 4);
    }
}

//---- T(Time)コマンド(時刻設定用)	"Thh:mm:ss"
void i2cRTC_cmd_T(char *str){
    uint8_t n;
    n = get_NumRev(DayTm+2, str+1, ":");
    if((n > 0)&&(n < 4)){
        RTC_writePrt(DayTm, 0, 3);
    }
}

//---- 時刻を読出しOLEDに表示 
void OLED_Clock(){
    uint8_t t;
    RTC_readAll(DayTm,1);
    t = DayTm[0];
    if(Sec != t){		//  表示は秒単位
        if(ClockMd) RTC_prtOLED();
        Sec = t;
        IO_RA4_Toggle();
    }  
}

/********************************(RTC-DS1307.h)***
 *  RTC (DS1307) ライブラリ ヘッダーファイル
 ****************************************************/

/*===  RTC用関数  ============================= */
//--- RTCのadr番地にdatデータを書き込む
/* 	    adr: 書き込む番地、dat:書き込むデータ */
void RTC_write(uint8_t adr, uint8_t dat);

//--- RTCのadr番地のデータを読み込む
/*      adr: 読み込む番地
 *      rtn: 書き込まれたデータ	        */
uint8_t RTC_read(uint8_t adr);

//--- RTCの全てのrtcデータをbuf[]読み込む
void RTC_readAll(uint8_t *buf,uint8_t bcd);

//--- RTCの全てにrtcデータを書き込む
/*      BCDデータに変換してRTCにデータを書き込む
 *      buf: 書き込むBinaryデータ配列  */
void RTC_writeAll(uint8_t *buf);

//--- RTCの指定アドレスからnバイトのデータを書き込む
/*      buf: 書き込むデータが格納された配列
 *      adr: 書き込むRTCアドレス
 *      n:   書き込むバイト数     */
void RTC_writePrt(uint8_t *buf, uint8_t adr, uint8_t n);

//--- RTCの初期化(通常は使用しない)
void RTC_init();

//---- RTC データをOLED に表示
/*      BCDデータのままRTCから読込OLEDに表示 */
void RTC_prtOLED();

/*==== コマンド処理 ==========================  */
//---- I(read_tIme)コマンド(テスト用)	"I"
/*      RTCデータを読み出しターミナルに表示  */
void i2cRTC_cmd_I();

//---- Jコマンド (OLED表示切り替え))	"J"
void cmd_J();

//---- Y(Year)コマンド(日付設定用)		"Yyy/MM/dd/w"
/*      指示された日付をRTCに書き込む  	*/
void i2cRTC_cmd_Y(char *str);

//---- T(Time)コマンド(時刻設定用)	"Thh:mm:ss"
/*      指示された時刻をRTCに書き込む */
void i2cRTC_cmd_T(char *str);

//---- 時刻を読出しOELDに表示
void OLED_Clock();


【おまけ】

  1. BDF_Edita4B.xlsm(zip)はBDF_Edita4.xlsmの横幅を狭めたもの(一部の列を非表示にしただけ)。
  2. H2xNum.csv(zip)は本エディッタで作った拡張半角文字のCSVファイル(サイズを16x16dotにすること)。


※プログラムのリストをハイライト付きのスタイルで見る場合はここをクリック


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


BDFフォントエディッタ(サイズ拡大) OLED応用例(リアルタイム時計) WindowsVistaマシンの電源が入らない