FAQ | Points | Add... | Recent posts | Search | Register | Log in


3 programy dla AT89S52 w asm.


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> 51 Microcontrollers -> 3 programy dla AT89S52 w asm.
Author
Message
kcmr
Poziom 3
Poziom 3


Joined: 03 Feb 2009
Posts: 7
Location: Kalisz

Post#1 Post from the author of the topic 25 May 2009 20:32   

3 programy dla AT89S52 w asm.


Witam potrzebuje trzech prostych programów w asemblerze z pakietu RIDE, dla układu AT89S52. Jestem całkowicie zielony z asemblera, a programy maja posłużyć jako demonstracja działani urządzeń zewnetrznych podłączonych do układu AT89S52 (wszystko razem znajduje się na zestawie uruchomieniowym ZL2MCS51)

Programy, które potrzebuje powinny zademonstorwac nastepujące rzeczy:

1. klawiatura + ukłąd przerwav (czyli program wyzwalajacy przerwanie poprzez uzycie klawiatury)

2. 7-segmentowy wyświetlacz LED ( zapalenie segmentów np. liczba 2009)

3. Wyswietlacz LCD (wyświetlenie prostego tekstu na wyswietlaczu np. imie i nazwisko )

Jesli ktoś posiada jakieś gotowce to prosiłbym o pomoc. Szukam już sporo czasu i nie moge znaleźć nic coby przeszło bez błędów przez kompilator Raisonance, a później zadziałało na moim układzie. Programy mogą być krótkie i jak najprostsze.
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 25 May 2009 20:32   





Back to top
   
Elektrooonik
Poziom 21
Poziom 21


Joined: 31 Aug 2004
Posts: 1218
Location: Siedlce/Warszawa

Post#2 25 May 2009 22:46   

Re: 3 programy dla AT89S52 w asm.


popatrz do tematu gdzie sa wrzucane kody do dsm51 taki temat chyba w dziale poczatkujacy nauka - sprawozdania dsm51
Back to top
   
Google

Google Adsense


Post# 25 May 2009 22:46   





Back to top
   
kcmr
Poziom 3
Poziom 3


Joined: 03 Feb 2009
Posts: 7
Location: Kalisz

Post#3 Post from the author of the topic 08 Jun 2009 17:03   

Re: 3 programy dla AT89S52 w asm.


ok programy już mam, ale pojawił mi się jeden nowy problem z LCD. Polega on na tym, że podczas wyświetlania ruchomego tekstu na LCD 2x16 po pewnym czasie zamiast konkretnego napisu pojawiają mi się niechciane znaki. W czym może byc problem?? Prosiłbym o pomoc. Ponizej dołanczam program w asemblerze, jeśli ktoś ma mozliwośc niech go sprawdzi u siebie i da odpowiedz czy podobne zjawisko u niego występuje.

Code:
;

$mod51
;

$LIST

;
REG0            EQU     0
REG1            EQU     1
REG2            EQU     2
REG3            EQU     3
REG4            EQU     4
REG5            EQU     5
REG6            EQU     6
REG7            EQU     7
;
LCD_E           EQU     p0.6
LCD_RW          EQU     P0.5
LCD_RS          EQU     P0.4
;
LCD_DB7         EQU     P0.3
LCD_DB6         EQU     P0.2
LCD_DB5         EQU     P0.1
LCD_DB4         EQU     P0.0
;
RESET           EQU     00H
EXTI0           EQU     03H
TIMER0          EQU     0BH
EXTI1           EQU     13H
TIMER1          EQU     1BH
SINT            EQU     23H
;
;-----------------------------------------------------------------------------
;
                DSEG
;-----------------------------------------------------------------------------
                ORG     8
STACKAREA:      DS      40              ;
REGISTERS:      DS      8               ;
TextBase:       DS      2               ;
;
;-----------------------------------------------------------------------------
;
                CSEG
;
;-----------------------------------------------------------------------------
                ORG     RESET                   ;       RESET SERVICE
                LJMP    RESET_SERVICE           ;
;-----------------------------------------------------------------------------
                ORG     EXTI0                   ;       EXT. INT. 0 SERVICE
                RETI                            ;
;-----------------------------------------------------------------------------
                ORG     TIMER0                  ;       TIMER/COUNTER. INT. 0 SERVICE
                RETI                            ;
