本文へジャンプ 2010年6月13日  

アセンブラプログラム
  1>キャラクタ文字の表示

  2>LED点灯 (タイマープログラム)
  3>引き算、足し算、割り算、掛け算
  4>パルス幅測定

キャラクタLCD SG2004 を使用する
(SG1602と互換があるが、電源とGNDが逆なので回路は注意する)

アセンブラ言語で書かれたサンプルが少ないので、表示させるのに苦労した。
計算方法は、サンプルが見つからなかったので、独自にプログラムを作った。
カウンタ表示など、もっと別な方法があると思うが安易に作っている

クロックは 内部クロック 4Mhz

回路図


アセンブラプログラムですべて作成する

LCDの表示

カウンターは5桁 16ビット
計算は5桁  16ビットで行い 5桁表示
@引き算     マイナスはフラグを立てる
A割り算   整数のみとし、余りは削除
B65500(FFFF)以上は FFFFとする

;=============================================================
; タイトル : LCD点灯、計算、パルス測定
;
; 動作クロック : CLOCK=4MHz。内蔵RC発振器を使用
;=============================================================
; インクルード
.include "tn2313def.inc" ;

;=============================================================
; 汎用レジスターに名前を定義(変数定義)
.def wariF = R3 ; 割り込みフラグ
.def AAL = R4 ; dataA-L
.def AAH = R5 ; dataA-H
.def BBL = R6 ; dataB-L
.def BBH = R7 ; dataB-H
.def ASKL = R8 ; ans L
.def ASKH = R9 ; ans H
.def MDdat = R10 ; 掛け算/割り算 8ビット
.def DansL = R11 ; 割り算答え
.def DansH = R12 ; 割り算答え
.def fuF = R13 ; 引き算マイナスフラグ

.def PULSEL = R14 ; パルスデータL
.def PULSEH = R15 ; パルスデータH

.def acc = R16 ; アキュムレーター
.def stack = R17 ; buf1
.def buf = R18 ; buf2
.def w = R19 ; LCD write
.def w4 = R20 ; LCD 4byte write
.def cnt = R21 ; 退避
.def cntr = R22 ; 退避
.def tcount1 = R25 ;表示 1
.def tcount2 = R26 ;表示 10
.def tcount3 = R27 ;表示 100
.def tcount4 = R28 ;表示 1000
.def tcount5 = R29 ;表示 10000
.def RL_buf = R23 ; カウンターL
.def RH_buf = R24 ; カウンターH
.def RcouL = R30 ; カウンターL
.def RcouH = R31 ; カウンターH



.equ lcd_rs =1
.equ lcd_e =4

;----------------------------------------------------------------------------
;マクロアセンブラを使用する
Load immediate word into the register pair
;
; ldiw Z,var

.macro ldiw
ldi @0L,low(@1)
ldi @0H,high(@1)
.endm
;------------------------------
.macro pushZ
push R30
push R31
.endm
;-------------
.macro popZ
pop R31
pop R30
.endm
;=============================================================
; プログラム
;=============================================================
.cseg ; CODE SEGMENT
.org 0 ; ROMアドレス=0
rjmp reset ;各種リセット 下の reset: ラベルへジャンプする
rjmp reset ;ext_int0 ;外部割り込み要求0
rjmp reset ;ext_int1 ;外部割り込み要求1
rjmp ICP_on ;tim1_capt ;タイマ/カウンタ1捕獲(キャプチャ)発生
rjmp reset ;tim1_compa ;タイマ/カウンタ1比較A一致
rjmp tim1_ovf ;tim1_ovf ;タイマ/カウンタ1オーバーフロー
rjmp reset ;tim0_ovf ;タイマ/カウンタ0オーバーフロー
rjmp reset ;usart_rxc ;USART受信完了
rjmp reset ;usart_udre ;USART送信バッファ空き
rjmp reset ;usart_tx ;USART送信完了
rjmp reset ;ana_comp ;アナログ比較器出力遷移
rjmp reset ;pcint ;ピン変化割り込み要求
rjmp reset ;tim1_compb ;タイマ/カウンタ1比較B一致
rjmp reset ;tim0_compa ;タイマ/カウンタ0比較A一致
rjmp reset ;tim0_compb ;タイマ/カウンタ0比較B一致
rjmp reset ;usi_strt ;USI開始条件検出
rjmp reset ;usi_ovf ;USIカウンタオーバーフロー
rjmp reset ;ee_rdy ;EEPROM操作可
rjmp reset ;wdt_ovf ;ウォッチドッグ計時完了

