Vol.903 27.Sep.2024

ショートカットキーをカスタマイズ PICミニBB(13)_SPI接続RAM Windowsのサインイン

K 一太郎・Wordでショートカットキーをカスタマイズ

by fjk

 キーボードからの入力時にショートカットきーは便利ですが、使いたい機能が無い場合も多い。この様な時、ショートカットキーのカスタマイズができます

【ワード】「ショートカットキーをカスタマイズする」(microsoft)
@ [ファイル > オプション] > [リボンのユーザ設定] に移動。
A [リボンとキーボード ショートカットのカスタマイズ ] ウィンドウの下部にある [ユーザー設定] を選択。
B [保存先] ボックスで、キーボード ショートカットの変更を保存する現在のドキュメント名またはテンプレートを選択。
C [分類] ボックスで、キーボード ショートカットを割り当てるコマンドまたはその他の項目を含むカテゴリを選択するか、キーボード ショートカットを削除。
D [コマンド] ボックスで、キーボード ショートカットを割り当てるコマンドまたはその他の項目の名前を選択するか、キーボード ショートカットを削除。
 そのコマンドまたは他の項目に現在割り当てられているショートカット キーが [現在のキー] ボックス (または [現在の割り当て] ラベルのボックスの下) に表示される
E キーボード ショートカットを割り当てるには、次の操作を行います。
 ショートカット キーは、Ctrl キーまたはファンクション キーで始めます。
  • [割り当てるキーを押してください] ボックスで、割り当てるキーの組み合わせを押します。 たとえば、Ctrl キーと使用するキーを同時に押します。
  • [現在の割り当て] (または [現在の割り当て]) を調べ、キーの組み合わせがコマンドまたは他の項目に割り当て済みかどうか確認し、 割り当て済みの場合、別の組み合わせを選択。
  • [割り当て] を選択。


【一太郎】「ショートカットキーでコマンドが実行できるようにする
@[ツール-割付-キー]を選択します。
 [キーの割付]ダイアログボックスが表示されます。
A[割付先キー]から割付先にしたいキーを選択します。
B[一覧]のシステムマクロのフォルダをダブルクリックします。
 登録済みマクロの一覧を表示します。
C 割り付けたいマクロを選択し、[割付]をクリックします。
 選択したマクロが、[割付先キー]に割り付けられて表示される。
D[OK]をクリックします。
 マクロのショートカットキーへの割り付けが完了します。


P PICミニBBシリーズ(13)  〜SPI接続RAM(23LCV1024)

by fjk

 PICで使えるメモリを増やす方法をabc899(i2c-24FC1025)やabc902(spi-25LC1024)で紹介したが、汎用で使用できるSPI接続外付けRAMである23LCV1024を使ってみた。
 23LCV1024はRAMなので電源供給がなくなると記憶は無くなる(VBAT端子を使えばバッテリーバックアップ可能)が、書込動作は速くなる(delay不要)。
 23LCV1024は2本のSPI信号線を使ってデータを高速転送するSDIモードもあるが、PIC16F18326が対応していないので未使用 (参考:23LC512[SPI/SDI/SQI] )。


23LCV1024の命令

PIN配置

読込・書込シーケンス波形


モードレジスタ

【ハードウェア】
 abc902のBBボードセットを使用し、RAMを追加。(VBAT端子はGndに)。
 CS0(RA0):ROM、CS1(RA1):RAM、gCS(RA2):gLCD


メモリBB配線図

全体回路図

【ソフトウェア】

・abc902をベースに、アドレスが0〜7FFFFHまでをROM、80000H以上をRAMとし、アドレスによってROMとRAMのアクセスを切り替えている。
・ROMである25LC1024は書込解除命令が必要だったが、23LCV1024のRAMには必要ない。
・RAMのアクセスモードは3種類あるが、デフォルトでは全アドレスにアクセスできるシーケンシャルモードなので、その状態のまま利用。
・ターミナル制御コマンドはabc902と同じだが、ROMとRAMの両方を使うので、関数名をRomからMemに変更

ターミナル画面例

spi-ROM/RAM読み書きテスト中

※ 全てのパターンのテストが完全に終わっていないので、バグがあるかも知れません(謝)。

【abc903-18326.cファイル】 abc903-18326.c(zip)

/*******************************(abc903-18326)*********
 * SPI接続メモリ(24LC1024/23LCV1024) with AQM1248A  
 ******************************************************/
#include "mcc_generated_files/mcc.h"
#include "myProject.h"
#include "AQM1248A_m2.h"
#include "spi_Mem2.h"

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

