1200で液晶を使う


ここではAT90S1200で液晶ディスプレーSC1602Bを使うプログラムを紹介します.


接続および設定
AVR側:液晶側
PB0:RS
PB1:RW
PB2:EN
PB4:DB4
PB5:DB5
PB6:DB6
PB7:DB7
発振子は4MHz
VLCはコントラスト調整だが,回路を簡単にするためGNDに接続した.(最も濃く表示される)
電源は,4.5Vでも6VでもOK.

サンプルプログラム
LCD04.ASM
「イバラキ」「ダイガク」と上下に交互に表示されるはずです.

.include "1200def.inc"
.equ    en      =2                      ;PB2
.def    temp    =R16                    
.def    data    =R17                    ;DATA
.def    CT1     =R18
.def    CT2     =R19
.def    CT3     =R20
        rjmp    reset                   ;reset 
        reti
        reti
        reti
reset:  ldi     temp,0Xff
        out     DDRB,temp               ;set PORTB 
;***************** LCD initialize ******************************************
        rcall   TM10
        rcall   TM10
        ldi     data,0X30               ;Function Set X 3       
        OUT     PORTB,data
        sbi     PORTB,en
        cbi     PORTB,en
        rcall   TM10
        sbi     PORTB,en
        cbi     PORTB,en
        rcall   TM10
        sbi     PORTB,en
        cbi     PORTB,en
        rcall   TM10
        CBI     PORTB,4             ;ldi    data,0X20
        sbi     PORTB,en
        cbi     PORTB,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     PORTB,data
        sbi     PORTB,en
        cbi     PORTB,en
        OUT     PORTB,temp
        sbi     PORTB,en
        cbi     PORTB,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