ATMEL 89C2051 komunikacia z displayom cez I2C

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#31 Příspěvek od Celeron »

Těžko radit. Podsvícenej nebo reflexní, barva písma, barva podkladu, barva podsvícení, velikost znaku, počet řádků, počet znaků v řádku, orientace konektoru, nakonec i řadič a znaková sada, to je milión kombinací, která se ti stejně smrskne na to co se dá aktuálně koupit.
Prostě se koukni co v kombinaci 2 x 16 nabízí prodejci a rozhodni se.
Tady máš ASM51 pro obsluhu LCD 2x16 s definicí znaků český abecedy. Adresaci a port si uprav podle svého projektu.

Kód: Vybrat vše

MOD_LCD	SEGMENT	CODE

;********************************		

	PUBLIC	DISPL,MS15,INIT,CES_AB,DELAY,D_ON,D_OFF,D_BLIK,C_L1_R
	PUBLIC  C_L2_R,D_HomE

	EXTRN	XDATA(L1,L2)
	Extrn	DAtA(Cursor)

;********************************		

	RSEG	MOD_LCD
;prEpis oBsAHu L1 A L2 Do LCD DisplEjE

DISPL:	CALL	BUSY		;<DPTR,A,PSW,B,R0,P2>
	MOV	A,#80H		;LINE1
	CALL	DR
	MOV	B,#16
	MOV	R0,#LOW(L1)
	CALL	DIS_O

	CALL	BUSY		;LINE2
	MOV	A,#0C0H		
	CALL	DR
	MOV	B,#16		
	MOV	R0,#LOW(L2)	
	CALL	DIS_O	
	RET
;********************************
BUSY:	MOV	DPTR,#RBUSY	;<DPTR,A>
BUSY1:	MOVX	A,@DPTR
	JB	ACC.7,BUSY1
	RET