;プログラム本体
.org $100 ;100番地から次のプログラムが始まる(今は意味がない)
reset:
start:
; // PORTB,PORTD 初期化

ldi acc,0xe3 ; 出力データ
out PORTB,acc ; PORTBの11100011に設定
ldi acc,0x1C ; PORTB2,3,4ビット出力
out DDRB,acc ; PORTB入出力方向設定
ldi acc,0x00 ; 出力データ
out PORTD,acc ; PORTDの0000000に設定
ldi acc,0x3F ; PORTD6 in
out DDRD,acc ; PORTD入出力方向設定
;
ldi r16,ramend ;スタックポインタ
out spl,r16
;
; 1=0.25us 2=2uS 4=16uS 5=256uS
;
ldi R16,0x00 ;WGM11=1 ICR1=top
out TCCR1A, r16 ;
ldi R16,1 ;
out TCCR1B, r16 ;クロック分周比1024
ldi r16, 0b0000_1000 ;
out TIMSK, r16 ;ICPで割り込み許可


; // アナログ比較器初期化
sbi ACSR,ACD ; アナログ比較器電源オフ

; // ウォッチドッグ(WD)禁止
wdr ; WDタイマリセット
in acc,MCUSR ; MCUSR値を取得
andi acc,~(1<<WDRF) ; WDRF=0
out MCUSR,acc ; WD RESETフラグ(WDRF)解除
in acc,WDTCSR ; 現WDTCSR値を取得
ori acc,(1<<WDCE)|(1<<WDE)
; WDCE=WDE=1を設定
out WDTCSR,acc ; WDCEとWDEに書き込み
ldi acc,$00 ; WDCE=WDE=0を設定
out WDTCSR,acc ; WD禁止


rcall lcdi ;LCD イニシャル
;-------------- main prog ---------------------------
main:

;----------lcd home------------------------
main_lcd:
cbi portd,lcd_rs ;RS=0 制御
ldi w4,0b00000010 ;リターンホーム
rcall lcdp4
sbi portd,lcd_rs ;RS=1 data
;------------ clr ------------------------
cbi portd,lcd_rs ;RS=0 制御
ldi w4,0b00000001 ;クリア
rcall lcdp4
sbi portd,lcd_rs ;RS=1 data
;-----------------------------------------

 サンプルプログラム

main_sub:

ldi R16,0b10000000
rcall lcd_gyou
ldi zh,high(crta<<1) ;ample 文字
ldi zl,low(crta<<1)
ldi cnt,16 ;16文字表示
rcall buf_lcd ;文字データ 16個

ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtsub<<1) ;ample 文字
ldi zl,low(crtsub<<1)
ldi cnt,16 ;16文字表示
rcall buf_lcd ;文字データ 

;-----引き算 0100-0010 サンプル
ldi r16,0x01 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0x00 ;BBH
ldi r17,0x10 ;BBL
mov BBH,R16
mov BBL,R17
rcall crt_sub_ab

rcall subloop
rcall crt_sub_ask
culc1:
cbi PORTB,3 ; PORTBのbit3--H
rcall t100ms ;wait 100msec
sbi PORTB,3 ;
rcall t100ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc1

;--- 引き算 1000-0101 サンプル
ldi r16,0x10 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0x01 ;BBH
ldi r17,0x01 ;BBL
mov BBH,R16
mov BBL,R17
rcall crt_sub_ab
rcall subloop
rcall crt_sub_ask
culc2:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc2

