E5376A0143981C26F2E2E362 Content-Type: text/plain; charset=iso-8859-2 Content-Transfer-Encoding: 8bit
Witam.
A witam debiutanta :-)
Zaczynam przygode z 8051 i szukam procedury, ktora wyswietlala by liczbe
> binarna, ktora znajduje sie w akumulatorze, na wyswietlacz
> 7 segmentowy(dwucyfrowy).
No to zróbmy tak:
Mamy w zmiennej TEMP liczbê do rozpisania na 2 cyfry wy¶wietlacza, zatem po wykonaniu kodu:
MOV A,TEMP MOV B,#10D DIV AB MOV LED_2,A MOV LED_1,B
Mamy ju¿ podzielone cyfry na LED_2 z bardziej znacz±c± czê¶ci± i LED_1 z mniej znacz±c± czê¶ci± cyfry. (Ty masz od razu w A, wiêc pierwszy MOV jest bez sensu - zostawiam go dla czytelno¶ci kodu) Dalej pozostaje nam zamieniæ warto¶ci w zmiennych LED_x na odpowiadaj±c± im reprezentacjê zapalonych/zgaszonych segmentów wy¶wietlacza. Zrobmy tak:
MOV A,LED_2
a nastêpnie wywo³ajmy procedurê konwersji:
CALL KODY
Gdzie cia³o procedury wyglada tak:
KODY:INC A MOVC A,@A+PC RET;gfbachde ZN0: DB 10000100B ;0 00H ZN1: DB 11010111B ;1 01H ZN2: DB 01001100B ;2 02H ZN3: DB 01000101B ;3 03H ZN4: DB 00010111B ;4 04H ZN5: DB 00100101B ;5 05H ZN6: DB 00100100B ;6 06H ZN7: DB 11000111B ;7 07H ZN8: DB 00000100B ;8 08H ZN9: DB 00000101B ;9 09H ZNA: DB 00000110B ;A 0AH ZNb: DB 00110100B ;b 0BH ZNC: DB 10101100B ;C 0CH ZNd: DB 01010100B ;d 0DH ZNE: DB 00101100B ;E 0EH ZNF: DB 00101110B ;F 0FH
Po rozkazie ret jest w zaremowaniu opisane jaka pozycja w bajcie odpowiada jakiemu segmentowi. Procedura siêga po bajt znajduj±cy siê w pamiêci programu, o adresie równym pozycji rozkazu MOVC + zawarto¶æ alumulatora A. Rozkaz INC A pozwala na ominiêcie bajtu zajmowanego przez rozkaz RET - w ten sposób maj±c 0 w A siêgamy dok³adnie w bajt odpowiadaj±cy za zdekodowanie segmentów dla warto¶ci 0 :-) Po powrocie z tej procedury mamy w A kod odpowiadaj±cy zapalonym/zgaszonym segmentom. Wystarczy wiêc wystawiæ go na porcie, gdzie jest podlaczony wy¶wietlacz. Np:
MOV P1,A
Jeszcze tylko zróbmy to samo dla mniej znacz±cej czê¶ci...czyli:
MOV A,LED_1 CALL KODY MOV P2,A
Wyja¶nienia wymaga zabawa z zmiennymi LED_1/LED_2. Mo¿na program upro¶ciæ i nie korzystaæ z tych zmiennych. U mnie taki uk³ad czêsto wystêpuje, poniewa¿ gdzie indziej w programie nastêpuje obliczanie wyników, a gdzie indziej wyswietlenie - gdzie¶ te kody musz± mieæ czê¶æ wspóln± ;-)
__ Pzd, Irek.N. ps asemble rulez, dobry wybór ;-)