ATtiny26Lで液晶,AD変換,EEP-ROMなどを使う
液晶に文字を表示させる例
接続および設定
AVR側:液晶側
PA0:RS
PA1:RW
PA2:EN
PA4:DB4
PA5:DB5
PA6:DB6
PA7:DB7
発振子は4MHz
VLCはコントラスト調整だが,回路を簡単にするためGNDに接続した.(最も濃く表示される)
電源は,4.5Vでも6VでもOK.
LCD26.ASM
.INCLUDE "tn26def.inc"
.equ en =2 ;PB2
.def temp =R16
.def data =R17 ;DATA
.def CT1 =R18
.def CT2 =R19
.def CT3 =R20
RJMP RESET
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RESET: ldi temp,RAMEND
out SP,temp
ldi temp,0Xff
out DDRA,temp ;set PORTB
;***************** LCD initialize ******************************************
rcall TM10
rcall TM10
ldi data,0X30 ;Function Set X 3
OUT PORTA,data
sbi PORTA,en
cbi PORTA,en
rcall TM10
sbi PORTA,en
cbi PORTA,en
rcall TM10
sbi PORTA,en
cbi PORTA,en
rcall TM10
CBI PORTA,4 ;ldi data,0X20
sbi PORTA,en
cbi PORTA,en
rcall TM10
ldi data,0X2c
rcall cmnd
ldi data,0X01 ;
rcall cmnd
ldi data,0X0c
rcall cmnd ;Display On Off Control
ldi data,0X06
rcall cmnd ;Entry Mode Increment
main: ldi data,0X01 ;clear LCD
rcall cmnd ;out command
ldi data,0XB2 ;I
rcall write ;
ldi data,0XCA ;BA
rcall write ;
ldi data,0XDE ;
rcall write ;
ldi data,0XD7 ;RA
rcall write ;
ldi data,0XB7 ;KI
rcall write ;
rcall TM ;wait 1 second
ldi data,0X01 ;
rcall cmnd ;clear LCD
ldi data,0XC0 ;
rcall cmnd ;DDRAM=40 Lower Line
ldi data,0XC0 ;DA
rcall write ;
ldi data,0XDE ;
rcall write ;
ldi data,0XB2 ;I
rcall write ;
ldi data,0XB6 ;GA
rcall write ;
ldi data,0XDE ;
rcall write ;
ldi data,0XB8 ;KU
rcall write ;
rcall TM ;wait 1s
rjmp main ;jump main
;*** command and write to LCD *** rs 0X01 rw 0X02 en 0X04
cmnd: MOV temp,data
SWAP temp
CBR data,0X01
CBR temp,0X01
RJMP DO
write: MOV temp,data
SWAP temp
SBR data,0X01
SBR temp,0X01
DO: CBR data,0X06 ;rw & en =0
CBR temp,0X06 ;rw & en =0
OUT PORTA,data
sbi PORTA,en
cbi PORTA,en
OUT PORTA,temp
sbi PORTA,en
cbi PORTA,en
RCALL TM10
ret
;******************* timer 10ms *********************************************
;If CT2=100 & CT1=100 T=10ms at 4MHz
TM10: ldi CT2,100
LP1: ldi CT1,100
LP2: nop
dec CT1
brne LP2
dec CT2
brne LP1
ret
;******************** timer 1sec *******************************************
TM: ldi CT3,100
LP: rcall TM10
dec CT3
brne LP
rcall TM10
ret
カウントした値を10進数に変換し液晶で表示させる例
接続および設定は前に同じ
LCDCOUNT.ASM
.INCLUDE "tn26def.inc"
.equ en =2 ;PB2
.def TEMP =R16
.def data =R17 ;DATA
.def CT1 =R18
.def CT2 =R19
.def CT3 =R20
.def BIN0 =R21
.def DEC0 =R22
.def DEC1 =R23
.def DEC2 =R24
RJMP RESET
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RESET: LDI TEMP,RAMEND
out SP,TEMP
LDI TEMP,0Xff
out DDRA,TEMP ;set PORTB
;***************** LCD initialize ******************************************
RCALL TM10
RCALL TM10
LDI data,0X30 ;Function Set X 3
OUT PORTA,data
sbi PORTA,en
cbi PORTA,en
RCALL TM10
sbi PORTA,en
cbi PORTA,en
RCALL TM10
sbi PORTA,en
cbi PORTA,en
RCALL TM10
CBI PORTA,4 ;LDI data,0X20
sbi PORTA,en
cbi PORTA,en
RCALL TM10
LDI data,0X2c
RCALL cmnd
LDI data,0X01 ;
RCALL cmnd
LDI data,0X0c
RCALL cmnd ;Display On Off Control
LDI data,0X06
RCALL cmnd ;Entry Mode Increment
main: ldi data,0X01 ;clear LCD
rcall cmnd ;out command
DEC BIN0
; LDI BIN0,235
RCALL B2D
; RCALL B2DD
LDI TEMP,0X30
ADD DEC2,TEMP
ADD DEC1,TEMP
ADD DEC0,TEMP
MOV data,DEC2
RCALL write
MOV data,DEC1
RCALL write
MOV data,DEC0
RCALL write
RCALL TM ;wait .5 second
LDI data,0X01 ;
RCALL cmnd ;clear LCD
; LDI data,0XC0 ;
; RCALL cmnd ;DDRAM=40 Lower Line
rjmp main ;jump main
;*** command and write to LCD *** rs 0X01 rw 0X02 en 0X04
cmnd: MOV TEMP,data
SWAP TEMP
CBR data,0X01
CBR TEMP,0X01
RJMP DO
write: MOV TEMP,data
SWAP TEMP
SBR data,0X01
SBR TEMP,0X01
DO: CBR data,0X06 ;rw & en =0
CBR TEMP,0X06 ;rw & en =0
OUT PORTA,data
sbi PORTA,en
cbi PORTA,en
OUT PORTA,TEMP
sbi PORTA,en
cbi PORTA,en
RCALL TM10
RET
;******************* timer 10ms *********************************************
;If CT2=100 & CT1=100 T=10ms at 4MHz
TM10: LDI CT2,100
LP1: LDI CT1,100
LP2: nop
dec CT1
brne LP2
dec CT2
brne LP1
RET
;******************** timer .2sec *******************************************
TM: LDI CT3,5
LP: RCALL TM10
dec CT3
brne LP
RCALL TM10
RET
;******************** BINARY TO DECIMAL****************************
B2D: LDI DEC2,0
LDI DEC1,0
LDI DEC0,0
MOV CT1,BIN0
D2: LDI TEMP,100
CP CT1,TEMP
BRCS D1
SUBI CT1,100
INC DEC2
RJMP D2
D1: LDI TEMP,10
CP CT1,TEMP
BRCS D0
SUBI CT1,10
INC DEC1
RJMP D1
D0: LDI TEMP,1
CP CT1,TEMP
BRCS DD
SUBI CT1,1
INC DEC0
RJMP D0
DD: RET
;******************** BINARY TO DECIMAL****************************
B2DD: MOV CT1,BIN0
LDI DEC2,0
LDI DEC1,0
LDI DEC0,0
CPI CT1,0
BREQ DD_END
DD0: INC DEC0
CPI DEC0,10
BRNE DD1
LDI DEC0,0
INC DEC1
DD1: CPI DEC1,10
BRNE DD2
LDI DEC1,0
INC DEC2
DD2: DEC CT1
BRNE DD0
DD_END: RET
AD変換を行い値を10進数に変換し液晶で表示させる例
接続および設定は前に同じ.PB6をAD変換の入力とした.
ADLCD.ASM
.INCLUDE "tn26def.inc"
.equ en =2 ;PB2
.def TEMP =R16
.def data =R17 ;DATA
.def CT1 =R18
.def CT2 =R19
.def CT3 =R20
.def BIN0 =R21
.def DEC0 =R22
.def DEC1 =R23
.def DEC2 =R24
RJMP RESET
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RESET: LDI TEMP,RAMEND
out SP,TEMP
LDI TEMP,0Xff
out DDRA,TEMP ;set PORTA
;***************** LCD initialize ******************************************
RCALL TM10
RCALL TM10
LDI data,0X30 ;Function Set X 3
OUT PORTA,data
sbi PORTA,en
cbi PORTA,en
RCALL TM10
sbi PORTA,en
cbi PORTA,en
RCALL TM10
sbi PORTA,en
cbi PORTA,en
RCALL TM10
CBI PORTA,4 ;LDI data,0X20
sbi PORTA,en
cbi PORTA,en
RCALL TM10
LDI data,0X2c
RCALL cmnd
LDI data,0X01 ;
RCALL cmnd
LDI data,0X0c
RCALL cmnd ;Display On Off Control
LDI data,0X06
RCALL cmnd ;Entry Mode Increment
;*****************AD Initialize**********************************************
LDI TEMP,0X00
OUT DDRB,TEMP ;set PORTB
LDI TEMP,0B10101001 ;INTENAL V REF. LEFT ADJUST, ADC9
OUT ADMUX,TEMP
LDI TEMP,0B10000000 ;SET ADCSR
OUT ADCSR,TEMP
main: LDI TEMP,0B11000000 ;START CONVERSION
OUT ADCSR,TEMP
ADLP: SBIS ADCSR,4
RJMP ADLP
IN BIN0,ADCH
ldi data,0X01 ;clear LCD
rcall cmnd ;out command
RCALL B2D
LDI TEMP,0X30
ADD DEC2,TEMP
ADD DEC1,TEMP
ADD DEC0,TEMP
MOV data,DEC2
RCALL write
MOV data,DEC1
RCALL write
MOV data,DEC0
RCALL write
RCALL TM
rjmp main
;*** command and write to LCD *** rs 0X01 rw 0X02 en 0X04
cmnd: MOV TEMP,data
SWAP TEMP
CBR data,0X01
CBR TEMP,0X01
RJMP DO
write: MOV TEMP,data
SWAP TEMP
SBR data,0X01
SBR TEMP,0X01
DO: CBR data,0X06 ;rw & en =0
CBR TEMP,0X06 ;rw & en =0
OUT PORTA,data
sbi PORTA,en
cbi PORTA,en
OUT PORTA,TEMP
sbi PORTA,en
cbi PORTA,en
RCALL TM10
RET
;******************* timer 10ms *********************************************
;If CT2=100 & CT1=100 T=10ms at 4MHz
TM10: LDI CT2,100
LP1: LDI CT1,100
LP2: nop
dec CT1
brne LP2
dec CT2
brne LP1
RET
;******************** timer .1sec *******************************************
TM: LDI CT3,10
LP: RCALL TM10
dec CT3
brne LP
RCALL TM10
RET
;******************** BINARY TO DECIMAL****************************
B2D: LDI DEC2,0
LDI DEC1,0
LDI DEC0,0
MOV CT1,BIN0
D2: LDI TEMP,100
CP CT1,TEMP
BRCS D1
SUBI CT1,100
INC DEC2
RJMP D2
D1: LDI TEMP,10
CP CT1,TEMP
BRCS D0
SUBI CT1,10
INC DEC1
RJMP D1
D0: LDI TEMP,1
CP CT1,TEMP
BRCS DD
SUBI CT1,1
INC DEC0
RJMP D0
DD: RET
EEP-ROMを使ってみる
EEP-ROMへの書き込みおよび読み出しのテスト.EEP-ROMのデータは,sp12 -ref
XXX.txt とすれば,XXX.txt に書き出すことができます.
EEPTEST.ASM
.INCLUDE "tn26def.inc"
RJMP RESET
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RETI
RESET: LDI R16,RAMEND
OUT SP,R16
;WRITE PROCESS
LDI R16,20
LDI R17,0
LP0: OUT EEAR,R17 ;EEP ADDRESS
OUT EEDR,R17 ;EEP DATA
LDI R18,0B00000100
OUT EECR,R18
LDI R18,0B00000110
OUT EECR,R18
WAIT: SBIC EECR,1
RJMP WAIT
INC R17
DEC R16
BRNE LP0
;READ AND WRITE PROCESS
LDI R16,20
LDI R17,0
LP1: OUT EEAR,R17 ;EEP ADDRESS
LDI R18,0B00000001 ;READ EEP
OUT EECR,R18
WAIT1: SBIC EECR,0
RJMP WAIT1
IN R18,EEDR
LDI R19,5
ADD R19,R18
OUT EEDR,R19 ;EEP DATA
LDI R19,30
ADD R19,R17
OUT EEAR,R19 ;EEP ADDRESS
LDI R18,0B00000100
OUT EECR,R18
LDI R18,0B00000110
OUT EECR,R18
WAIT2: SBIC EECR,1
RJMP WAIT2
INC R17
DEC R16
BRNE LP1
END: RJMP END