;-----------------------------------------------------------------------------
                ORG     EXTI1                   ;       EXT. INT. 1 SERVICE
                RETI                            ;
;-----------------------------------------------------------------------------
                ORG     TIMER1                  ;       TIMER/COUNTER. INT. 1 SERVICE
                RETI                            ;
;-----------------------------------------------------------------------------
                ORG     SINT                    ;       SERIAL INT. SERVICE
                RETI                            ;
;-----------------------------------------------------------------------------
SetDBus:                                        ;PROCEDURE SetDBus ( A : BYTE ) ;
;****************                               ;BEGIN (* SetDBus *)
                MOV     C , ACC.7               ;
                MOV     LCD_DB7 , C             ;
                MOV     C , ACC.6               ;
                MOV     LCD_DB6 , C             ;
                MOV     C , ACC.5               ;
                MOV     LCD_DB5 , C             ;
                MOV     C , ACC.4               ;
                MOV     LCD_DB4 , C             ;
                RET                             ;END (* SetDBus *) ;
;-----------------------------------------------------------------------------
E_Strobe:                                       ;PROCEDURE E_Strobe ;
;****************                               ;BEGIN (* E_Strobe *)
                SETB    LCD_E                   ; [E=1]
                NOP                             ;
                NOP                             ;
                NOP                             ;
                NOP                             ;
                NOP                             ;
                NOP                             ;
                CLR     LCD_E                   ; [E=0]
                RET                             ;END (* E_Strobe *) ;
;-----------------------------------------------------------------------------
SpecialLCDOutC:                                 ;PROCEDURE SpecialLCDOutC ( A : BYTE ) ;
;****************                               ;BEGIN (* SpecialLCDOutC *)
                LCALL   SetDBus                 ; SetDBus ( A [ 7 .. 4 ] ) ;
                CLR     LCD_RS                  ; [RS=0]
                CLR     LCD_RW                  ; [R/W=0]
                LCALL   E_Strobe                ; E_Strobe ( ) ;
                RET                             ;END (* SpecialLCDOutC *) ;
;-----------------------------------------------------------------------------
LCDOutC:                                        ;PROCEDURE LCDOutC ( A : BYTE ) ;
;****************                               ;BEGIN (* LCDOutC *)
                CLR     LCD_RS                  ; [RS=0]
                CLR     LCD_RW                  ; [R/W=0]
                LCALL   SetDBus                 ; SetDBus ( A [ 7 .. 4 ] ) ;
                LCALL   E_Strobe                ; E_Strobe ( ) ;
                SWAP    A                       ;
                LCALL   SetDBus                 ; SetDBus ( A [ 3 .. 0 ] ) ;
                LCALL   E_Strobe                ; E_Strobe ( ) ;
                RET                             ;END (* LCDOutC *) ;
;-----------------------------------------------------------------------------
LCDInC:                                         ;PROCEDURE LCDInC ( VAR A : BYTE ) ;
;****************                               ;BEGIN (* LCDInC *)
                PUSH    B                       ;
                MOV     A , P1                  ;
                ORL     A , # 0F0H              ;
                MOV     P1 , A                  ;
                CLR     LCD_RS                  ; [RS=0]
                SETB    LCD_RW                  ; [R/W=1]
                SETB    LCD_E                   ; [E=1]
                MOV     C , LCD_DB7             ; A := [LCD] ;
                MOV     ACC.7 , C               ;
                MOV     C , LCD_DB6             ;
                MOV     ACC.6 , C               ;
                MOV     C , LCD_DB5             ;
                MOV     ACC.5 , C               ;
                MOV     C , LCD_DB4             ;
                MOV     ACC.4 , C               ;
                CLR     LCD_E                   ; [E=0]
                ANL     A , # 0F0H              ;
                MOV     B , A                   ;
                SETB    LCD_E                   ; [E=1]
                MOV     C , LCD_DB7             ; A := [LCD] ;
                MOV     ACC.7 , C               ;
                MOV     C , LCD_DB6             ;
                MOV     ACC.6 , C               ;
                MOV     C , LCD_DB5             ;
                MOV     ACC.5 , C               ;
                MOV     C , LCD_DB4             ;
                MOV     ACC.4 , C               ;
                CLR     LCD_E                   ; [E=0]
                ANL     A , # 0F0H              ;
                SWAP    A                       ;
                ORL     A , B                   ;
                POP     B                       ;
                RET                             ;END (* LCDInC *) ;
