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: 20508
Registrován: 02 dub 2011, 00: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: 1494
Registrován: 28 zář 2005, 00: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
Když promluví, tak buď kňučí, nebo lže.
Uživatelský avatar
voitano
Příspěvky: 523
Registrován: 02 pro 2009, 00: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: 759
Registrován: 26 říj 2019, 00: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í.
Uživatelský avatar
RayeR
Příspěvky: 1850
Registrován: 02 srp 2009, 00:00
Bydliště: Praha
Kontaktovat uživatele:

#35 Příspěvek od RayeR »

Kdysi sem taky mastil neco na 89C2051 v ASM, ale jak ten program rostl a rostl, tak sem se z toho poto... Mileho svaba sem vydloubnul a nasel jsem za nej nake docela dobre pinove kompatabilni AVR ATiny a napsal to znovu v C. Ano, to ladeni pres ISP proti prendavani do programartoru je nebe a dudy...
Odpovědět

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