//---- ターミナルにプロンプト文字表示
void prtPrompt(uint8_t m){
    if(m)  printf("# ");            // 連続書込モード中
    else   printf("$ ");            // 通常書込モード
}

/*-----------------------------------
 *        Main application
 ------------------------------------*/
void main(void){
    uint8_t cmd;
    SYSTEM_Initialize();
    SSP1CON1bits.SSPEN = 1;         //SPI1を有効に// 黒ベタは0xFF
    puts("Ready\r");                // 動作確認用
    gLCD_strX(0,0,"Ready");
    prtPrompt(spiMem_SqMode());
    
    while (1){
        if(SFlg){
            gLCD_clr(0);            // グラフィック画面消去
            gLCD_strX(0,0,RBuf);    // LCDにコマンド表示
            cmd = RBuf[0];          // コマンドは第1文字
            #ifndef VBA
                printf("\n\r");
            #endif
            switch(cmd) {           // 各コマンドの実行
                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;
                                    // 有効なコマンドがなく
                default:  if(spiMem_SqMode()){
                            spiMem_cmd_WSQ(RBuf);
                          }         // 連続書込モード中なら
                          break;    // 書込シーケンスを実行
            }
            SFlg = 0;
            #ifndef VBA
                prtPrompt(spiMem_SqMode());
            #endif
        }
        IO_RA4_Toggle();
        __delay_ms(500);
    }
}

 
【myProject.hファイル】 myProject.h(zip)

/**************************(myProject.h)***
 *   プロジェクト個別条件指定ファイル     *
 *   (main.cと同じフォルダーに作成)     *
 ******************************************/
#include "mcc_generated_files/mcc.h"
#include "i2cLCDST7032i.h"

#define  ON    1
#define  OFF   0

/***** 使用電源電圧 ***********************/
//--- VCC宣言無しは5V(VCC=50と同じ)
#define VCC   50                // 電源電圧は5V
//#define VCC   33                // 電源電圧は3.3V

/***** EUSARTモジュール *******************/
#define BFSIZE  80
//--- ECHO宣言はどちらかを必ず行うこと
#define ECHO  ON                // エコー有り
//#define ECHO  OFF               // エコー無し

//define VBA                    // Excel_VBAを使用

/***** MSSPモジュール *********************/
#define MASTER 1
#define SRAVE  2
//#define I2CMODE MASTER        // マスターとして使用
//#define I2CMODE SRAVE         // スレーブとして使用
//--- MSSPが一つしか無い場合は I2C宣言無し
//#define I2C  1                // I2C1を使用
//#define I2C  2                // I2C2を使用

#if I2CMODE == MASTER
    #if I2C == 1
        #include "mcc_generated_files/examples/i2c1_master_example.h"
    #elif I2C == 2
        #include "mcc_generated_files/examples/i2c2_master_example.h"
    #else
        #include "mcc_generated_files/examples/i2c_master_example.h"
    #endif
  //  #define I2CLCD_Adr 0x3c // LCDのI2Cアドレス(i2cLCD_ST7032i.hで設定)
#endif

//--- SPIが一つしか無い場合は宣言しない
#define SPIMODE MASTER          // マスターとして使用
//#define SPIMODE SRAVE           // スレーブとして使用

#define SPI  1              // SPI1を使用
//#define SPI  2              // SPI2を使用

 
【spi_Mem.hファイル】 spi_Mem.c/h(zip)

/******************************(spi_Mem2.h)***************
 *	SPI接続メモリ(25LC1024/23LCV1024)ヘッダーファイル
 ***********************************************************/
#include "AQM1248A_m2.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

//-----  アドレスadrから、1バイトを読み出す
uint8_t SPI_Mem_Read(uint32_t adr);

//-----  アドレスadrに、1バイトdtを書き込む
uint8_t SPI_Mem_Write(uint32_t adr, uint8_t dat);

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

//-----  アドレスadrからary[]のnバイトを書き込む
void SPI_Mem_NWrite(uint32_t adr,uint8_t *ary,uint16_t cnt);

//----- 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();
【spi_Mem.cファイル】(一部、主にabc902からの変更部)

/******************************(spi_Mem.c)***************
 *  SPI接続メモリ(25LC1024/23LCV1024)読み書きライブラリ
 ********************************************************/

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

#define MBFSIZE	78                  // メモリ操作用バッファーサイズ

//=== グローバル変数 ============
char     Dlm[] = ",";               // 文字列区切りデリミタ
char     SBuf[20];                  // 文字列処理用バッファー