;................................
				;DISPLAY RWM, (KAM CHCI PSAT)
				;A<-ADR.RWM (MOV A,#1000XXXXB)
DR:	MOV	DPTR,#WINST	;	    (MOV A,#1100XXXXB)
	MOVX	@DPTR,A
	RET
;--------------------------------
				;B <- POCET ZNAKU (MOV B,#16)
				;R0<- UKAZOVATKO NA ZAC.RETEZCE
				;     ( MOV R0,#LOW(LINE1) )
DIS_O:	CALL	BUSY		;VYSTUP NA DISPLEJ	
	MOV	DPTR,#WDATA
	CALL	INSTR
	INC	R0
	DJNZ	B,DIS_O
	RET
;................................
INSTR:	MOV	P2,#HIGH(L1)	;<P2,A>
	MOVX	A,@R0
	MOVX	@DPTR,A
	RET
;********************************
INIT:	CALL	MS20
	CALL	INST_I
	CALL	MS5
	CALL	INST_I
	CALL	MS1
	CALL	INST_I
				;FUNCTION SET
	MOV	A,#1
	MOV	B,#4
MODS:	MOV	DPTR,#INITBL
	PUSH	ACC
	CALL	DIS_ROM
	POP	ACC
	INC	A
	DJNZ	B,MODS
	RET
;................................
MS1:	MOV	R2,#0
	MOV	R3,#2	
	JMP	DELAY

MS5:	MOV	R2,#0
	MOV	R3,#8	
	JMP	DELAY

MS20:	MOV	R2,#0
	MOV	R3,#30	
	JMP	DELAY

MS15:	MOV	R2,#0		;!!!!!
	MOV	R3,#20	

DELAY:	PUSH	B		;<R2,R3>
	PUSH	ACC
	DIV	AB
	POP	ACC
	POP	B
	DJNZ	R2,DELAY
	DJNZ	R3,DELAY
	RET
;................................
INST_I:	MOV	DPTR,#INITBL	;INSTR iniCiAlizACni
	MOV	A,#0
DIS_ROM:
	MOVC	A,@A+DPTR
	MOV	DPTR,#WINST
	MOVX	@DPTR,A
	CALL	BUSY
	RET
;................................
				;iniCiAlizACni tABulkA
INITBL:	DB	00110000B	;"6"	SET DL TO HiGH
	DB	00111000B	;"6"	8 Bit, 2 linEs, 5x7 Dots
	DB	00001000B	;"4"	DisplAy oFF
	DB	00000001B	;"1"	ClEAr DisplAy, rEturn Cursor
	DB	00000110B	;"3"	sEt sHiFt moDE (Entry moDE sEt)
;********************************
WINST	EQU	0F000H
WDATA	EQU	0F001H
RBUSY	EQU	0F002H
;********************************
D_BLIK:	MOV	A,#00001101B	;DISPLAY ON, CURSOR OFF, BLIK ON
	JMP	INS_DI
;................................
D_ON:	MOV	A,#00001100B	;DISPLAY ON, CURSOR OFF
	JMP	INS_DI
;................................
D_OFF:	MOV	A,#00001000B	;DISPLAY OFF
INS_DI:	PUSH	ACC
	CALL	BUSY
	POP	ACC
	MOV	DPTR,#WINST
	MOVX	@DPTR,A
	RET
;................................
D_HomE:
	mov	A,Cursor
	mov	B,Cursor
	CjnE	A,#15,t_D_HomE
	jmp	C_l1_r
t_D_HomE:
	jnC	C_l2_r	
C_L1_R:	MOV	A,#00000010B	;CURSOR HOME L1
	CALL	INS_DI
C_MOVE_R:
	CALL	BUSY
	MOV	A,#00010100B	;KURSOR VPRAVO
	MOV	DPTR,#WINST
	MOVX	@DPTR,A
	DJNZ	B,C_MOVE_R
	RET
;................................
C_L2_R:	MOV	A,#00000010B	;CURSOR HOME L2
	CALL	INS_DI
	MOV	A,#40-10H
	ADD	A,B
	MOV	B,A
	JMP	C_MOVE_R
;********************************
CES_AB:

	CALL	BUSY

	MOV	A,#01000000B		;DLOUHE Y = 0H
	CALL	AD_C6
	MOV	DPTR,#DL_Y
	CALL	DA_C6

	MOV	A,#01001000B		;DLOUHE E = 1H
	CALL	AD_C6
	MOV	DPTR,#DL_E
	CALL	DA_C6

	MOV	A,#01010000B		;C S HACKEM = 2H
	CALL	AD_C6
	MOV	DPTR,#C_S_H
	CALL	DA_C6

	MOV	A,#01011000B		;R S HACKEM = 3H
	CALL	AD_C6
	MOV	DPTR,#R_S_H
	CALL	DA_C6

	MOV	A,#01100000B		;E S HACKEM = 4H
	CALL	AD_C6
	MOV	DPTR,#E_S_H
	CALL	DA_C6

	MOV	A,#01101000B		;u DlouHE = 5H
	CALL	AD_C6
	MOV	DPTR,#Dl_u
	CALL	DA_C6

	MOV	A,#01110000B		;A DLOUHE = 6H
	CALL	AD_C6
	MOV	DPTR,#DL_A
	CALL	DA_C6

	MOV	A,#01111000B		;I DLOUHE = 7H
	CALL	AD_C6
	MOV	DPTR,#DL_I
	
DA_C6:	CLR	A			;VYSLI 8 * DATA
	MOV	B,#8
CYK_DA:	PUSH	ACC
	MOVC	A,@A+DPTR		;NACTI Z CODE
	PUSH	DPH
	PUSH	DPL
	MOV	DPTR,#WDATA
	MOVX	@DPTR,A			;ZAPIS DO DEFIN. RAM DISPLEJE
	CALL	BUSY
	POP	DPL
	POP	DPH
	POP	ACC
	INC	A
	DJNZ	B,CYK_DA		;8 RADKU ZNAKU
	RET	

AD_C6:	MOV	DPTR,#WINST		;ADRESA C6
	MOVX	@DPTR,A
	CALL	BUSY
	RET
;-------------------------------
DL_Y:	DB	2,4,11H,11H,0FH,1,0EH,0
DL_E:	DB	2,4,0EH,11H,1FH,10H,0EH,0
C_S_H:	DB	0AH,4,14,10H,10H,11H,14,0
R_S_H:	DB	0AH,4,16H,19H,10H,10H,10H,0
E_S_H:	DB	0AH,4,14,11H,1FH,10H,14,0
Dl_u:	DB	2,4,11H,11H,11H,13H,0DH,0
DL_A:	DB	2,4,0EH,1,15,11H,15,0
DL_I:	DB	2,4,12,4,4,4,14,0
;********************************
	END
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Ruprecht
Příspěvky: 1114
Registrován: 28 zář 2005, 02:00
Bydliště: ZČ + JM

#32 Příspěvek od Ruprecht »

Já bych se nejdřív podíval do toho pascalu (help, příklady, knihovny...), jaké umí obsloužit řadiče tak nějak "nativně" pomocí vestavěných příkazů, což bude asi nejjednodušší cesta (když se ptáš na)
TextXY(x,y,'string')... PLOT(x,y) MOVE(X,Y)
Jak už psali kolegové dřív, třeba ten pascal umí HD44780, pak by stačilo nadefinovat 4/8bit připojení a správné nožičky, displej si vybereš třeba v TME nebo Dratek nebo Laska nebo Ali nebo kdekoli jinde
Kampaň, účelovka, nepodepsal, Palermo, ODS, Kalousek, je líp a jsou na to čísla, nastudujte si to.

Uživatelský avatar
voitano
Příspěvky: 466
Registrován: 02 pro 2009, 01:00

#33 Příspěvek od voitano »

Jen tak ze srandy jsem zkompiloval vzorové projety v C a basicu a velikostně to vyšlo stejně. no optimalizace je u MikroElektroniky celkem problém. Počítám, že i ten pascal by vyšel stejně, tak bych ho ani tak nezavrhoval

Uživatelský avatar
Mahoney
Příspěvky: 347
Registrován: 26 říj 2019, 02:00

#34 Příspěvek od Mahoney »

Ale o tomto tu nebyla tak úplně řeč, spíš šlo o to, že Pascal (a mj. dneska i Basic) má strukturu podobnou jako C, ale ten Pascal má víc obtěžující syntaxi, kde člověk píše spoustu rezervovaných slov v podstatě zbytečně tam, kde mu v C stačí jen závorky. To je jedna věc. Druhá věc je ta, že k C mu poradí daleko víc lidí, ale to už jsem psal, a další věc je, že k C sežene daleko víc kvalitních a dobře dokumentovaných kompilátorů, a to klidně i za cenu 0 čehokoliv, což u toho Pascalu kdovíjak moc nehrozí, a zejména ne v embedded scéně. Píše to i sám, zaplatil kopec a dostal podporu minimální (a v případě nových brouků žádnou, a ani si nejsem jist, že si ji v tom MicroPascalu může sám dopsat tak, jako se může v C celkem běžně).

Třeba zrovna zde na fóru poslední dobou často probírané Arduino se svým IDE - ono to není jenom o IDE, sada nástrojů (toolchain) skrytá za tímto IDE je velmi silná, a přitom je free/opensource (stejně jako to IDE). Že netřeba psát ve Wiringu / C++, ale lze i čisté C už se tu na fóru taky probíralo. Proč toho nevyužít?

A má pravdu i Nostalcomp. Pochopím, když toho má někdo doma hromadu v zásobách, taky nějaký mám, ale i tak je s tím "děsnej opruz", a kdybych to měl dneska kupovat, tak si fakt koupím radší rovnou jakýkoliv AVR za stejnou (či o málo vyšší) cenu, ale za tu cenu s neporovnatelným výkonem i výbavou a hlavně přímou podporou toho IDE… šetří to nervy i čas, má to být radost když už se tím bavíme, ne opruz

(Ale jistým způsobem to chápu, taky nerad vyhazuju starý brouky, a to hlavně kvůli přírodě - "ať se to radši nějak využije"… potíž je, že ta využitelnost je fakt malá)

Když chce poznat, jak to chodí "přímo na železe", potřebuje si to osahat v assembleru, a až se pak odlepí z assembleru, tak nejbliižší low-level jazyk "nejvíc neomezenej" je C, jiné ho tak blízko nepustí.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“