2024年3月20日水曜日

ACM1602/SD1602 ASM 表示のみ

 -----------------acm1602-------------------------------------------------------------------------------https://mctouringadv.net/20200823/arduino11/ にピン番号詳しい

nanoではコントラスうまくいかん

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー


向かって右より 15に100Ω経由で5V、16はGND、これらはバックライト
1:VSSはGND,2:VDDは5V、3:VEEはPOTENTIOMETERでコントラスト,
4:RS,5:RWはGND,6:E、14~11がPD7~4につながる(出力オンリーなのでRWはGND)
15、16、1、2,3,4、5、6、7,8、9、10、11、12,13、14

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

; ファイル名 : 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 件のコメント:

コメントを投稿