;--- マイナス引き算 0030-0111 サンプル
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtsubp<<1) ;ample 文字
ldi zl,low(crtsubp<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x00 ;AAH
ldi r17,0x30 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0x01 ;BBH
ldi r17,0x11 ;BBL
mov BBH,R16
mov BBL,R17
rcall crt_sub_ab
rcall subloop
rcall crt_sub_ask
culc3:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc3

;--- マイナス引き算 0010 - 0011 サンプル
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtsubp<<1) ;ample 文字
ldi zl,low(crtsubp<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x00 ;AAH
ldi r17,0x10 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0x00 ;BBH
ldi r17,0x11 ;BBL
mov BBH,R16
mov BBL,R17
rcall crt_sub_ab
rcall subloop
rcall crt_sub_ask
culc4:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc4


;--- 足し算 0100 + 0011 サンプル
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtadd<<1) ;ample 文字
ldi zl,low(crtadd<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x01 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0x00 ;BBH
ldi r17,0x11 ;BBL
mov BBH,R16
mov BBL,R17
rcall crt_sub_ab ;表示 AA,BB
rcall addloop
rcall crt_sub_ask ;表示 ASK
culc5:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc5

;--- 足し算 7100 + 0111 サンプル
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtadd<<1) ;ample 文字
ldi zl,low(crtadd<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x71 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0x01 ;BBH
ldi r17,0x11 ;BBL
mov BBH,R16
mov BBL,R17
rcall crt_sub_ab ;表示 AA,BB
rcall addloop
rcall crt_sub_ask ;表示 ASK
culc6:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc6

;--- 足し算 F100 + 0FFF  サンプル
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtadd<<1) ;ample 文字
ldi zl,low(crtadd<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0xF1 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0x0F ;BBH
ldi r17,0xFF ;BBL
mov BBH,R16
mov BBL,R17
rcall crt_sub_ab ;表示 AA,BB
rcall addloop
rcall crt_sub_ask ;表示 ASK
culc61:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc61


;--- 掛け算 AA 0100 + MDdat 11 サンプル
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtmul<<1) ;ample 文字
ldi zl,low(crtmul<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x01 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0
mov BBH,R16
ldi r16,0x11 ;BBH 0 BBL,MDdat
mov BBL,R16
mov MDdat,R16
rcall crt_sub_ab ;表示 AA,BB(MDdat)
rcall multi
rcall crt_sub_ask ;表示 ASK
culc7:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc7


;--- 掛け算 AA 0100 + MDdat F0 サンプル
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtmul<<1) ;ample 文字
ldi zl,low(crtmul<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x01 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0
mov BBH,R16
ldi r16,0xFF ;BBH 0 BBL,MDdat
mov BBL,R16
mov MDdat,R16
rcall crt_sub_ab ;表示 AA,BB(MDdat)
rcall multi
rcall crt_sub_ask ;表示 ASK
culc71:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc71

;--- 掛け算 AA 1100 + MDdat F0
ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtmul<<1) ;ample 文字
ldi zl,low(crtmul<<1)
ldi cnt,5 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x11 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi r16,0
mov BBH,R16
ldi r16,0xFF ;BBH 0 BBL,MDdat
mov BBL,R16
mov MDdat,R16
rcall crt_sub_ab ;表示 AA,BB(MDdat)
rcall multi
rcall crt_sub_ask ;表示 ASK
culc72:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc72


;--- 割り算 AA 0100 ÷ MDdat 12 = Divans

ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtdiv<<1) ;ample 文字
ldi zl,low(crtdiv<<1)
ldi cnt,16 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x01 ;AAH
ldi r17,0x00 ;AAL
mov AAH,R16
mov AAL,R17

ldi R16,0
mov BBH,R16
ldi r16,0x11 ;BBH =0 BBL=MDdat
mov BBL,R16
mov MDdat,R16
rcall crt_sub_ab ;表示 AA,BB(MDdat)

rcall divis
mov ASKL,DansL
mov ASKH,DansH

