??? 05/01/08 18:49 Modified: 05/01/08 18:51 Read: times |
#154269 - Some help Responding to: ???'s previous message |
;PROCESSOR: Atmel 89S8253 ;CRYSTAL: 12 MHz ;FILENAME: LCD-TEST.A51 ;DATE: 17/10/07 ;REVISIONS: 0.2 ;AUTHOR: BRUCE MONEY ;HARDWARE REQUIREMENTS: LCD AT89S8253 WITH DEBUG LED and 40 x 2 lcd. $INCLUDE (REG8252.INC) ;LED EQUATES LED equ P3.7 ;************** Hardware Equates ****************** EN EQU P2.7 ;LCD ENABLE RW EQU P2.6 ;LCD READ/WRITE RS EQU P2.5 ;LCD REGISTER SELECT BUSY EQU P0.7 ;LCD BUSY PORT (0.7) LCDDATA EQU P0 ;LCD DATA PORT (0) ;************** Memory Equates ****************** LEDTICK equ 40H LCDTICK equ 41H ;KEYPADTICK equ 42h ;LOCK equ 43h MCOUNT EQU 45h ;LCD DIGIT COUNTER ;************** Vector Addresses ****************** org 0000h sjmp start org 000Bh jmp TIMER0 ;TIMER 0 ISR ;************** Initital Setup ****************** start: LCALL INIT_LCD ;INITIAL LCD mov TMOD,#01H ;16BIT TIMER MODE mov TH0,#3Ch ;MOVE C3AF INTO THLO FOR 50ms tick mov TL0,#10101111B ;10101111B - AF (SEE ABOVE) BUT HEX VALUE DOESNT WORK? mov IE,#10000010B SETB TR0 MOV LEDTICK,#10d ;UPDATE LED EVERY 10 TICKS 10 * 50ms = 500ms MOV LCDTICK,#2d ;UPDATE LCD EVERY 2 TICKS 2 * 50ms = 100ms sjmp $ ;************** ISR For Timer 0 ****************** TIMER0: clr TR0 ;DISABLE TIMER 0 mov TH0,#3Ch ;RESET OF TIMER AFTER TICK mov TL0,#10101111B ;RESET OF TIMER AFTER TICK SETB TR0 ;ENABLE TIMER 0 jmp TASK_SCHEDULER ;CALL TASK SCHEDULER ;************** Task Scheduler ****************** TASK_SCHEDULER: LED_TICK: DJNZ LEDTICK,LCD_TICK ;CHECK LEDTICK IF NOT ZERO MOVE TO LCD_TICK CPL LED ;CHANGE LED STATE MOV LEDTICK,#10d ;RELOAD LEDTICK LCD_TICK: DJNZ LCDTICK, RETURN ;CHECK LCDTICK IF NOT ZERO MOVE TO RETURN CALL TEST ;CALL LCD TEST WRITE MOV LCDTICK,#2d ;RELOAD LCDTICK RETURN: RETI ;************** Welcome Message ****************** TEST: ORG 0200h db 'BRUCE RULES' MOV MCOUNT,#0Bh MOV DPTR,#0200h LCALL WRITE_LCD RETI ;************** LCD SUB ROUTINES ****************** WRITE_LCD: LCALL CLEAR_LCD LCD_NEXT: CLR A MOVC A,@A+DPTR LCALL WRITE_LCD_TEXT INC DPTR DJNZ MCOUNT,LCD_NEXT RET WAIT_LCD: CLR RS SETB RW SETB EN MOV LCDDATA, #0FFh MOV A,LCDDATA JB P0.7,WAIT_LCD <--- You can't check busy flag until after init CLR EN CLR RW RET INIT_LCD: MOV A,#3Ch LCALL LCD_COMMAND MOV A,#0Fh LCALL LCD_COMMAND LCALL CLEAR_LCD MOV A,#06h LCALL LCD_COMMAND RET LCD_COMMAND: CLR RS ;RS LOW TO INDICATE A COMMAND CLR RW ;RW LOW TO INDICATE WRITE MOV LCDDATA,A ;MOVE COMMAND IN ACCUMULATOR TO DATA PORT SETB EN ;RAISE EN TO INITIATE LCD COMMAND NOP ;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS NOP NOP NOP CLR EN ;LOWER EN LINE LCALL WAIT_LCD ;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE RET ;RETURN TO CALLING PROGRAM CODE CLEAR_LCD: MOV A,#01h ;SET ACCUMULATOR TO CLEAR SCREEN COMMAND LCALL LCD_COMMAND ;EXECUTE COMMAND RET WRITE_LCD_TEXT: SETB RS ;RS HIGH TO INDICATE TEXT DATA CLR RW ;RW LOW TO INDICATE WRITE MOV LCDDATA,A ;MOVE CHARACTER IN ACCUMULATOR TO DATA PORT SETB EN ;RAISE EN TO INITIATE LCD COMMAND NOP ;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS NOP NOP NOP CLR EN ;LOWER EN LINE LCALL WAIT_LCD ;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE RET ;RETURN TO CALLING PROGRAM CODE end In your initialization of the LCD, you are calling the routine LCD_COMMAND, which in turn is calling WAIT_LCD. In the WAIT_LCD routine you are checking the busy flag and you can't do that until after the initialization is mostly completed. Start by removing all the extra code that has nothing to do with the display and get it working first. Like this: ;PROCESSOR: Atmel 89S8253 ;CRYSTAL: 12 MHz ;FILENAME: LCD-TEST.A51 ;DATE: 17/10/07 ;REVISIONS: 0.2 ;AUTHOR: BRUCE MONEY ;HARDWARE REQUIREMENTS: LCD AT89S8253 WITH DEBUG LED and 40 x 2 lcd. $INCLUDE (REG8252.INC) ;LED EQUATES LED equ P3.7 ;************** Hardware Equates ****************** EN EQU P2.7 ;LCD ENABLE RW EQU P2.6 ;LCD READ/WRITE RS EQU P2.5 ;LCD REGISTER SELECT BUSY EQU P0.7 ;LCD BUSY PORT (0.7) LCDDATA EQU P0 ;LCD DATA PORT (0) ;************** Memory Equates ****************** ;MCOUNT EQU 45h ;LCD DIGIT COUNTER ;************** Vector Addresses ****************** org 0000h sjmp start ;************** Initital Setup ****************** start: CALL TEST sjmp $ ;************** Welcome Message ****************** ; ORG 0200h <--- unnecessary waist of space TEST: db 'BRUCE RULES',0 <--- note the extra zero at the end ; MOV MCOUNT,#0Bh <--- there's a better way MOV DPTR,#TEST LCALL WRITE_LCD RET ;************** LCD SUB ROUTINES ****************** WRITE_LCD: LCALL CLEAR_LCD LCD_NEXT: CLR A MOVC A,@A+DPTR JZ WRITE_END <--- This is looking for the extra zero at the end of string LCALL WRITE_LCD_TEXT INC DPTR AJMP LCD_NEXT ; DJNZ MCOUNT,LCD_NEXT WRITE_END: RET WAIT_LCD: CLR RS SETB RW SETB EN MOV LCDDATA, #0FFh MOV A,LCDDATA ; JB P0.7,WAIT_LCD <--- You can't check busy flag until after init MOV R0,#255 <--- simply delay DJNZ R0,$ CLR EN CLR RW RET INIT_LCD: MOV A,#3Ch LCALL LCD_COMMAND MOV A,#0Fh LCALL LCD_COMMAND LCALL CLEAR_LCD MOV A,#06h LCALL LCD_COMMAND RET LCD_COMMAND: CLR RS ;RS LOW TO INDICATE A COMMAND CLR RW ;RW LOW TO INDICATE WRITE MOV LCDDATA,A ;MOVE COMMAND IN ACCUMULATOR TO DATA PORT SETB EN ;RAISE EN TO INITIATE LCD COMMAND NOP ;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS NOP NOP NOP CLR EN ;LOWER EN LINE LCALL WAIT_LCD ;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE RET ;RETURN TO CALLING PROGRAM CODE CLEAR_LCD: MOV A,#01h ;SET ACCUMULATOR TO CLEAR SCREEN COMMAND LCALL LCD_COMMAND ;EXECUTE COMMAND RET WRITE_LCD_TEXT: SETB RS ;RS HIGH TO INDICATE TEXT DATA CLR RW ;RW LOW TO INDICATE WRITE MOV LCDDATA,A ;MOVE CHARACTER IN ACCUMULATOR TO DATA PORT SETB EN ;RAISE EN TO INITIATE LCD COMMAND NOP ;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS NOP NOP NOP CLR EN ;LOWER EN LINE LCALL WAIT_LCD ;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE RET ;RETURN TO CALLING PROGRAM CODE end I've not assembled this, so no guarantees. Hope it helps. Jon |
Topic | Author | Date |
Damaged LCD? | 01/01/70 00:00 | |
Some code comments first. | 01/01/70 00:00 | |
Thanks... | 01/01/70 00:00 | |
Well if you need it later... | 01/01/70 00:00 | |
Hmmpf. | 01/01/70 00:00 | |
Multiple Problems | 01/01/70 00:00 | |
My Bad!!! | 01/01/70 00:00 | |
:) some improvement | 01/01/70 00:00 | |
try to initialise at startup | 01/01/70 00:00 | |
Wahey...... O not quite | 01/01/70 00:00 | |
Hex value | 01/01/70 00:00 | |
Check your soldering. | 01/01/70 00:00 | |
Oops | 01/01/70 00:00 | |
Wahey..... o not AGain | 01/01/70 00:00 | |
Leading 0 | 01/01/70 00:00 | |
Leading zero | 01/01/70 00:00 | |
Some help | 01/01/70 00:00 | |
Cheers guys, all working now | 01/01/70 00:00 | |
Why You Were Content Dependant![]() | 01/01/70 00:00 | |
The filled in blocks indicate.. | 01/01/70 00:00 | |
No hardware but software problem | 01/01/70 00:00 |