;-----------------------------------------------------------------------------
LCDOutD:                                        ;PROCEDURE LCDOutD ( A : BYTE ) ;
;****************                               ;BEGIN (* LCDOutD *)
                SETB    LCD_RS                  ; [RS=1]
                CLR     LCD_RW                  ; [R/W=0]
                LCALL   SetDBus                 ; SetDBus ( A [ 7 .. 4 ] ) ;
                LCALL   E_Strobe                ; E_Strobe ( ) ;
                SWAP    A                       ;
                LCALL   SetDBus                 ; SetDBus ( A [ 3 .. 0 ] ) ;
                LCALL   E_Strobe                ; E_Strobe ( ) ;
                RET                             ;END (* LCDOutD *) ;
;-----------------------------------------------------------------------------
Delay:                                          ;PROCEDURE Delay ;
;****************                               ;BEGIN (* Delay *)
                PUSH    REG3                    ;
                MOV     R3 , # 010H             ;
Delay_1:                                        ;
                NOP                             ;
                DJNZ    R3 , Delay_1            ;
                POP     REG3                    ;
                RET                             ;END (* Delay *) ;
;-----------------------------------------------------------------------------
WaitLCDAccept:                                  ;PROCEDURE WaitLCDAccept ;
;****************                               ;BEGIN (* WaitLCDAccept *)
WaitLCD_1:                                      ;
                LCALL   LCDInC                  ; A := LCDInC ( ) ;
                ANL     A , # 80H               ;
                JZ      WaitLCD_2               ;
                LCALL   Delay                   ;
                SJMP    WaitLCD_1               ;
WaitLCD_2:                                      ;
                RET                             ;END (* WaitLCDAccept *) ;
;-----------------------------------------------------------------------------
InitLCD:                                        ;PROCEDURE InitLCD ;
;****************                               ;BEGIN (* InitLCD *)
                MOV     A , # 00100000B         ; SpecialLCDOutC ( 00100000B ) ; 
                                                ;    set : dl = 4 bits
                LCALL   SpecialLCDOutC          ;
                LCALL   Delay                   ; Delay ;
                MOV     A , # 00100000B         ; LCDOutC ( 00100000B ) ; 
                                                ;    set : dl = 4 bits
                                                ;          li = 1 line
                                                ;               5 X 7 dot
                LCALL   LCDOutC                 ;
                LCALL   Delay                   ; Delay ;
                MOV     A , # 00100000B         ; LCDOutC ( 00100000B ) ;
                LCALL   LCDOutC                 ;
                LCALL   Delay                   ; Delay ;
                MOV     A , # 00100000B         ; LCDOutC ( 00100000B ) ;
                LCALL   LCDOutC                 ;
                LCALL   Delay                   ; Delay ;
                MOV     A , # 00001100B         ; LCDOutC ( 00001100B ) ;
                                                ;    set : display on
                                                ;          cursor off
                                                ;          cursor blink off
                LCALL   LCDOutC                 ;
                LCALL   Delay                   ; Delay ;
                MOV     A , # 00000110B         ; LCDOutC ( 00000110B ) ;
                                                ;    set : autoincrement
                                                ;          non shift mode
                LCALL   LCDOutC                 ;
                RET                             ;END (* InitLCD *) ;
;-----------------------------------------------------------------------------
ClrScrLCD:                                      ;PROCEDURE ClrScrLCD ;
;***************                                ;BEGIN (* ClrScrLCD *)
                MOV     A , # 00000001B         ; LCDOutC ( 00000001B ) ;
                LCALL   LCDOutC                 ;
                LCALL   WaitLCDAccept           ; WaitLCDAccept ;
                RET                             ;END (* ClrScrLCD *) ;
;-----------------------------------------------------------------------------
HomeLCD:                                        ;PROCEDURE HomeLCD ;
;***************                                ;BEGIN (* HomeLCD *)
                MOV     A , # 00000010B         ; LCDOutC ( 00000010B ) ;
                LCALL   LCDOutC                 ;
                LCALL   WaitLCDAccept           ; WaitLCDAccept ;
                RET                             ;END (* HomeLCD *) ;
;-----------------------------------------------------------------------------
SetCursonOn:                                    ;PROCEDURE SetCursonOn ;
;****************                               ;BEGIN (* SetCursonOn *)
                MOV     A , # 00001110B         ; LCDOutC ( 00001110B ) ;
                                                ;    set : display on
                                                ;          cursor on
                                                ;          cursor blink off
                LCALL   LCDOutC                 ;
                LCALL   Delay                   ; Delay ;
                RET                             ;END (* SetCursonOn *) ;