ldi R16,0b11000100
rcall lcd_gyou
rcall crt_sub_ask ;表示 ASK

culc8:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc8

;--- 割り算 AA 1010 ÷ MDdat 20 = Dans

ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtdiv<<1) ;ample 文字
ldi zl,low(crtdiv<<1)
ldi cnt,16 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x10 ;AAH
ldi r17,0x10 ;AAL
mov AAH,R16
mov AAL,R17

ldi R16,0
mov BBH,R16
ldi r16,0x20 ;BBH =0 BBL=MDdat
mov BBL,R16
mov MDdat,R16
rcall crt_sub_ab ;表示 AA,BB(MDdat)

rcall divis
mov ASKL,DansL
mov ASKH,DansH

ldi R16,0b11000100
rcall lcd_gyou
rcall crt_sub_ask ;表示 ASK

culc81:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc81

;--- 割り算 AA 3010 ÷ MDdat 22 = Dans

ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(crtdiv<<1) ;ample 文字
ldi zl,low(crtdiv<<1)
ldi cnt,16 ;16文字表示
rcall buf_lcd ;文字データ 

ldi r16,0x30 ;AAH
ldi r17,0x10 ;AAL
mov AAH,R16
mov AAL,R17

ldi R16,0
mov BBH,R16
ldi r16,0x22 ;BBH =0 BBL=MDdat
mov BBL,R16
mov MDdat,R16
rcall crt_sub_ab ;表示 AA,BB(MDdat)

rcall divis
mov ASKL,DansL
mov ASKH,DansH

ldi R16,0b11000100
rcall lcd_gyou
rcall crt_sub_ask ;表示 ASK

culc82:
cbi PORTB,3 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,3 ;
rcall t200ms ;wait 100msec
sbic pinb,1 ;if PB1= L then skip
rjmp culc82





rjmp main_sub
;-------------------------------------

crt_sub_ab:

ldi R16,0b10000010
rcall lcd_gyou
mov RcouL,AAL ;文字データ 16個
mov RcouH,AAH
rcall count

ldi R16,0b10001011
rcall lcd_gyou
mov RcouL,BBL ;文字データ 16個
mov RcouH,BBH
rcall count
ret
crt_sub_ask:
ldi R16,0b11000101
rcall lcd_gyou

mov RcouL,ASKL ;文字データ 16個
mov RcouH,ASKH
rcall count
ret


;----------------- 今は使わない -------------------------------
 パルス測定 サンプル 


cbi PORTB,2 ; L (LED-on)
cbi PORTB,3 ; L (LED-on)
rcall t1s
sbi PORTB,2 ; PORTBのbit2--H(LED-OFF)
sbi PORTB,3 ; PORTBのbit2--H(LED-OFF)
rcall t1s ;wait 100msec
cbi PORTB,2 ; L (LED-on)
cbi PORTB,3 ;
rcall t1s
sbi PORTB,2 ; L (LED-on)
sbi PORTB,3 ; L (LED-on)
rcall t1s

;----- 2ビット読み捨ててから 読み込み ---------------------
clr r3 ;割り込み判定フラッグ初期化

loop0:
sei ;割り込み許可
loop1:
sbrs r3, 0 ;r3のbit0がHならスキップする(割り込みがあったとき)skip bit register set?
rjmp loop1 ;割り込みがなければloop:へ戻る
clr r3
loop10:
sbrs r3, 0 ;r3のbit0がHならスキップする(割り込みがあったとき)skip bit register set?
rjmp loop10 ;割り込みがなければloop:へ戻る
clr r3 ;フラッグを倒して

ldiw Z,RD1L
ldi cntr,50
loop20:
sbrs r3, 0 ;r3のbit0がHならスキップする(割り込みがあったとき)skip bit register set?
rjmp loop20 ;割り込みがなければloop:へ戻る
clr r3 ;フラッグを倒して

in R14,icr1L
in R15,icr1H

st z+,R14
st z+,R15
dec cntr
brne loop20

cli


