<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=24&amp;t=7076&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-15T16:38:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=24&amp;t=7076&amp;mode</id>
<entry>
<author><name><![CDATA[Manos]]></name></author>
<updated>2014-05-15T16:38:11+01:00</updated>
<published>2014-05-15T16:38:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7076&amp;p=81210#p81210</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7076&amp;p=81210#p81210"/>
<title type="html"><![CDATA[8051 ASM, Problem z podłączeniem klawiatury PS/2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7076&amp;p=81210#p81210"><![CDATA[
Witam,<br />mam problem z podłączeniem klawiatury PS/2 do 8051 i wyświetlenie na LCD 2x16 odebranych znaków. Póki co odebrane kody nie są zamieniane na kody ASCII ponieważ i tak nic nie wyświetla się na LCD (LCD działa, wyświetla napis &quot;Znaki:&quot; Który wyświetlam mu na początku). Obstawiam, że nie rozumiem do końca obsługi klawiatury. Pisząc kod wzorowałem się na: <a href="http://ep.com.pl/files/4891.pdf"  class="postlink">Link</a> i został przeze mnie zrozumiany jednak wydaje mi się, że coś jest nie tak z ustawianiem stanów na DATA i CLOCK. Proszę o pomoc, żeby cokolwiek wyświetliło mi się na LCD przy wciskaniu klawiszy(cokolwiek bo jak piszę wcześniej nie dekoduje jeszcze kodów klawiszy). Linie CLOCK i DATA podciągnięte do VCC przez R=4.4k. Poniżej zamieszczam kod programu. Robię obowiązkowy projekt do szkoły. Pozdrawiam i proszę o jakąkolwiek pomoc.<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">;=============================================================================<br />;                     DEFINICJE I INFORMACJE<br />;=============================================================================<br />;Port szyny danych LCD<br />   D_PORT   EQU   P2   ;Port do ktorego podlaczylismie linie danych LCD<br /><br />;Uzyte piny uC<br />   RS   EQU   P1.0   ;Pin RS LCD<br />   RW   EQU   P1.1   ;Pin RW LCD<br />   ENABLED   EQU P1.2   ;Pin ENABLED LCD<br />   D4   EQU   P2.4   ;Pin D4 LCD<br />   D5   EQU   P2.5   ;Pin D5 LCD<br />   D6   EQU   P2.6   ;Pin D6 LCD<br />   D7   EQU   P2.7   ;Pin D7 LCD<br />   K_DATA   EQU   P3.3   ;Pin DATA klawiatury<br />   K_CLOCK   EQU   P3.2   ;Pin CLOCK (INT0 lub INT1) klawiatury<br /><br />;Uzyte Rejesry<br />   ;R0 - Bajt wysylany do LCD<br />   ;R1 - Wykorzystywany w DElAY<br />   ;R2 - Wykorzystywany w DELAY<br />   ;R3 - Bajt odebrany z klawiatury<br />   ;R4 - Zawiera numer odbieranego bitu podczas odbioru z klawiatury<br /><br />;Uzyte Bity<br />   ;B.0 - zapamietuje LCD RS<br />   ;B.1 - zapamietuje LCD RW<br />   ;B.2 - Informuje o odebraniu bajtu z klawiatury<br />   ;B.3 - Zawiera bit parzystosci<br />   ;B.6 - Inicjalizacja LCD<br />   ;B.7 - informuje o LCD Busy<br />;Uzyte Peryferie<br />   ;INT0 - Przerwanie powodujace odczyt bitu<br />   ;T1 - Przerwanie od T1 zabezpiecza przed utknieciem programu<br />       ;Podczas odczytywania bajtu<br /><br />;=============================================================================<br />;                           MAIN<br />;=============================================================================<br />;Start Programu<br />   LJMP   INIT<br />   <br />   ORG   0ABh<br />   LJMP   intT1<br />   ORG 0A8h<br />   LJMP   intINT0<br />   <br />   ORG   100h<br />INIT:<br />   LCALL   KEYBOARD_INIT<br />   <br />   LCALL   LCD_INIT   ;Inicjalizacja LCD<br />   LCALL   LCD_CLR   ;Czysc LCD<br />   LCAlL   LCD_START   ;Zacznij wpisywac znaki<br />   <br />MAIN_LOOP:<br />   MOV   A,   R3<br />   JZ MAIN_LOOP<br />   SETB B.0<br />   CLR B.1<br />   MOV R0, A<br />   LCALL LCD_BUSY<br />   MOV R3, #0<br />   SJMP   MAIN_LOOP<br /><br />;=============================================================================<br />;                           LCD<br />;=============================================================================<br />TEXT_LINE_1:<br />   DB   'Znaki:',   0   ;Tekst do wyswietlenia w 1 linii<br /><br />LCD_INIT:<br />   SETB   B.6<br />   MOV   R0, #00110000b   ;Sterowanie 8bit, 2linie, format 5x7px<br />   MOV   R1, #250<br />   MOV   R2, #59<br />   LCALL   DELAY   ;Czekaj ~15ms<br />   LCALL   LCD_WR_INSTR<br /><br />   MOV   R1, #100<br />   MOV   R2, #16<br />   LCALL   DELAY   ;Czekaj ~4,1ms<br />   LCALL   LCD_WR_INSTR<br />   <br />   MOV   R1, #100<br />   MOV   R2, #0<br />   LCALL   DELAY   ;Czekaj ~100us<br />   LCALL   LCD_WR_INSTR<br />   <br />   MOV   R0,   #00100000b   ;Sterowanie 4-Bit<br />   LCALL   LCD_WR_INSTR<br />   CLR   B.6<br />   <br />   MOV   R0,   #00101000b   ;Sterowanie 4-Bit<br />   LCALL   LCD_WR_INSTR<br />   <br />   MOV   R0, #00001111b   ;Wyswietlacz ON, Kursor ON, Mruganie Kursora OFF<br />   LCALL   LCD_WR_INSTR<br />   RET<br />   <br />LCD_CLR:<br />   MOV   R0, #00000001b   ;Czysci LCD<br />   LCALL   LCD_WR_INSTR<br />   MOV   R0, #00000011b   ;Ustawia kursor   na pozycji poczatkowej<br />   LCALL   LCD_WR_INSTR<br />   RET<br />   <br />LCD_START:<br />   MOV R0,   #10000000b   ;Zapis DDRAM - Pierwsza linia<br />   LCALL   LCD_WR_INSTR<br />   MOV   DPTR,   #TEXT_LINE_1<br />   LCALL   LCD_WR_TEXT<br />   RET<br />   <br />LCD_WR_INSTR:<br />   CLR   B.0 ;RS<br />   CLR   B.1   ;RW<br />   LCALL   LCD_BUSY<br />   RET<br />   <br />LCD_WR_TEXT:<br />   SETB   B.0 ;RS<br />   CLR   B.1   ;RW<br />LCD_REPEAT:<br />   CLR   A<br />   MOVC   A,@A+DPTR<br />   JZ   LCD_WR_TEXT_END<br />   MOV   R0,   A<br />   INC   DPTR<br />   LCALL   LCD_BUSY<br />   SJMP   LCD_REPEAT<br />LCD_WR_TEXT_END:<br />   RET<br />   <br />LCD_BUSY:<br />   CLR   RS<br />   SETB   RW<br />   ORL   D_PORT,   #11110000b<br />   SETB   ENABLED<br />   MOV   C, D7<br />   CLR   ENABLED<br />   MOV   B.7, C<br />   SETB   ENABLED   ;Odczyt równiez mlodszych 4 bitów statusu <br />    CLR   ENABLED   ;Konieczne dla HD44780 w trybie 4-bit <br />   JB   B.7,   LCD_BUSY<br />LCD_WR:<br />   MOV   C, B.0<br />   MOV   RS,   C<br />   MOV   C,   B.1<br />   MOV   RW,   C<br />   MOV   A,   R0<br />   ANL   A,   #11110000b<br />   ANL   D_PORT,   #00001111b<br />   SETB   ENABLED<br />   ORL   D_PORT,   A<br />   CLR   ENABLED<br />   JB   B.6,   LCD_WR_SKIP<br />   MOV   A,   R0<br />   SWAP   A<br />   ANL   A,   #11110000b<br />   ANL   D_PORT,   #00001111b<br />   SETB   ENABLED<br />   ORL   D_PORT,   A<br />   CLR   ENABLED<br />LCD_WR_SKIP:<br />   RET<br />   <br />DELAY:<br />   DJNZ   R1,   DELAY   ;Opoznienie = R1 + (250*R2)<br />   MOV   R1, #250<br />   DJNZ   R2, DELAY<br />   RET<br /><br />;=============================================================================<br />;                        KEYBOARD<br />;=============================================================================<br />KEYBOARD_INIT:<br />   ;Poczatkowe ustawienie zmiennych<br />   CLR   B.2<br />   CLR   B.3<br />   MOV   R4, #00h<br />   SETB   K_DATA<br />   SETB   K_CLOCK<br />   <br />   ;Ustawienie Przerwan<br />   SETB   IT0   ;Przerwanie INT0 przy zboczu opadajacym<br />   MOV   TMOD, #00100000b   ;T1 w trybie pierwszym - licznik 16-bitowy   <br />   MOV   IE,   #10001001b   ;Odblokowanie Przerwan T1 i INT0<br />   RET<br /><br />BIT_START:<br />   INC   R4   ;Zwiekszenie nr odczytywanego bitu<br />   CLR   B.2   ;Usuwa informacje o odbiorze bajtu - przychodzi nowy<br />   <br />   MOV   TH1, #00h   ;Ustawianie licznika T1<br />   MOV   TL1, #00h   ;Odlicza 65.35ms<br />   SETB   TR1   ;Wlaczenie licznika T1<br />   SJMP   BIT_READ_END   ;Zakoncz odczytywanie bitu<br />   <br />BIT_0:<br />   CJNE   A, #1, BIT_1   ;Proba odebrania Bitu 0<br />   MOV   A, 00h   ;Czysc odbierany bajt<br />   MOV   C, K_DATA   ;Odbierz Bit 0<br />   MOV   ACC.0, C<br />   SJMP   SAVE_BIT ;Zapisz Bit<br />   <br />BIT_1:<br />   CJNE   A, #2, BIT_2   ;Proba odebrania Bitu 1<br />   MOV   A,   R3<br />   MOV   C, K_DATA<br />   MOV   ACC.1, C<br />   SJMP   SAVE_BIT<br />   <br />BIT_2:<br />   CJNE   A, #3, BIT_3   ;Proba odebrania Bitu 2<br />   MOV   A,   R3<br />   MOV   C, K_DATA<br />   MOV   ACC.2, C<br />   SJMP   SAVE_BIT<br />   <br />BIT_3:<br />   CJNE   A, #4, BIT_4   ;Proba odebrania Bitu 3<br />   MOV   A,   R3<br />   MOV   C, K_DATA<br />   MOV   ACC.3, C<br />   SJMP   SAVE_BIT<br />   <br />BIT_4:<br />   CJNE   A, #5, BIT_5   ;Proba odebrania Bitu 4<br />   MOV   A,   R3<br />   MOV   C, K_DATA<br />   MOV   ACC.4, C<br />   SJMP   SAVE_BIT<br />   <br />BIT_5:<br />   CJNE   A, #6, BIT_6   ;Proba odebrania Bitu 5<br />   MOV   A,   R3<br />   MOV   C, K_DATA<br />   MOV   ACC.5, C<br />   SJMP   SAVE_BIT<br />   <br />BIT_6:<br />   CJNE   A, #7, BIT_7   ;Proba odebrania Bitu 6<br />   MOV   A,   R3<br />   MOV   C, K_DATA<br />   MOV   ACC.6, C<br />   SJMP   SAVE_BIT<br />   <br />BIT_7:<br />   CJNE   A, #8, BIT_PARITY    ;Proba odebrania Bitu 7<br />   MOV   A,   R3<br />   MOV   C, K_DATA<br />   MOV   ACC.7, C<br />   SJMP   SAVE_BIT<br />   <br />BIT_PARITY:<br />   CJNE   A, #9, BIT_STOP   ;Proba odebrania bit parzystosci<br />   INC   R4   ;Zwieksz nr odbieranego bitu<br />   MOV   C,   K_DATA<br />   MOV B.3, C   ;Zapisz bit parzystosci<br />   SJMP   BIT_READ_END<br />   <br />BIT_STOP:<br />   SETB   B.2   ;Poinformuj o zakonczeniu odbierania bajtu<br />   MOV   R4,   #00h   ;Czysc nr odbieranego bitu<br />   CLR   TR1   ;Zatrzymaj licznik TR1<br />   SJMP   BIT_READ_END<br /><br />SAVE_BIT:<br />   MOV   R3,   A   ;Zapamietanie odebranych bitow w rejestrze R3<br />   INC   R4   ;Zwiekszenie nr odczytywanego bitu<br />   SJMP   BIT_READ_END   ;Zakoncz odczytywanie bitu<br />   <br />BIT_READ_END:<br />   POP   PSW   ;Pobranie stanu wykonykowanego programu ze stosu<br />   POP   ACC   ;Pobranie akumulatora ze stosu<br />   RETI   ;Powrot z przerwania<br /><br />intINT0:   ;Obsluga przerwania INT0<br />   PUSH   ACC   ;Zapamietanie akumulatora na stosie<br />   PUSH   PSW   ;Zapamietanie stanu wykonykowanego programu na stosie<br />   <br />   MOV   A, R4      ;Jezeli   nr odbieranego bitu<br />   JZ   BIT_START   ;rowny 0, odczytaj BIT_STARTU<br />   <br />   SJMP   BIT_0   ;Jezeli   rozny od 0, sprobuj czytac BIT_0<br />      <br />intT1:   ;obsluga przerwania licznika T1<br />   CLR   TR1   ;Zatrzymanie licznika T1<br />   MOV   R4, 00h   ;Zakonczenie odczytywania kolejnych bitow<br />   RETI<br />   <br />;=============================================================================<br />;                           END<br />;=============================================================================<br />   END<br /><br /></div><br /><br /><span style="color: #FF0000">A słyszałeś o znaczniku syntax? Różowo-zielony J.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1842">Manos</a> — 15 maja 2014, o 16:38</p><hr />
]]></content>
</entry>
</feed>