;-----------------------------------------------------------------------------
SetCursonOff:                                   ;PROCEDURE SetCursonOff ;
;****************                               ;BEGIN (* SetCursonOff *)
                MOV     A , # 00001100B         ; LCDOutC ( 00001100B ) ;
                                                ;    set : display on
                                                ;          cursor off
                                                ;          cursor blink off
                LCALL   LCDOutC                 ;
                LCALL   Delay                   ; Delay ;
                RET                             ;END (* SetCursonOff *) ;
;-----------------------------------------------------------------------------
WrChLCD:                                        ;PROCEDURE WrChLCD ( A : BYTE ) ;
;****************                               ;BEGIN (* WrChLCD *)
                LCALL   LCDOutD                 ; LCDOutD ( A ) ;
                LCALL   Delay                   ; Delay ;
                RET                             ;END (* WrChLCD *) ;
;-----------------------------------------------------------------------------
WriteLCD:                                       ;PROCEDURE WriteLCD ( DPTR : ADDRESS ) ;
;****************                               ;BEGIN (* WriteLCD *)
WriteLCD_3:                                     ; LOOP
                CLR     A                       ;  A := DPTR ^ ;
                MOVC    A , @ A + DPTR          ;
                JNZ     WriteLCD_1              ;  IF A = 0 THEN
                RET                             ;   RETURN ;
WriteLCD_1:                                     ;  END (* IF *) ;
                LCALL   WrChLCD                 ;  WrChLCD ( A ) ;
                INC     DPTR                    ;  INC ( DPTR ) ;
                LJMP    WriteLCD_3              ; END (* LOOP *) ;
                                                ;END (* WriteLCD *) ;
;-----------------------------------------------------------------------------
EnvirInit:                                      ;PROCEDURE EnvirInit ;
;****************                               ;BEGIN (* SoftInit *)
                CLR     LCD_E                   ; [E=0]
                RET                             ;END (* EnvirInit *) ;
;-----------------------------------------------------------------------------
LongDelay:                                      ;PROCEDURE LongDelay ;
;****************                               ;BEGIN (* LongDelay *)
                MOV     DPTR , # 00000H         ;
LoDe_0:                                         ;
                INC     DPTR                    ;
                MOV     A , DPL                 ;
                ORL     A , DPH                 ;
                JNZ     LoDe_0                  ;
                RET                             ;END (* LongDelay *) ;
;-----------------------------------------------------------------------------
HelloMessage:   DB      '   tekst tekst'  ,   0
               
MessageSize     EQU     20                      ;
;-----------------------------------------------------------------------------
Hello:                                          ;PROCEDURE Hello ;
;****************                               ;BEGIN (* Hello *)
                LCALL   HomeLCD                 ; HomeLCD ( ) ;
                MOV     DPL , LOW ( TextBase )  ; DPTH := TextBase ;
                MOV     DPH , LOW ( TextBase+1 );
                CLR     A                       ; B := 0 ;
                MOV     B , A                   ;
He_0:                                           ; LOOP
                CLR     A                       ;  A := DPTR ^ ;
                MOVC    A , @ A + DPTR          ;
                JNZ     He_1                    ;  IF A = 0 THEN
                MOV     DPTR , # HelloMessage   ;   DPTR := ADR ( HelloMessage ) ;
                MOVC    A , @ A + DPTR          ;   A := DPTR ^ ;
He_1:                                           ;  END (* IF *) ;
                INC     DPTR                    ;  INC ( DPTR ) ;
                PUSH    DPL                     ;
                PUSH    DPH                     ;
                LCALL   WrChLCD                 ;  WrChLCD ( A ) ;
                POP     DPH                     ;
                POP     DPL                     ;
                INC     B                       ;  B := B + 1 ;
                MOV     A , B                   ;  IF B = MessageSize THEN
                CJNE    A , # MessageSize , He_0;   EXIT ;
                                                ;  END (* IF *) ;
                                                ; END (* LOOP *) ;
                RET                             ;END (* Hello *) ;