//--- SPIメモリー用
static uint32_t CrtAdr = 0;         // カレントアドレス
static uint8_t  DBuf[MBFSIZE];      // ページメモリ用バッファ
static uint8_t  SqMode = 0;         // シーケンスモードフラグ
static char     lstCmd;             // 最終コマンド
static uint8_t  spiRom = 1;         // spiRomかどうか

/*************************************
 *  SPI Mem function
 **************************************/

//---- ROMステータスの読み出し
uint8_t SPI_Rom_RdStat(){           // ROMのみ使用
    uint8_t stat;
    CS0_SetLow();
    SPI1_ExchangeByte(SPIROM_RD_STATS);
    stat = SPI1_ExchangeByte(0xAA); // 0xAAはダミー
    CS0_SetHigh();
    return stat;
}

//---- コマンドと24ビットアドレスを送信 
void sendAdr(uint8_t cmd, uint32_t adr){
    if(spiRom) CS0_SetLow();        // spiRom(25LC1024)選択
    else       CS1_SetLow();        // spiRam(23LCV1024)選択
    SPI1_ExchangeByte(cmd);         // send Command
    SPI1_ExchangeByte((uint8_t)(adr>>16));
    SPI1_ExchangeByte((uint8_t)(adr>>8));
    SPI1_ExchangeByte((uint8_t)adr);
} 

//-----  アドレスadrから、1バイトを読み出す
uint8_t SPI_Mem_Read(uint32_t adr){
    uint8_t dat;
    if(adr < 0x80000) spiRom = 1;   // spiRom(25LC1024)指定
    else              spiRom = 0;   // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_READcmd,adr);    // send Read_CMD & Address
    dat = SPI1_ExchangeByte(0xAA);  // 0xAAはダミー
    if(spiRom) CS0_SetHigh();       // spiRomの場合の読込終了
    else       CS1_SetHigh();       // spiRamの場合の読込終了
    return dat;
}

//-----  アドレスadrに、1バイトdtを書き込む
uint8_t SPI_Mem_Write(uint32_t adr, uint8_t dat){
    if(adr < 0x80000){
        spiRom = 1;                 // spiRom(25LC1024)指定
        CS0_SetLow();
        SPI1_ExchangeByte(SPIROM_WR_ENABL); // Set Write EnableBit
        CS0_SetHigh();
    }else              spiRom = 0;  // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_WRITEcmd,adr);   // send Write_CMD & Address
    SPI1_ExchangeByte(dat);         // adrにdatを書き込む
    if(spiRom){
        CS0_SetHigh();              // spiRomの場合の書込終了
        __delay_ms(6);
    }else{
        CS1_SetHigh();              // spiRamの場合の書込終了
    }
    return dat;
}

//-----  アドレスadrからnバイトをary[]に読み出す
void SPI_Mem_NRead(uint32_t adr,uint8_t *ary,uint16_t cnt){
    if(adr < 0x80000) spiRom = 1;   // spiRom(25LC1024)指定
    else              spiRom = 0;   // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_READcmd,adr);    // send Read_CMD & Address
//	SPI1_ExchangeBlock(ary,cnt);
    SPI1_ReadBlock(ary,cnt);        // block read
    if(spiRom){
        CS0_SetHigh();
        while(SPI_Rom_RdStat() & 1);
    }else{
        CS1_SetHigh();
    }
}

//-----  アドレスadrからary[]のnバイトを書き込む
void SPI_Mem_NWrite(uint32_t adr,uint8_t *ary,uint16_t cnt){
    if(adr < 0x80000){
        spiRom = 1;                 // spiRom(25LC1024)指定
        CS0_SetLow();
        SPI1_ExchangeByte(SPIROM_WR_ENABL); // Set Write Enable Bit
        CS0_SetHigh();
    }else{ spiRom = 0;	}           // spiRam(23LCV1024)指定
    sendAdr(SPIMEM_WRITEcmd,adr);   // send Write_CMD & Address
//	SPI1_ExchangeBlock(ary,cnt);    // block write
    SPI1_WriteBlock(ary,cnt);       //  block write
    if(spiRom){
        CS0_SetHigh();
        while(SPI_Rom_RdStat() & 1);
    }else{
        CS1_SetHigh();
    }
}

//	・・・以下略 (abc902参照) ・・・
【AQM1248A_m2cファイル】 AQM1248A_m2.c/h & Font_5x7(zip) (abc902)
グラフィックLCD表示とフォントファイル
【EUSART】   EUSARTの設定 (abc900)
USBシリアル通信の設定
【PICライブラリ】 ライブラリの使い方 (abc840)
使用するライブラリの追加など
【MCCの設定】  MCC設定例 (abc895)
MCCでSPIを使う場合(一部のピン設定は変更すること)

