-----------------acm1602-------------------------------------------------------------------------------https://mctouringadv.net/20200823/arduino11/ にピン番号詳しい
nanoではコントラスうまくいかん
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
; ファイル名 : LCD.asm
.include "m88def.inc"
.def R_TEMP0 = R2
.def STACK = R16
.def R_FLAG1 = R17 ; 割込状態他
.def R_TMR0 = R18 ; タイマ0カウント領域(10mS単位)
.def R_TMR2 = R19 ; タイマ2カウント領域(0.1mS単位)
.def R_TEMP1 = R20
.def R_TEMP2 = R21
.def R_TEMP3 = R22
.def R_TEMP4 = R23
.def R_TEMP5 = R24
;---- R_FLAG1 ----(割込状態他)
.EQU B_IOVF0 = 0 ; タイマ0オーバーフロー
.EQU B_IOVF1 = 1 ; タイマ1オーバーフロー
.EQU B_IOVF2 = 2 ; タイマ2オーバーフロー
.EQU B_INT0 = 3 ; 手動スイッチ押下割込み
;---- PORT ----
.EQU P_LCD = PORTD ; LCD
;.EQU P_SW0 = PINC ; SW0
;---- 入出力ビット -------------
.EQU B_LCD_RS = 4
.EQU B_LCD_E = 5
.EQU B_SDC_CS = 2
; 割り込みベクタ定義
.CSEG ; コードセグメント
RJMP MAIN ; リセット
.ORG $0009
RJMP IOVF2 ; タイマ2
.ORG $0010
RJMP IOVF0 ; タイマ0
;*******************************************************************************
; 割込みルーチン
;*******************************************************************************
;*******************************************************************************
;***************************************
; タイマ2(0.1mS単位)
;***************************************
IOVF2:
IN STACK,SREG ; PUSH SREG
DEC R_TMR2
BRNE IOVF2_1
SBR R_FLAG1,(1<<B_IOVF2)
RJMP IOVF2_9
IOVF2_1:
LDI R_TEMP1, 0x9C ; 割込時間0.1mSを再セット
STS TCNT2, R_TEMP1
IOVF2_9:
OUT SREG,STACK ; POP SREG
RETI
;***************************************
; タイマ0 (10mS単位)
;***************************************
IOVF0:
IN STACK,SREG ; PUSH SREG
DEC R_TMR0
BRNE IOVF0_1
SBR R_FLAG1,(1<<B_IOVF0)
RJMP IOVF0_9
IOVF0_1:
LDI R_TEMP1, 0xD9 ; 割込時間10mSを再セット
OUT TCNT0, R_TEMP1
IOVF0_9:
OUT SREG,STACK ; POP SREG
RETI
;*******************************************************************************
; サブルーチン
;*******************************************************************************
;*****************************
; タイマ2 (0.1mSタイマ) SUBROUTINE
;*****************************
STMR2:
;---- タイマ2 割込み許可 ----
LDS R_TEMP1,TIMSK2 ; タイマ割込許可
SBR R_TEMP1,(1<<TOIE2)
STS TIMSK2,R_TEMP1
;---- タイマ2 開始----
CBR R_FLAG1,(1<<B_IOVF2) ; タイマ2オーバーフローフラグクリア
LDI R_TEMP1, 0x9C ; 割込時間0.1mS
STS TCNT2, R_TEMP1
LDI R_TEMP1, 0x01 ; プリスケーラ 1
STS TCCR2B, R_TEMP1
STMR2_1:
SBRS R_FLAG1,B_IOVF2 ; タイマ0カウント完了判定
RJMP STMR2_1 ; カウント中
;---- タイマ 停止 ----
LDI R_TEMP1, 0x00
STS TCCR2B, R_TEMP1
;---- タイマ2 割込み禁止 ----
LDS R_TEMP1,TIMSK2
CBR R_TEMP1,(1<<TOIE2)
STS TIMSK2,R_TEMP1
RET
;*****************************
; タイマ0 (10mSタイマ) SUBROUTINE
;*****************************
STMR0:
;---- タイマ0 割込み許可 ----
LDS R_TEMP1,TIMSK0 ; タイマ割込許可
SBR R_TEMP1,(1<<TOIE0)
STS TIMSK0,R_TEMP1
;---- タイマ0 開始----
CBR R_FLAG1,(1<<B_IOVF0) ; タイマ0オーバーフローフラグクリア
LDI R_TEMP1, 0xD9 ; 割込時間10mS
OUT TCNT0, R_TEMP1
LDI R_TEMP1, 0x04 ; プリスケーラ 256
OUT TCCR0B, R_TEMP1
STMR0_1:
SBRS R_FLAG1,B_IOVF0 ; タイマ0カウント完了判定
RJMP STMR0_1 ; カウント中
;---- タイマ 停止 ----
LDI R_TEMP1, 0x00
OUT TCCR0B, R_TEMP1
;---- タイマ0 割込み禁止 ----
LDS R_TEMP1,TIMSK0
CBR R_TEMP1,(1<<TOIE0)
STS TIMSK0,R_TEMP1
RET
;*****************************
; USART 送信
;*****************************
;UARTS:
; LDS R_TEMP0,UCSR0A
; SBRS R_TEMP0,UDRE0
; RJMP UARTS
; STS UDR0,R_TEMP3
; RET
;*****************************
; LCD WAIT処理
;*****************************
LCDW:
CBI PORTC,B_LCD_E
;---- タイマー(1mS)セット ----
LDI R_TMR2,0x0A ; 1mSでフラグセット
RCALL STMR2
SBI PORTC,B_LCD_E
;---- タイマー(1mS)セット ----
LDI R_TMR2,0x0A ; 1mSでフラグセット
RCALL STMR2
RET
;*****************************
; LCD 表示処理
;*****************************
;*************************************************
; 引数で渡されたキャラクタを表示する
; 引数 R_TEMP3 キャラクタフォント
;*************************************************
LCDP:
OUT P_LCD,R_TEMP3
RCALL LCDW
SWAP R_TEMP3
OUT P_LCD,R_TEMP3
RCALL LCDW
RET
;*****************************
; LCD 初期化処理
;*****************************
LCDI:;■■■■ ファンクションセット ■■■■
;********* 初期セットモードへの移行 ******************************
NOP
CBI PORTC,B_LCD_RS
NOP
LDI R_TEMP1,0b00110000
OUT P_LCD,R_TEMP1
RCALL LCDW
;---- タイマー(10mS)セット ----
LDI R_TMR2,0x64 ; 10mSでフラグセット
RCALL STMR2
LDI R_TEMP1,0b00110000
OUT P_LCD,R_TEMP1
RCALL LCDW
;---- タイマー(1mS)セット ----
LDI R_TMR2,0x0A ; 1mSでフラグセット
RCALL STMR2
LDI R_TEMP1,0b00110000
OUT P_LCD,R_TEMP1
RCALL LCDW
;********* 各種設定 ******************************
;---- 4bit-mode セット ----
LDI R_TEMP1,0b00100000
OUT P_LCD,R_TEMP1
RCALL LCDW
;---- 2-line,5x8dot-font セット ----
LDI R_TEMP3,0b00101000
RCALL LCDP
;---- display off セット ----
LDI R_TEMP3,0b00001000
RCALL LCDP
;---- display クリア ----
LDI R_TEMP3,0b00000001
RCALL LCDP
;---- entry-mode セット ----
LDI R_TEMP3,0b00000110
RCALL LCDP
;---- display on セット ----
LDI R_TEMP3,0b00001100
RCALL LCDP
SBI PORTC,B_LCD_RS
RET
;*************************************************
; LCD 起動表示
;*************************************************
LCDS:
;---- リターンホーム ----
CBI PORTC,B_LCD_RS
LDI R_TEMP3,0b00000010
RCALL LCDP
SBI PORTC,B_LCD_RS
;---- display クリア ----
CBI PORTC,B_LCD_RS
LDI R_TEMP3,0b00000001
RCALL LCDP
SBI PORTC,B_LCD_RS
;---- 1行目表示 ----
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'W'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
LDI R_TEMP3,'L'
RCALL LCDP
LDI R_TEMP3,'C'
RCALL LCDP
LDI R_TEMP3,'O'
RCALL LCDP
LDI R_TEMP3,'M'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'T'
RCALL LCDP
LDI R_TEMP3,'O'
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'T'
RCALL LCDP
LDI R_TEMP3,'H'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
;---- 2行目先頭へ ----
CBI PORTC,B_LCD_RS
LDI R_TEMP3,0b11000000
RCALL LCDP
SBI PORTC,B_LCD_RS
;---- 2行目表示 ----
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'L'
RCALL LCDP
LDI R_TEMP3,'C'
RCALL LCDP
LDI R_TEMP3,'D'
RCALL LCDP
LDI R_TEMP3,' '
RCALL LCDP
LDI R_TEMP3,'S'
RCALL LCDP
LDI R_TEMP3,'A'
RCALL LCDP
LDI R_TEMP3,'M'
RCALL LCDP
LDI R_TEMP3,'P'
RCALL LCDP
LDI R_TEMP3,'L'
RCALL LCDP
LDI R_TEMP3,'E'
RCALL LCDP
RET
;*************************************************
; LCD 動作表示
;*************************************************
;LCDM:
;---- リターンホーム ----
; CBI PORTC,B_LCD_RS
; LDI R_TEMP3,0b00000010
; RCALL LCDP
; SBI PORTC,B_LCD_RS
;---- display クリア ----
; CBI PORTC,B_LCD_RS
; LDI R_TEMP3,0b00000001
; RCALL LCDP
; SBI PORTC,B_LCD_RS
;---- 1行目表示 ----
; LDI R_TEMP3,'R'
; RCALL LCDP
; LDI R_TEMP3,'='
; RCALL LCDP
;---- 2行目先頭へ ----
; CBI PORTC,B_LCD_RS
; LDI R_TEMP3,0b11000000
; RCALL LCDP
; SBI PORTC,B_LCD_RS
;---- 2行目表示 ----
; LDI R_TEMP3,'S'
; RCALL LCDP
; LDI R_TEMP3,'='
; RCALL LCDP
; RET
;*****************************
; メインルーチン(MAIN)
;*****************************
MAIN:
CLI ; 全割込み禁止
;---- PORT 設定 ----
;LDI R_TEMP1,0b11111111
;LDI R_TEMP2,0b00000000
;OUT DDRB,R_TEMP1
;OUT PORTB,R_TEMP2
LDI R_TEMP1,0b11110000
LDI R_TEMP2,0b00101111
OUT DDRC,R_TEMP1
OUT PORTC,R_TEMP2
LDI R_TEMP1,0b11111111
LDI R_TEMP2,0b00000000
OUT DDRD,R_TEMP1
OUT PORTD,R_TEMP2
;---- USART 設定 ----
;LDI R_TEMP1,25
;STS UBRR0L,R_TEMP1
;LDI R_TEMP1,0
;STS UBRR0H,R_TEMP1 ; ボーレート2400
;LDS R_TEMP1,UCSR0C
;SBR R_TEMP1,((1<<UCSZ01)+(1<<UCSZ00)) ; ノンパリティ/1ストップビット/8ビット長
;STS UCSR0C,R_TEMP1
;LDS R_TEMP1,UCSR0B
;SBR R_TEMP1,((1<<RXEN0)+(1<<TXEN0)) ; 送受信イネーブル
;STS UCSR0B,R_TEMP1
;---- フラグ・ワークレジスタ 初期化 ----
LDI R_FLAG1, 0x00
SEI ; 全割込み許可
;---- LCD(液晶パネル) 初期化 ----------------------
RCALL LCDI
;---- LCD(液晶パネル) 起動表示 ----------------------
RCALL LCDS
;---- タイマ(2秒) ----
;LDI R_TMR0,0xC8
;RCALL STMR0
;---- LCD(液晶パネル) 動作表示 ----------------------
;RCALL LCDM
;---- LCD 文字初期表示位置設定 ----------------------
;LDI R_TEMP4,0x82
MAIN01:
;---- 1文字受信 ----
;LDS R_TEMP1,UCSR0A
;SBRS R_TEMP1,RXC0
;RJMP MAIN01 ; 受信バッファが空
;LDS R_TEMP5,UDR0
;---- LCD 文字表示位置 最終桁+1判定 ----------------------
CPI R_TEMP4,0x90
BREQ MAIN10 ; 最終桁+1である
MAIN02:
;---- LCD 受信文字表示位置設定 ----------------------
;CBI PORTC,B_LCD_RS
;MOV R_TEMP3,R_TEMP4
;RCALL LCDP
;SBI PORTC,B_LCD_RS
;---- LCD(液晶パネル) 受信文字表示 ----------------------
;MOV R_TEMP3,R_TEMP5
;RCALL LCDP
;---- LCD 送信文字表示位置設定 ----------------------
;CBI PORTC,B_LCD_RS
;MOV R_TEMP3,R_TEMP4
;LDI R_TEMP1,0x40
;ADD R_TEMP3,R_TEMP1
;RCALL LCDP
;SBI PORTC,B_LCD_RS
;---- 受信文字 判定 ----------------------
;CPI R_TEMP5,'T'
;BRNE MAIN20 ; 受信文字が'T'でない
;IN R_TEMP3,P_SW0 ; 受信文字が'T'である
;ANDI R_TEMP3,0x0F ; 不要ビットマスキング
;LDI R_TEMP1,0x0F
;EOR R_TEMP3,R_TEMP1 ; リアルコード→コンプリメンタリコード変換
;LDI R_TEMP1,0x30
;ADD R_TEMP3,R_TEMP1
MAIN03:
;---- 1文字送信 ----
;RCALL UARTS ; パソコン転送
;---- LCD(液晶パネル) 送信文字表示 ----------------------
;RCALL LCDP
;INC R_TEMP4
;RJMP MAIN01
MAIN10:
;---- LCD(液晶パネル) 動作表示 ----------------------
;RCALL LCDM
;---- LCD 文字初期表示位置設定 ----------------------
LDI R_TEMP4,0x82
RJMP MAIN02
MAIN20:
;LDI R_TEMP3,'X'
RJMP MAIN03
0 件のコメント:
コメントを投稿