PIC18F46K22でI2C液晶(AQM0802A-RN-GW)に文字を表示(アセンブラ)

icon 項目のみ表示/展開表示の切り替え

概要

PIC18F46K22のI2Cモジュール1にI2Cキャラクタ液晶モジュール(8桁*2行)AQM0802A-RN-GBWを接続し文字の表示とコントラストの調整を実施するサンプルである。
電源はUSBから供給するので5Vである。液晶モジュールは標準電圧が3.3Vなので他の3.3V系のI2Cデバイスも接続できるように3.3V電源回路とレベル変換回路を設けた。液晶モジュール自体の最大定格は5V以上あるため、5Vを直接接続できるのではないかと思うが、試していない。
コントラスト調整は、lcd_contサブルーチンで制御できる。
本サンプルではAQM0802 PIC18を表示する。
秋月電子 PIC18F46K22使用 マイコンボードをベースとし半田付けされている水晶20MHzをH8/3048ボードの16MHzと交換し64MHzで動作可能とした。このボードはICSP端子を備えておりPICKIT 3で書き込みができ、電源はミニUSBで供給可能である。またユニバーサル基板になっているので簡単に回路を追加することができる。
ちなみに水晶が20MHzの場合は、動作が遅くなるだけである。
回路はPIC18F46K22でI2C液晶(AQM0802A-RN-GW)に文字を表示(C言語)と同一である。

プログラムの説明

ソースファイル

以下のファイルで構成されている
lcd1a.asm ・・・ メインプログラム
i2c.asm ・・・ i2cサポートライブラリ Version 1.00
i2c.inc ・・・ i2cサポートライブラリ Version 1.00
i2clcd.asm ・・・ lcdサポートライブラリ Version 1.00
i2clcd.inc ・・・ lcdサポートライブラリ Version 1.00

ソースファイルのダウンロード lcd1a.zip

i2c.asm

PIC内蔵のI2Cモジュールを使用したI2Cの基本的なプロトコルをサポート スタート・ストップ・リスタート・1byte書き込み・1byte読み込みをサブルーチン化している。 詳細は以下のリンクを参照されたい
i2c.asm

i2clcda.asm

AQM0802を制御するライブラリである。
初期化、コントラスト制御、文字列出力をサポートしている。
詳細は以下のリンクを参照されたい
i2clcd.asm

lcd1a.asm

メインルーチンである。
; I2C接続液晶 AQUM0802A-RN-GBWの表示サンプル Version 1.00  2014/02/23
; 慈渓博瑞テクノロジー株式会社 PIC18F46K22 マイコンキット Ver2013.12.08用
;   http://akizukidenshi.com/catalog/g/gK-07231/
;   水晶は16MHzに交換してPICを64MHzで駆動
; MPLAB X IDE v1.85 Microchip MPASM(v5.51)
; PicKit 3
; 表示例
;   AQUM0802A
;   PIC18
; 使用端子
;   SCK1(RC3),SDA1(RC4)

        #INCLUDE <p18f46k22.inc>
        #INCLUDE "i2c.inc"
        #INCLUDE "i2clcd.inc"

        ; 水晶発振(16MHz) クロック分周無 PLL有効(*4) プライマリクロック有効  ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
        CONFIG FOSC = HSHP,PLLCFG=ON,PRICLKEN=ON,WDTEN=OFF,LVP=OFF

bank0       UDATA   ; 変数の定義 バンク0
temp1    RES     1
temp2    RES     1
Tcount1  RES     1
Tcount2  RES     1
lcd_buf  RES    20

    GLOBAL  temp1,temp2,Tcount1,Tcount2

; プログラムメモリのアドレスadsをTBLPTRレジスタに設定

LDTBLPTR MACRO   ads
        movlw   UPPER ads
        movwf   TBLPTRU
        movlw   HIGH ads
        movwf   TBLPTRH
        movlw   LOW ads
        movwf   TBLPTRL
        ENDM

        CODE
        ORG 0
        goto   start    ;   リセット時

start
        movlb   d'15'

;       i2cで使用する端子をIOに変更
        movlw   b'11100111'
        movwf   ANSELC,BANKED

        LDTBLPTR msg
        lfsr    FSR0,lcd_buf

;       プログラムメモリからRAMへ文字列を転送
loop1
        tblrd   *+          ;   プログラムメモリTBLPTRから読み出し後TBLPTRを+1する
        movf    TABLAT,W
        movwf   POSTINC0
        bnz     loop1
;       i2c初期化
        movlw   b'00101000' ; SSPモジュールon,I2Cマスターモード(FOSC/4)
        movwf   SSP1CON1
        clrf    SSP1CON2
        clrf    SSP1CON3
        movlw   d'39'    ; 約400kbps
        movwf   SSP1ADD
        clrf    SSP1STAT
;       液晶初期化
        movlw   d'3' ;  200ms/64Mhz/16/256/256=13
        call    delay1024kc

        call    lcd_init    ;   液晶初期化

        lfsr    1,lcd_buf
        call    lcd_puts    ;   文字列表示

        goto    $

msg     ;   表示される文字列 改行コード0ah 文字終了は0
        DB      "AQM0802",00ah,"PIC18",0

        END