;-------------------------------------

ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(TABLE0<<1) ;ample 文字
ldi zl,low(TABLE0<<1)
ldi cnt,7 ;16文字表示
rcall buf_lcd ;文字データ

loop50:
cbi PORTB,3 ; PORTBのbit3--H
rcall t100ms ;wait 100msec
sbi PORTB,3 ;
rcall t100ms ;wait 100msec

sbic pinb,1 ;if PB1= L then skip
rjmp loop50

ldi R16,0b11000000
rcall lcd_gyou
ldi zh,high(TABLE1<<1) ;ample 文字
ldi zl,low(TABLE1<<1)
ldi cnt,7 ;16文字表示
rcall buf_lcd ;文字データ 16個


ldi R16,0b11000111
rcall lcd_gyou

LDS R14,RD1L
LDS R15,RD1H
mov RcouL,R14
mov RcouH,R15
rcall count


ldi w,10
sts RDcnt,w
ldiw Z,RD1L
loop51:


sbic pinb,1 ;if PB1= L then skip
rjmp loop51

ldi R16,0b11000111
rcall lcd_gyou

LD R22,Z+
LD R23,Z+
pushZ
mov RcouL,R22
mov RcouH,R23
rcall count
popZ

cbi PORTB,3 ; PORTBのbit3--H
rcall t100ms ;wait 100msec
sbi PORTB,3 ;
rcall t100ms ;wait 100msec
cbi PORTB,3 ; PORTBのbit3--H
rcall t100ms ;wait 100msec
sbi PORTB,3 ;
rcall t100ms ;wait 100msec

lds w,RDcnt
dec w
sts RDcnt,w
brne loop51

loop6:
cbi PORTB,2 ; PORTBのbit3--H
rcall t200ms ;wait 100msec
sbi PORTB,2 ;
rcall t200ms ;wait 100msec

sbic pinb,1 ;if PB1= L then skip
rjmp loop6


rjmp loop6 ;loop:へ戻る

;------------ 割り込み ルーチン ------------------------

tim1_ovf: ;オーバーフロー割り込みルーチン
in stack,sreg
ldi r16, $B3 ;タイマー設定
out TCNT1H, r16 ;↑
ldi r16, $B0 ;↑
out TCNT1L, r16 ;↑
inc r3 ;フラッグ立てる
out sreg,stack
reti ;

;------------ icp割り込み ルーチン ------------------------

ICP_on: ;ICPルーチン
in stack,sreg

ldi r16, 0 ;timer1に 0
out TCNT1H, r16 ;↑
ldi r16, 0 ;↑
out TCNT1L, r16 ;↑
inc r3
out sreg,stack
reti ;



;---------------- Zレジスタの16個データをwへ転送し LCD 送る -------------------
buf_lcd:
sbi portd,lcd_rs ; RS=1 data set
buf_lcd1:
lpm w4,z+ ;+1する
rcall lcdp4
dec cnt ;R23 マイナス1
brne buf_lcd1 ;Z(0フラグ)=0 でないならば 戻る
ret




;------------ LCD イニシャル -------------------------
lcdi:
; ------- 00110000 ------------
rcall t100ms
cbi portd,lcd_rs ;RS--0 set
ldi w,0b00110000 ;W 0011 転送
rcall lcdp8
; ------ 00110000 ---------------
rcall t10ms
ldi w,0b00110000 ;0011 転送
rcall lcdp8
; ------- 00110000 --------------
rcall t1ms
ldi w,0b00110000 ;0011 転送
rcall lcdp8
; -------- 4ビットモード ---------------
rcall t1ms
ldi w,0b00100000 ;0010 転送
rcall lcdp8
; --------- 2ライン 5*8dot ----------
ldi w4,0b00101000 ;0010 上位転送
rcall lcdp4 ;1000 下位転送
; --------- 表示OFF ------------------
ldi w4,0b00001000
rcall lcdp4
; --------- cls ------------------
ldi w4,0b00000001
rcall lcdp4
; --------- entry mode set ------
ldi w4,0b00000110
rcall lcdp4
; --------- display on set -------
ldi w4,0b00001100
rcall lcdp4