==========【おまけ】(外付けRAM応用例)==========

  • 折角、PIC外部に大容量RAMメモリを備えたので、vRamを外部メモリとし、CPUを16F18325(ROM:8k、RAM:1k)に交換した。
    <18325メモリ使用量> (左:VBA宣言無し、 右:VBA宣言時)
       
  • ページデータバッファサイズ(MBFSIZE)を130バイトに増やした。(9/30)
  • 半角(8x16ドット、16バイト)、全角(16x16ドット、32バイト)の漢字を表示する「Kコマンド」を追加した。
    表示する漢字はページバッファー内のデータで、Hを付けると半角8文字表示、Hを省略すると全角4文字表示となる。
     (書式)K[H]    (9/30:コマンド・表示方法変更
    ※ページ内データの確認は、P(ページ)コマンド。
     ページバッファーへの書込はSコマンド、または、Wコマンド後U/PRコマンド。
  • EUSARTの受信バッファー数を120バイトにmyProject.h内で変更(32バイト16進データを受信するため)。
  • メイン・ヘッダー: abc903-18325.c & myProject.h(zip)
  • SPI接続メモリ:  spi_Mem2.c/h(zip)  (Sコマンドにバグ有り:10/4、再修正済み
  • グラフィックLCD: AQM1248A_v2.c/h(zip)

漢字表示テスト画面例(漢字表示位置は固定)

テラターム画面例(W/Sコマンドで事前に書込後)
VBAモード(改行がLF)でコンパイルした場合、テラタームで接続するには、「設定/端末」で、改行コードの受信を「AUTO」にすること。

テラタームの設定例(VBAモードでコンパイルした時)
注)通信を開始した時に、最初の受信データが正しくないことがあります。この場合、Rコマンドを何度か送ると正常になります。


W Windowsのサインイン  〜HelloのPIN設定

by fjk

 windows10/11でサインインするには、Microsoftアカウントとローカルアカウント(そのPCのみに使える)があり、どのアカウントを使うかは、「Windowsの設定/アカウント/ユーザーの情報」で確認・変更が可能です。
 マイクロソフトではMicrosoftアカウントを使ったWIndowsHelloの暗証番号(PIN)入力が最も勧められている。WindowsストアやOneDrive、OutLookのサービスはMicrosoftアカウントがあれば、とりあえず使用可能だが、アプリでこのPIN番号が要求される場合もあるので設定しておいた方が良い。

<support.microsoftより>
PIN は、ユーザー定義の数字のセット、または数字と文字の組み合わせです。これにより、パスワードではなく Windows デバイスにサインインできます。
PIN はデバイスに安全に保存され、どこにも送信されません。また、サーバーには保存されません。 これにより、従来のパスワードよりも安全になります。
PIN を変更する場合、または PIN をリセットする必要がある場合は、さまざまなオプションがあります。
 
・サインインしていないときに PIN をリセットする
PIN を忘れてリセットする必要がある場合は、Windows サインイン画面からリセットできます。 [PIN] テキスト ボックスの下を確認します。
[PINを忘れた場合は] を選択し、指示に従って PIN をリセットします。 デバイスに複数のアカウントがある場合は、リセットする必要があるアカウントを選択します。 このオプションは、ローカル アカウントではなく、Microsoft アカウントでのみ使用できます
[PIN を忘れた] 場合は、パスワードでサインインし、設定アプリから PIN をリセットする必要があります。 [サインイン オプション] を選択し、[パスワードの入力] を選択します
 
・既にサインインしているときに PIN を変更またはリセットする
設定アプリを使用して PIN を変更できます。
[Windows] デバイスの [設定] アプリ で、[ アカウント ] > [サインイン オプション ] を選択する。
[ PIN (Windows Hello)] > [PIN の 変更] を 選択し、指示に従います。 新しい PIN に変更するには、古い PIN を入力する必要があります
PIN を忘れた場合は、[ PIN を忘れた 場合] を選択し、指示に従ってアカウントを確認し、新しい PIN を作成します
 
注: デバイスへのアクセスに使用する PIN は、Microsoft アカウントのパスワードとは異なります。
 
なお、PIN登録しても、ログイン時はどちらのアカウントでも選択してログインできます。


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


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


ショートカットキーをカスタマイズ PICミニBB(13)_SPI接続RAM Windowsのサインイン