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