Při zapnutí LCD se zobrazují čverečky
Moderátor: Moderátoři
- Guitarister
- Příspěvky: 11
- Registrován: 11 říj 2012, 00:00
Při zapnutí LCD se zobrazují čverečky
- Guitarister
- Příspěvky: 11
- Registrován: 11 říj 2012, 00:00
- Guitarister
- Příspěvky: 11
- Registrován: 11 říj 2012, 00:00
;do deklarace vložit
;.EQU PLCD=PORTD
;***********************************************************************************************
;do inicializace nutno vložit
;INIT_LCD
;***********************************************************************************************
;do inc souborů nutno vložit
;.INCLUDE "LCD_M08.INC"
;************************************************************************************************
;příklady použití - viz popis maker
;************************************************************************************************
.INCLUDE "$WINAVR\INCFILES\INI.INC"
.INCLUDE "$WINAVR\INCFILES\MCS.INC"
;*******************************************************************************
M_EQU PLCD, PORTA
.SET BIT_BACKL = 6 ;bit na kterém je zapojeno podsvětlení
;***************************************************************************************************
;platí pro všechny jednořádkové a dvouřádkové displeje, pro čtyřřádkové displeje je nastavení a pro
;čtyřřádkový displej 4x20 znaků
;pro 4x16 znaků platí:
;.SET ADR_RAD1 = $0 ;počáteční adresy jednotlivých řádků viz datasheet lcd
;.SET ADR_RAD2 = $40
;.SET ADR_RAD3 = $10
;.SET ADR_RAD4 = $50
;***************************************************************************************************
.SET ADR_RAD1 = $0 ;počáteční adresy jednotlivých řádků viz datasheet lcd
.SET ADR_RAD2 = $40
.SET ADR_RAD3 = $14
.SET ADR_RAD4 = $54
;***************************************************************************************************
.DSEG
PODSV: .BYTE 1
KBL: .BYTE 1
.CSEG
;*******************************************************************************
.MACRO BCKL_ON
PUSH R16
LDI R16, 1
STS PODSV, R16
CBI PLCD, BIT_BACKL
POP R16
.ENDMACRO
;*******************************************************************************
.MACRO BCKL_OFF
PUSH R16
LDI R16, 0
STS PODSV, R16
SBI PLCD, BIT_BACKL
POP R16
.ENDMACRO
;*******************************************************************************
;*******************************************************************************
.MACRO KURZ_ON
PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001110
ANDI R16, 0B00001111
STS KBL, R16
RCALL VYSINST
POP16 R16
.ENDMACRO
;*******************************************************************************
.MACRO KURZ_OFF
PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001100
ANDI R16, 0B00001101
STS KBL, R16
RCALL VYSINST
POP16 R16
.ENDMACRO
;*******************************************************************************
;*******************************************************************************
.MACRO BLIK_ON
PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001101
ANDI R16, 0B00001111
STS KBL, R16
RCALL VYSINST
POP16 R16
.ENDMACRO
;*******************************************************************************
.MACRO BLIK_OFF
PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001100
ANDI R16, 0B00001110
STS KBL, R16
RCALL VYSINST
POP16 R16
.ENDMACRO
;*******************************************************************************
.MACRO VYTSPZN
PUSH24 R16
LDI R18, 0B01000000
LDI ZL, LO(2 * @0) ;do registru Z (16 bitový reg.) začátek tabulky
LDI ZH, HI(2 * @0)
ZAPIS: MOV R16, R18
CALL VYSINST
LPM R16, Z+
CALL VYSDATA
INC R18
CPI R18, 0B10000000
BRNE ZAPIS
POP24 R16
.ENDMACRO
;*******************************************************************************
.MACRO CLRLCD
CALL CLLCD
.ENDMACRO
;*******************************************************************************
.MACRO INIT_LCD
PUSH16 R16
LDI R16, $FF ;do registru R16 data 0Fh
OUT PLCD, R16
LDI R16, $FF ;do registru R16 data 255
OUT DDR(PLCD), R16 ;nastaví celý port D jako výstupní
CALL LCDINI
VYTSPZN TABZN
POP16 R16
.ENDMACRO
;*******************************************************************************
.MACRO LCD1
PUSH16 R16
.IF @10 > 1
LDI R16, @2
CALL @1
.ENDIF
LDI R16, @0
CALL VYSDATA
POP16 R16
.ENDMACRO
;*******************************************************************************
.MACRO LCD_TEX
PUSH16 R16
PUSH16 R30
.IF @10 > 1
LDI R16, @2
CALL @1
.ENDIF
LDI ZL, LO((PC + 12) * 2) ;adresa tabulky v macru
LDI ZH, HI((PC + 11) * 2)
LPM R16, Z+ ;čte data dokud nenarazí na 255
CPI R16, 255
BREQ PC + 4
CALL VYSDATA
RJMP PC - 5
LPM R16, Z+
LSR ZH
ROR ZL
IJMP
.DB @0, 255
POP16 R30
POP16 R16
.ENDMACRO
;*******************************************************************************
.MACRO LCD_PRP
.IF @10 > 1
PUSH16 R16
LDI R16, @2
CALL @1
POP16 R16
.ENDIF
PUSH16 R16
.IF ISREG(@0)
MOV R16, @0
CALL VYSDATA
.ELSE
LDS R16, @0
CALL VYSDATA
.ENDIF
POP16 R16
.ENDMACRO
;*******************************************************************************
.MACRO LCD_PAS
.IF @10 > 1
PUSH16 R16
LDI R16, @2
CALL @1
POP16 R16
.ENDIF
PUSH16 R16
.IF ISREG(@0)
MOV R16, @0
ORI R16, 0B00110000
CALL VYSDATA
.ELSE
LDS R16, @0
ORI R16, 0B00110000
CALL VYSDATA
.ENDIF
POP16 R16
.ENDMACRO
;*******************************************************************************
LCDINI: LDI R16, 0 ;na bit PLCD.7 log 0 - pripojeni napajeni radice
OUT PLCD, R16
DELMS 100
LDI R16, $02 ;nastaveni 4b. prenosu
CALL OUTLCD ;podpr. pro vysl. 4 bitu
DELMS 20
LDI R16, $02 ;nastaveni 4b. prenosu
CALL OUTLCD ;podpr. pro vysl. 4 bitu
DELMS 20
LDI R16, $02 ;nastaveni 4b. prenosu
CALL OUTLCD ;podpr. pro vysl. 4 bitu
DELMS 20
LDI R16, 0B00101000 ;nastaveni 4b. prenos, dvouradkovy disp.
CALL VYSINST ;fontu 5x7
LDI R16, 0B00001100
CALL VYSINST
LDI R16, 0B00000110 ;nastaveni automat. posunu kurzoru
CALL VYSINST
VYTSPZN TABZN
CLRLCD
RET
;*****
CLLCD: LDI R16, 1 ;vynuluje displej
CALL VYSINST
DELMS 5
RET
;*****
VYSINST: LDI R17, 0B00000000 ;nastaví bit5 do log0 - instrukce
RJMP VYSBYT
VYSDATA: LDI R17, 0B00100000 ;nastaví bit5 do log1 - data
VYSBYT: CPI08 PODSV, 0
BRNE SVITI
ORI R17, (1 << BIT_BACKL)
SVITI: PUSH R16 ;zálohuje data
SWAP R16 ;vymění horní a dolní 4 bity
ANDI R16, $0F ;horní čtyři bity do log0, dolní zachová
OR R16, R17 ;domaskuje bit5 - data/instrukce+podsvětlení
CALL OUTLCD ;podprogram vyslání (horní čtyři bity)
POP R16 ;obnoví data
ANDI R16, $0F ;horní čtyři bity do log0, dolní zachová
OR R16, R17 ;domaskuje bit5 - data/instrukce+podsvětlení
CALL OUTLCD ;podprogram vyslání (dolní čtyři bity)
RET
;***************************************************************************************
RAD1: LDI R17, ADR_RAD1 ;0 - počáteční adresa prvního řádku
ADD R16, R17 ;přičte k počáteční adrese požadovanou pozici
ORI R16, 0B10000000 ;bit7 určuje instrukci nastavení pozice
CALL VYSINST ;vyšle instrukci
RET
RAD2: LDI R17, ADR_RAD2
ADD R16, R17
ORI R16, 0B10000000
CALL VYSINST
RET
RAD3: LDI R17, ADR_RAD3
ADD R16, R17
ORI R16, 0B10000000
CALL VYSINST
RET
RAD4: LDI R17, ADR_RAD4
ADD R16, R17
ORI R16, 0B10000000
CALL VYSINST
RET
;**
OUTLCD: OUT PLCD, R16 ;R16 na portd
DELUS 10
SBI PLCD, 4 ;nástupná hrana
DELUS 50
CBI PLCD, 4 ;sestupná
DELUS 10
RET
TABZN:
;č 0
.DB 0B00001010, 0B00000100
.DB 0B00001110, 0B00010000
.DB 0B00010000, 0B00010001
.DB 0B00001110, 0B00000000
;í 1
.DB 0B00000010, 0B00000100
.DB 0B00001100, 0B00000100
.DB 0B00000100, 0B00000100
.DB 0B00001110, 0B00000000
;ý 2
.DB 0B00000010, 0B00000100
.DB 0B00010001, 0B00010001
.DB 0B00001111, 0B00000001
.DB 0B00001110, 0B00000000
;á 3
.DB 0B00000010, 0B00000100
.DB 0B00001110, 0B00000001
.DB 0B00001111, 0B00010001
.DB 0B00001111, 0B00000000
;ž 4
.DB 0B00001010, 0B00000100
.DB 0B00011111, 0B00000010
.DB 0B00000100, 0B00001000
.DB 0B00011111, 0B00000000
;ó 5
.DB 0B00000010, 0B00000100
.DB 0B00001110, 0B00010001
.DB 0B00010001, 0B00010001
.DB 0B00001110, 0B00000000
;6
.DB 0B00000000, 0B00000000
.DB 0B00000000, 0B00000000
.DB 0B00000000, 0B00000100
.DB 0B00001110, 0B00011111
;7
.DB 0B00000100, 0B00001110
.DB 0B00011111, 0B00000000
.DB 0B00000000, 0B00000000
.DB 0B00000000, 0B00000000
- Přílohy
-
LCD_modul.pdf- (141.51 KiB) Staženo 116 x
Pokut ano, tak bude někde chyba v tvém programu. S asm jsem také začínal, ale programování v C mi přijde snadnější a při přenosu na jiný typ uProcesoru(PIC,ARM) stačí malé úpravy(osobní názor).
Chyba bude zde(při inicializaci musí být odeslána 3x hodnota 03h):
Kód: Vybrat vše
LCDINI: LDI R16, 0 ;na bit PLCD.7 log 0 - pripojeni napajeni radice
OUT PLCD, R16
DELMS 100 ;(delay 15ms - 50ms)
LDI R16, $02 ;nastaveni 4b. prenosu (8bit přenos - $03)
CALL OUTLCD
DELMS 20 ;delay 5ms
LDI R16, $02 ;nastaveni 4b. prenosu (8bit přenos - $03)
CALL OUTLCD
DELMS 20
LDI R16, $02 ;nastaveni 4b. prenosu (8bit přenos - $03)
CALL OUTLCD
DELMS 20
LDI R16, 0B00101000 ;nastaveni 4b. prenos, dvouradkovy disp.
;nstavení 4bit přenos - $02(0b00000010)
CALL OUTLCD ;podpr. pro vysl. 4 bitu
DELMS 20
LDI R16, 0B00001100
CALL VYSINST
LDI R16, 0B00000110 ;nastaveni automat. posunu kurzoru
CALL VYSINST
VYTSPZN TABZN
CLRLCD
- Přílohy
-
Test_LCD.zip- (37.46 KiB) Staženo 102 x
- Guitarister
- Příspěvky: 11
- Registrován: 11 říj 2012, 00:00
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
Standa: mne zase viac vyhovuje asembler, vysledny program je ovela mensi a rychlejsi.
- Guitarister
- Příspěvky: 11
- Registrován: 11 říj 2012, 00:00
Kód: Vybrat vše
LCDINI: LDI R16, 0 ;na bit PLCD.7 log 0 - pripojeni napajeni radice
OUT PLCD, R16
DELMS 30
LDI R16, $03 ;nastaveni 8b. prenosu
CALL OUTLCD ;podpr. pro vysl. 8 bitu
DELMS 5
LDI R16, $03 ;nastaveni 8b. prenosu
CALL OUTLCD ;podpr. pro vysl. 8 bitu
DELMS 5
LDI R16, $03 ;nastaveni 8b. prenosu
CALL OUTLCD ;podpr. pro vysl. 8 bitu
DELMS 5
LDI R16, 0B00101000 ;nastaveni 8b. prenos, dvouradkovy disp.
CALL VYSINST ;fontu 5x7
LDI R16, 0B00001100
CALL VYSINST
LDI R16, 0B00000110 ;nastaveni automat. posunu kurzoru
CALL VYSINST
VYTSPZN TABZN
CLRLCD
RET
;*****takže pochopil jsem to správně, má to být nějak takhle??
Kód: Vybrat vše
LCDINI: LDI R16, 0 ;na bit PLCD.7 log 0 - pripojeni napajeni radice
OUT PLCD, R16
DELMS 50 ;(delay 50ms)
LDI R16, $03
CALL OUTLCD
DELMS 5 ;delay 5ms
LDI R16, $03
CALL OUTLCD
DELUS 100 ;delay 100us (>40us)
LDI R16, $03
CALL OUTLCD
DELUS 100 ;delay 100us(>40us)
LDI R16, $02 ;přepnutí do 4bit komunikace
CALL OUTLCD
DELUS 100 ;delay 100us
LDI R16, 0B00001100
CALL VYSINST
LDI R16, 0B00000110 ;nastaveni automat. posunu kurzoru
CALL VYSINST
VYTSPZN TABZN
CLRLCD
Na této stránce je simulátor LCD displeje s řadičem HD44780. Mě docela pomohl když jsem se seznamoval s principem komunikace.
- Guitarister
- Příspěvky: 11
- Registrován: 11 říj 2012, 00:00
- Guitarister
- Příspěvky: 11
- Registrován: 11 říj 2012, 00:00
Ješte, jak máš nastavené pojistky na té ATmega?
Nemáš tam zapnuté CLKDIV8?
Už jsem mi stalo, že jsem zapoměl toto nastavení vypnou a pak jsem zjistil, že mi správně nefunguje program.
Zkus tenhle program, jestli to půjde:
- Přílohy
-
Test_LCD_WH1602A.zip- (62.14 KiB) Staženo 118 x