Vol.913 28.Feb.2025

一太郎ビュアー 自撮り棒 カラー文字表示(OLED)

I 一太郎ビュアー

by fjk

 日本語文書の作成時に、Wordより細かな設定ができる「一太郎」(と「花子」)を長年使っているが、ワープロとしてはwordほどメジャーでは無く、環境によっては折角作ったファイルを見れないことがある。
 この様なときに、無料の「一太郎ビュアー」を使うと、一太郎文書を確認することができる。ビュアーなので編集はできないが、一応ファイルの中身は確認できる。
<動作環境>

・OS:
Windows 11、Windows 10 / Home/Pro (32/64ビット)
・ハードディスク:
約60MB以上必要
・テキスト形式:
テキストファイルも読込可能
・Microsoft Word:
Word 2021〜Ver5 (doc/docx)も読込可能

一太郎ビュアー表示例
・もし、一太郎ビュアーをインストール後、
 『 ファイルの関連付け 』が変わった場合:
  「 設定 > アプリ > 既定のアプリ 」、
  さらに
  「ファイルの種類ごとに既定のアプリを選ぶ」
   で、拡張子とアプリの関連を付け直す


J 自撮り棒

by fjk

 スマホなどで自撮りをするためのスタンドは持っていたが、ネットで自撮り棒を探していると、4脚の自撮り棒(兼スタンド)(BTリモコン付)がアマゾン(1,698円)で売られており、カメラ取付用アダプタも付属で、ついポチり。
 主な仕様は、

・最大長:
103cm(折り畳むと17.5cm、スタンド時最低高は約30cm)
・重 量:
260g
・対応スマホ:
62〜100mm幅のスマホ
・動作角度:
スマホ360°回転、ヘッド部上下225°回転
・リモコン:
取り外し可能Bluetooth5.2リモコン付き
・アダプタ:
交換用カメラマウント(1/4インチネジ)


折り畳むとコンパクト

自撮り棒として(リモコン付)

自立4脚スタンドとして


P PICミニBBシリーズ(22) 〜カラー文字表示(OLED)