sbi portd,lcd_rs ;RS = 1
ret
;---------- w レジスタ 8ビット上位のみLCDへセットする ---------
; PD2-D4 PD3-D5 PD4-D6 PD5-D7
;
lcdp8:
swap w
in R17,PIND ;D port 入力
andi R17,0b11000011 ;lcd OUT 以外を取る
lsl w
lsl w ;wの値をDB2--DB5 へ移動
andi w,0b00111100 ;
or w,R17 ;合体
out portd,w
nop
cbi portB,lcd_e
rcall t1ms
sbi portB,lcd_e
rcall t1ms
ret

;-------------- w4 8ビットデータLCDセットする ---------
lcdp4:
mov w,w4 ;w4 上位 転送
rcall lcdp8
mov w,w4
swap w ;w4 下位 転送
rcall lcdp8
ret
;------------ 1行目 -------------------------
lcd_gyou:
cbi portd,lcd_rs ;RS=0 制御
mov w4,R16
rcall lcdp4
sbi portd,lcd_rs
ret

;-------------5桁 カウンター表示 -------------------------
count:

mov RL_buf,RcouL
mov RH_buf,RcouH
ldi tcount1,0x01
ldi tcount2,0x00
ldi tcount3,0x00
ldi tcount4,0x00
ldi tcount5,0x00
count1:
sbiw RcouL,0x01 ;R30,R31 -1
BREQ count_crt ;0ならば jmp-->crt
inc tcount1 ;1
cpi tcount1,10
BRNE count2 ;終了
clr tcount1
inc tcount2 ;10
cpi tcount2,10
BRNE count2 ;終了
clr tcount2
inc tcount3 ;100
cpi tcount3,10
BRNE count2 ;終了
clr tcount3
inc tcount4 ;1000
cpi tcount4,10
BRNE count2 ;終了
clr tcount4
inc tcount5 ;1000
cpi tcount5,10
count2:
rjmp count1

count_crt:
mov w4,tcount5
ori w4,0x30
rcall lcdp4
mov w4,tcount4
ori w4,0x30
rcall lcdp4
mov w4,tcount3
ori w4,0x30
rcall lcdp4
mov w4,tcount2
ori w4,0x30
rcall lcdp4
mov w4,tcount1
ori w4,0x30
rcall lcdp4

mov RcouL,RL_buf
mov RcouH,RH_buf

ret
;------------ 計算 ルーチン --------------------------

;足し算  AAH:AAL + BBH:BBL = ASKH:ASKL
addloop:
add AAL,BBL
adc AAH,BBH ;AAH + BBH + C =AAH
brcc addloop1 ;キャリーオーバー jmp loop1
ldi R16,0xFF
mov AAL,R16
mov AAH,R16
addloop1:
mov ASKL,AAL
mov ASKH,AAH
ret


;引き算  AAH:AAL−BBH:BBL = ASKH:ASKL
subloop:
clr fuF
cp AAH,BBH
BRLO subloop1 ;AAH < BBH then jmp loop1
ldi R16,0
cp AAH,R16 ; AAH=0 then jmp loop end
BRNE subloope
cp AAL,BBL
BRLO subloop2 ;AAL < BBL then jmp loop2
sub AAL,BBL ;AAL-BBL = AAL
mov ASKL,AAL ; AAL --> ASKL
mov ASKH,AAH ; 0 --> ASKH
clr fuF ;プラスフラグ =0
ret
subloop1: ; BBH が大きい時
sub BBL,AAL
mov ASKL,BBL
sbc BBH,AAH ;BBH-AAH-C = ASKH
mov ASKH,BBH
inc fuF ;プラスフラグ =1
ret
subloop2: ;AAH=0 AAL < BBL の時
sub BBL,AAL
mov ASKL,BBL
mov ASKH,AAH
inc fuF ;プラスフラグ =1
ret
subloope:
sub AAL,BBL
mov ASKL,AAL
sbc AAH,BBH ;AAH-BBH-C = AAH
mov ASKH,AAH ;AAH ---> ASKH
clr fuF ;プラスフラグ =0
ret

