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