by fjk

 abc912で、QT095B(OLED)がPICで使えることを確認できたので、OLEDに文字などを表示してみた。
 ハードはabc912に4GビットのSPI接続EEPROMであるIS25LP040E(秋月電子、#118046、@80)を追加したものを用いた。
 ソフトは、表示用にabc912のSSD1331.c、メモリアクセス用にabc903のspi_Mem.cをベースに、少し変更や追加を行った。また、文字フォントの書込はabc905abc910などのExcelによるフォントエディッタを利用した。
 なお、IS25LP040Eのピン配置・メモリ読み書きコマンドはabc902で使った25LCV1024とほぼ同じだが、書込エリアと縦/横アドレス増モードを指定後、1ドット単位(カラー2〜3バイト)で書き込んだ。


ブレッドボード配線状況
(回路図はabc912参照)

テスト画面表示
 

フォントデータ書込中画面

テスト画面(上)拡大

K(H)コマンド実行例

Lコマンド実行例

【シリアル通信コマンド】 (アドレス、データ、文字コードは16進数)、[ ]は省略可
T   (Test)
カラー文字表示テスト
W[aaaa][,[d0,・・[,]]]   (Write)
アドレスaaaa(省略時:現在アドレス)からバイトデータを書込む。
コンマで終わると連続書込モード。
R[aaaa][,n]   (Read)
アドレスaaaa(省略時:現在アドレス)からn(省略時:1)バイトデータを読出す。
Q   (Quit Sequence_Mode)
連続書込モードの解除。 W、S以外のコマンドでもモード解除。
U[aaaa]   (dUmp)
アドレスaaaa(省略時:現在アドレス)が含まれる64バイト単位でデータをDBuf[]に読出し、表示。
P   (Page)
64バイトのデータバッファーの表示
PW[aaaa]   (Page Write)
[aaaa]番地を含む64バイトにバッファーの内容を書込む
PR[aaaa]   (Page Read)
[aaaa]番地を含む64バイトをバッファーに読込み、表示
S[aa][.[d0,・・[,]]]   (Set data)
64バイトのデータバッファーに書込む以外はWコマンドと同じ。
連続書込モードも有効。
aa(省略時:現在アドレス)は下位6ビットのみ有効。
K[H][aaaa]   (Kanji、漢字)
[aaaa] 番地から、文字パターンを最大16/8文字表示
H: Hを指定すると半角表示(省略時:全角表示)
aaaa: 格納アドレス指定(省略時:次アドレス)
L[code]   (Letter、文字)
文字パターンと16進データを表示
code: (全角/半角)JIS文字コードを指定(省略時:次文字)
 
※W、SおよびRコマンド実行後、現在アドレスは次のアドレスになる。


【QT095Bのプログラム】
 abc913-18326.c + myProject.h (zip)


/******************************(abc913-18326.c)**********
 *	有機ELカラーグラフィック テスト2 	QT095B(SSD1331)
 ********************************************************/

#include "mcc_generated_files/mcc.h"
#include "myProject.h"

char     sBf[BFSIZE];                   // 文字列作業エリア
char     RBuf[BFSIZE];                  // シリアル受信バッファ
uint8_t  SFlg;                          // シリアル受信フラグ
char msg1[] = "*== SSD1331 ==*";

uint8_t gptn[] =
      { 0x1f, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
        0xFF, 0x1F, 0x1C, 0x1C, 0x1F, 0xFF,
        0xFF, 0x1C, 0xE0, 0xE0, 0x1C, 0xFF,
        0xFF ,0x1C, 0xE0, 0xE0, 0x1C, 0xFF,
        0xFF ,0x1C, 0xE0, 0xE0, 0x1C, 0xFF,
        0xFF, 0x1C, 0xE0, 0xE0, 0x1C, 0xFF,
        0xFF, 0x1F, 0x1C, 0x1C, 0x1F, 0xFF,
        0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F };

char h[2][16]={
      { 0x00,0xC0,0x38,0x06,0x38,0xC0,0x60,0x00,
        0x3C,0x03,0x02,0x02,0x02,0x03,0x3C,0x00},
      { 0x78,0x84,0x02,0x02,0x02,0x84,0xF8,0x00,
        0x08,0x10,0x21,0x21,0x21,0x10,0x0F,0x00}     
    };

char k[2][32]={
    {	0x00,0x10,0x60,0x01,0x06,0x04,0xE4,0x24,
     	0x2F,0x24,0xE4,0x24,0x2F,0x24,0xE4,0x04,
     	0x00,0xC0,0x30,0x0C,0x03,0x90,0x95,0x55,
     	0x55,0x35,0x1F,0x35,0x55,0x55,0x91,0x90},   // 漢
    {	0x00,0x1C,0x04,0x04,0x24,0x24,0x24,0x24,
     	0xA7,0xA4,0x64,0x24,0x04,0x04,0x1C,0x00,
     	0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x82,
     	0xFF,0x02,0x02,0x02,0x02,0x02,0x02,0x02}    // 字
    };

uint8_t sinP[] = {4,6,7,8,7,6,4,2,1,0,1,2,
                  4,6,7,8,7,6,4,2,1,0,1,2,4};       // Sin Wave

void testSin(uint8_t x, uint8_t y, uint8_t c){
    uint8_t i;
    for(i=0;i<24;i++){
        gOLED_Pset256(x+i,y+sinP[i],c);
    }
}

void test_OLED(){
    uint8_t xpos;
    xpos = gOLED_chrX( 0, 0,'0',RGB256(7,7,3));
    xpos = gOLED_chrX(10, 0,'1',RGB256(7,0,3));
    xpos = gOLED_chrX(20, 0,'2',RGB256(0,7,0));
    xpos = gOLED_chrX(30, 0,'A',RGB256(7,0,0));
    xpos = gOLED_chrX(40, 0,'H',RGB256(0,7,3));    
    xpos = gOLED_chrX(50, 0,'?',RGB256(0,0,3));   
    xpos = gOLED_strX( 0,12,msg1,RGB256(7,7,0));

    testSin(0,24,RGB256(0,7,3));
    
    gOLED_ptnX(48,32,gptn,6,8,0);
    gOLED_ptnX(64,48,gptn,8,6,1);
   
    xpos = gOLED_HptnX(72,24,h[0],RGB256(0,7,0));
    xpos = gOLED_HptnX(xpos,24,h[1],RGB256(0,7,0));
    
    xpos = gOLED_KptnX(0,40,k[0],RGB256(7,7,3));
    xpos = gOLED_KptnX(xpos,40,k[1],RGB256(7,0,3)); 
    
}

/**************************************
 *    Main application
 ***************************************/
void main(void){
  char cmd;
  uint8_t xpos;
  SYSTEM_Initialize();
  SSP1CON1bits.SSPEN = 1;
  SSD1331_Init();      
  INTERRUPT_GlobalInterruptEnable();
  INTERRUPT_PeripheralInterruptEnable();

  gOLED_Clr(0,0,95,63);
  puts(msg1);                 // PIC動作確認用
  putchar('\r');
  test_OLED();
  IO_RA4_SetHigh(); 
  
  while (1){
    if(SFlg){
        cmd = RBuf[0];
         gOLED_Clr(0,0,95,63);
        gOLED_strX(0,0,RBuf,RGB256(7,7,0));
        switch(cmd){
            case 'T': test_OLED();         break;
            case 'W': spiMem_cmd_W(RBuf);  break;
            case 'R': spiMem_cmd_R(RBuf);  break;
            case 'Q': spiMem_cmd_Q(RBuf);  break;
            case 'U': spiMem_cmd_U(RBuf);  break;
            case 'S': spiMem_cmd_W(RBuf);  break;
            case 'P': spiMem_cmd_P(RBuf);  break;
            case 'K': spiMem_cmd_K(RBuf);  break;
            case 'L': spiMem_cmd_L(RBuf); break;
                                    // 有効なコマンドがなく
            default:  if(spiMem_SqMode()){
                            spiMem_cmd_WSQ(RBuf);
                      }         // 連続書込モード中なら
                      break;    // 書込シーケンスを実行
        } 
        SFlg = 0;
    }
    __delay_ms(100);
     IO_RA4_Toggle();     
  }
}

/****   End of File   *****/

 SSD1331.c/h + Font_5x7.h (zip)

/***********************************(SSD1331.h)**********
 *	SPI有機ELカラーグラフィックヘッダーファイル
 ********************************************************/

#define  COLOR256   0x20
#define  COLOR64K2  0x42
#define  COLOR64H3  0x82

//---  SSD1331 初期化
void SSD1331_Init();

//---  SPI コマンド出力
void gOLED_Cmd(uint8_t b);

//---  SPI データ出力
void gOLED_Data(uint8_t b);

//----  RGBを1バイト256色に   ( R = 0-7, G = 0-7, B = 0-3 )
uint8_t RGB256(uint8_t r,uint8_t g, uint8_t b);

//----  RGBを2バイト64k色に   ( R = 0-31, G = 0-63, B = 0-31 )
uint16_t RGB64k(uint8_t r,uint8_t g, uint8_t b);

//---  色モード指定(アドレス増方向指定付き)
/*      dir: 0/水平方向、1/垂直方向 */
void setMode(uint8_t md, uint8_t dir);

//---  表示エリアの設定
/*      (x0,y0)-(x1,y1):エリア指定 */
void setArea(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1);

//---  表示エリアのリセット
void rstArea();

/******* アクセラレーションコマンド **********/
/*      (x0,y0)-(x1,y1):エリア指定 */
//---  画面クリア
void gOLED_Clr(uint8_t x0,uint8_t y0,uint8_t x1,uint8_t y1);

//---  線描画(256色)
void gOLED_Line(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, uint8_t r, uint8_t g ,uint8_t b);

//---  四角形描画(256色)
void gOLED_Rect(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, uint8_t r, uint8_t g ,uint8_t b);

//---  画像コピー
void gOLED_Copy(uint8_t x0,uint8_t y0, uint8_t x1,uint8_t y1, uint8_t dx, uint8_t dy);

//---  塗りつぶしのOn[1]/Off[0]
void gOLED_Fill(uint8_t fl);

/******* 文字・パターン描画 ******/
//---  1ドット描画(256色)
/*      (x,y)位置にcol色でドット描画 */
void gOLED_Pset256(uint8_t x, uint8_t y,uint8_t col);

//----  5x7ドットASCII文字を1文字表示(256色)
/*      (x,y)位置からASCII文字(dat)をcol色で描画
 *	rtn: 次表示x位置	 */
uint8_t gOLED_chrX(uint8_t x, uint8_t y, char dat, uint8_t c);

//----  5x7ドットASCII文字列を表示(256色) 
/*      (x,y)位置からASCII文字列(*str)をcol色で描画
 *	rtn: 次表示x位置	 */
uint8_t gOLED_strX(uint8_t x, uint8_t y, char *str, uint8_t c);

//----  半角フォントアドレス取得
/*      chCode: 半角文字コード(0-0xFF)
 *	rtn: 文字コード格納アドレス */
uint32_t HfntAdr(uint8_t chCode);

//----  全角(漢字)フォントアドレス取得)
/*      kCode: 全角文字コード(0x2121-0x7426)
 *	rtn: 文字コード格納アドレス */
uint32_t KfntAdr(uint16_t kCode);

//----  8x16ドット文字を1文字表示(256色)
/*      (x,y):表示開始位置、 *hp:フォントデータアドレス、col:表示色
 *	rtn: 次表示x位置	 */
 uint8_t gOLED_HptnX(uint8_t x, uint8_t y, char *hp, uint8_t col);

//---- 半角(8x16)文字表示(次xpos位置を返す)
/*      (x,y):表示開始位置、chCode:文字コード(0-255)、col:表示色
 *	rtn: 次表示x位置	 */
uint8_t gOLED_HchrX(uint8_t x, uint8_t y, uint8_t chCode,uint8_t col);

//---- 半角(8x16)文字列表示(次xpos位置を返す)-----
/*      (x,y):表示開始位置、chCode:半角文字列(*str)、col:表示色
 *	rtn: 次表示x位置	 */
uint8_t gOLED_HstrX(uint8_t x, uint8_t y, char *str,uint8_t col);

//----  全角文字(漢字、16x16)を1文字表示(256色)
/*      (x,y):表示開始位置、 *kp:フォントデータアドレス、col:表示色
 *	rtn: 次表示x位置	 */
uint8_t gOLED_KptnX(uint8_t x, uint8_t y, char *kp, uint8_t col);

//---- 全角文字(漢字、16x16)文字表示
/*      (x,y):表示開始位置、kCd:全角文字コード、col:表示色、
 *      ed:エンディアン(0:リトルJIS変換、1:ビッグJIS変換、2:リトル、3:ビッグ)
 *	rtn: 次表示x位置	 */
uint8_t gOLED_ZchrX(uint8_t x, uint8_t y, uint16_t kCd,uint8_t col, uint8_t ed);

//---- 全角文字(漢字、16x16)列表示
/*      (x,y):表示開始位置、*str:全角文字列、col:表示色、
 *      ed:エンディアン(0:リトルJIS変換、1:ビッグJIS変換、2:リトル、3:ビッグ)
 *	rtn: 次表示x位置	 */
uint8_t gOLED_ZstrX(uint8_t x, uint8_t y, char *str,uint8_t col, uint8_t ed);

//--- パターンデータを表示(256色)
/*      (x,y):表示開始位置、*ptn:パターンデータ、xn/yn:水平/垂直ドット数
 *      vh:0/水平方向描画、1/垂直方向描画	*/
void gOLED_ptnX(uint8_t x, uint8_t y, uint8_t *ptn, uint8_t xn, uint8_t yn, uint8_t vh);

//--- パターンデータを表示(64k色、モード1)
/*      (x,y):表示開始位置、*ptn:パターンデータ、xn/yn:水平/垂直ドット数
 *      vh:0/水平方向描画、1/垂直方向描画 */
void gOLED_ptnX_FC2(uint8_t x, uint8_t y, uint8_t *ptn, uint8_t xn, uint8_t yn, uint8_t vh);

//--- パターンデータを表示(64k色、モード2)
/*      (x,y):表示開始位置、*ptn:パターンデータ、xn/yn:水平/垂直ドット数
 *      vh:0/水平方向描画、1/垂直方向描画 */
void gOLED_ptnX_FC3(uint8_t x, uint8_t y, uint8_t *ptn, uint8_t xn, uint8_t yn, uint8_t vh);

/****   End of File   *****/

 spiMem.c/h (zip)

/******************************(spi_Mem.h)***************
 *	SPI接続メモリ(IS25LP040E)ヘッダーファイル
 ********************************************************/

#include "SSD1331.h"
#include "ctype.h"              // isxdigit()
#include "stdio.h"              // puts(),..
#include "stdlib.h"             // atoi()...
#include "string.h"             // strtok()...
//#include "myProject.h"

#define SPIMEM_WRITEcmd 0x02	// WRITE
#define SPIMEM_READcmd  0x03	// READ

#define SPIROM_WR_STATS 0x01	// WRSR
#define SPIROM_WRITEcmd 0x02	// WRITE
#define SPIROM_READcmd  0x03	// READ
#define SPIROM_RD_STATS 0x05	// RDSR
#define SPIROM_WR_ENABL 0x06	// WREN
#define SPIROM_PG_ERASE 0x42	// PE  Page Erase
#define SPIROM_CP_ERASE 0xC7	// CE  Chip Erase
#define SPIROM_SC_ERASE 0xD8	// SE  Sector Erase

//----- Wコマンド   W[aaaa][,[d0,・・[,]]]
uint16_t spiMem_cmd_W(char *str);

//---- Rコマンド  R[aaaa][,n]
uint16_t spiMem_cmd_R(char *str);

//---- WSQ (連続書込モード)
uint16_t spiMem_cmd_WSQ(char *str);

//---- Qコマンド(連続書込モードの解除)   Q
void spiMem_cmd_Q(char *str);

//---- U(dump)コマンド    U[aaaa]
//         (64バイトのデータをDBuf[]に読み出す)
int spiMem_cmd_U(char *str);

//---- P(Page)コマンド    PW[aaaa]
//          (DBuf[]の64バイトをメモリに書き込む)
int spiMem_cmd_P(char *str);

//----  シーケンスモードの確認
uint8_t spiMem_SqMode();

//----  SPI-ROMのステータスの取得
uint8_t SPI_Rom_RdStat();

//-----  アドレスadrからnバイトをary[]に読み出す
void SPI_Mem_NRead(uint32_t adr,uint8_t *ary,uint16_t cnt);

//-----  K(漢字)表示コマンド  K[H][aaaa] 
int spiMem_cmd_K(char *str);

//-----  L(文字)表示コマンド  L[code] (文字コード)
void spiMem_cmd_L(char *str);

/****   End of File   *****/


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


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


一太郎ビュアー 自撮り棒 カラー文字表示(OLED)