; 掛け算  AAH:AAL × MDdat = ASKH:ASKL
multi:
ldi R16,0
mov BBH,AAH
mov BBL,AAL
mov AAH,R16
mov AAL,R16 ;AA = 0 BB = data
multi1:
rcall addloop ;AA + BB = AA
dec MDdat ;掛け算
brne multi1 ;0でなければ 再度足し算
ret

; 割り算  AAH:AAL ÷ MDdat = Dans
divis:
ldi R16,0
mov DansL,R16
mov DansH,R16
mov BBH,R16
mov BBL,MDdat
divis1:
rcall subloop ;AA - BB = ASK
inc DansL
BREQ divis2
sbrs fuF, 0 ;fuFのbit0が1ならスキップする
rjmp divis1 ;AA < BB C=0 then JMP戻り
dec DansL
ret
divis2:
inc DansH ;256 over
sbrs fuF,0 ;
rjmp divis1
dec DansL
ret
;-------------タイマー-----------------------------------
t100us:
ldi r16,110
loop100us:
rjmp pc+1
rjmp pc+1
rjmp pc+1
dec r16 ;
BRNE loop100us
ret
;------------------
t1ms:
ldi R16,5 ;0.1*1024 分周
out TCCR0,R16
ldi R16,0
out TCNT0,R16
loop1ms:
in R16,TCNT0
cpi R16,10 ;102.4*10 =1.024 ms
BRNE loop1ms
ret
;------------------
t10ms:
ldi R16,5 ;0.1*1024=102.4
out TCCR0,R16
ldi R16,0
out TCNT0,R16
loop10ms:
in R16,TCNT0
cpi R16,39 ;102.4*98 =10.035 ms
BRNE loop10ms
ret
;------------------
t50ms:
ldi R18,5
loop50ms:
rcall t10ms
dec R18
brne loop50ms
ret
;-------------------
t100ms:
ldi R18,10
loop100ms:
rcall t10ms
dec R18
brne loop100ms
ret
;-------------------
t200ms:
ldi R18,20
loop200ms:
rcall t10ms
dec R18
brne loop200ms
ret
;--------------------
t500ms:
ldi R18,50
loop500ms:
rcall t10ms
dec R18
brne loop500ms
ret
;---------------------
t1s:
ldi R18,100
loop1s:
rcall t10ms
dec R18
brne loop1s
ret

;--------------- data -----------------------------
TABLE:
; "1234567812345678"
.db " AVR Pulse prog "

TABLE0:
.db "READ = "
TABLE1:
.db "Count = "


; "1234567812345678"
; "A=12345 B=12345"
crta:
.db "A= B= "
crtb:
.db "B= "
crtsub:
.db "SUB= "
crtsubp:
.db "SUB=-"
crtadd:
.db "ADD= "
crtmul:
.db "Mul= "
; "1234567812345678"
crtdiv:
.db "Div= "
;−−−データセグメント
.dseg
.org 0x60

RDcnt: .byte 1
RD1L: .byte 1 ;0
RD1H: .byte 1 ;1
RD2L: .byte 1 ;2
RD2H: .byte 1 ;3
RD3L: .byte 1 ;4
RD3H: .byte 1 ;5
RD4L: .byte 1 ;6
RD4H: .byte 1
RD5L: .byte 1
RD5H: .byte 1
RD6L: .byte 1 ;0
RD6H: .byte 1 ;1
RD7L: .byte 1 ;2
RD7H: .byte 1 ;3
RD8L: .byte 1 ;4
RD8H: .byte 1 ;5
RD9L: .byte 1 ;6
RD9H: .byte 1
RD10L: .byte 1
RD10H: .byte 1
RTCCENT: .byte 1 ;7
RTCYEAR: .byte 1 ;8
;============================
by k.majima


ATTINY2313 キャラクタLCD、LED点灯