kcmr Poziom 3

Joined: 03 Feb 2009 Posts: 7 Location: Kalisz
|
#3
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
|
|