;-----------------------------------------------------------------------------
FMessage:                                       ;PROCEDURE FMessage ( ) ;
;****************                               ;BEGIN (* FMessage *)
                MOV     DPTR , # HelloMessage   ; TextBase := ADR ( HelloMessage ) ;
                MOV     LOW ( TextBase ) , DPL  ;
                MOV     LOW ( TextBase+1 ) , DPH;
FMes_1:                                         ; LOOP
                LCALL   Hello                   ;  Hello ( ) ;
                LCALL   LongDelay               ;  LongDelay ( ) ;
                MOV     DPL , LOW ( TextBase )  ;  INC ( TextBase ) ;
                MOV     DPH , LOW ( TextBase+1 );
                INC     DPTR                    ;
                MOV     LOW ( TextBase ) , DPL  ;
                MOV     LOW ( TextBase+1 ) , DPH;
                CLR     A                       ;  IF TextBase ^ = 0 THEN
                MOVC    A , @ A + DPTR          ;
                JNZ     FMes_2                  ;
                MOV     DPTR , # HelloMessage   ;   TextBase := ADR ( HelloMessage ) ;
                MOV     LOW ( TextBase ) , DPL  ;
                MOV     LOW ( TextBase+1 ) , DPH;
FMes_2:                                         ;  END (* IF *) ;
                SJMP    FMes_1                  ; END (* LOOP *) ;
                                                ;END (* FMessage *) ;
;-----------------------------------------------------------------------------
RESET_SERVICE:                                  ;BEGIN (* LCD51 *)
                MOV     SP , #LOW ( STACKAREA ) ;
                LCALL   EnvirInit               ; EnvirInit ( ) ;
                LCALL   LongDelay               ; LongDelay ( ) ;
                LCALL   LongDelay               ; LongDelay ( ) ;
                LCALL   LongDelay               ; LongDelay ( ) ;
                LCALL   LongDelay               ; LongDelay ( ) ;
                LCALL   InitLCD                 ; InitLCD ( ) ;
                LCALL   ClrScrLCD               ; ClrScrLCD ( ) ;
                LCALL   FMessage                ; FMessage ( ) ;
Main_0:                                         ; LOOP
                LJMP    Main_0                  ; END (* LOOP *) ;
                                                ;END (* LCD51 *)
;-----------------------------------------------------------------------------
                END
 


p.s. autor programu: Andrzej Pawluczuk
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 08 Jun 2009 17:03   





Back to top
   
romsik
Poziom 13
Poziom 13


Joined: 08 Jan 2007
Posts: 114
Location: "-"

Post#4 08 Jun 2009 21:29   

Re: 3 programy dla AT89S52 w asm.


programu nie sprawdzałem, ale proponuję przy definicji tekstu zaraz po drugim apostrofie dać przecinek i zero, a jak nie pomoże to tekst wypełnić spacjami :)
pozdrawiam rs
ps
a jaki program wygenerował taki listing ?
Back to top
   
kcmr
Poziom 3
Poziom 3


Joined: 03 Feb 2009
Posts: 7
Location: Kalisz

Post#5 Post from the author of the topic 08 Jun 2009 21:41   

Re: 3 programy dla AT89S52 w asm.


hmm to nie jest listing, program skopiowany ze strony www, tylko ja pozmieniałem porty i napis tak by pasowało to mojego układu i tematu.

PO zmianie przecinka i zero, efekt jest nadal taki sam. Nadal pojawiają się jakieś "krzaki'


edycja:

jednak to nie winna programu, po podłączeniu troszke innego wyświetlacza wszystko było ok. Dodam, że obydwa wyświetlacze technicznie były takie same.
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> 51 Microcontrollers -> 3 programy dla AT89S52 w asm.
Page 1 of 1
Similar topics
Programator ISP dla AT89S52 [problem] (8)
2x DS18B20 dla AT89S52 w jezyku C (raisonance) (2)
Obsluga wyswietlacza w 51 (programy asm) (3)
[AT89S52][ASM] Jedna kość jako zewnętrzny RAM/ROM (6)
[AT89S52][asm] DS18B20 zmiana rozdzielczosci na 9bit (1)
AT89S52 i SPI, gotowa funkcja transmisji w ASM? (2)
Kompilacja ASM do HEX [AT89S52] (5)
kompilator ASM dla AT89s52 (2)
At89s52 stan wysoki na p2 dla czego? (3)
Programator dla AT89s52? ISP STK200/300? Schemat? (1)

Page generation time: 0.148 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed