??? 02/27/07 15:32 Read: times |
#133825 - LCD Problem |
Hi!
I am doing project on Micro-controller, where i am also using LCD. I read all material (HD44780 datasheet, tutorials given here and lcd datasheet), but I am not able to solve the problem. Here is full details of Hardware, Software and Observations. HARDWARE: AT89C51 WITH 12MHz CRYSTAL NO EXTERNAL MEMORY, ONLY IN-BUILT 4K FLASH MEMORY USED JHD 162A LCD PORT 2 CONNECTED TO DATA PORT OF LCD P0.5 --> ENABLE P0.6 --> RW P0.7 --> RS SOFTWARE: PROGRAM WRITTEN IN ASSEMBLY USING 'KEIL' ///// INITIALIZATION RS EQU P0.7 RW EQU P0.6 E EQU P0.5 ;P2 AS DATA PORT ;R5--> MSB OF COUNTER ;R6--> LSB OF COUNTER ;R7--> USED TO PASS DATA TO SUBROUTINE CSEG AT 0X0000 LJMP 0X0100 CSEG AT 0X0100 ////// LCD ALGORITHM: ///// 1. DELAY 15mSec START: MOV R5,#30 ;R5--> MSB OF COUNTER DLY1: MOV R6,#255 ;R6--> LSB OF COUNTER DJNZ R6, $ DJNZ R5,DLY1 ;TOTAL STATES = ((1+2*255)+2)*30 = 15390 ;TOTAL DELAY = 15390 * 1uSec = 15.39 mSec MOV P0,#0X00 MOV P2,#0X00 ;P0 & P2 CONFIGURED AS OUTPUT PORT ///// 2. INSTRUCTION 0X30 + DELAY 5mSec MOV R7,#0X30 ;R7--> USED TO PASS DATA TO SUBROUTINE LCALL INS ;INSTRUCTION OUTPUT SUBROUTINE MOV R5,#10 DLY2: MOV R6,#255 DJNZ R6, $ DJNZ R5,DLY2 ;TOTAL DELAY = ((1+2*255)+2)*10 = 5130 ///// 3. INSTRUCTION 0X30 + DELAY 160uSec MOV R7,#0X30 LCALL INS LCALL DLY_160U ///// 4. INSTRUCTION 0X30 + DELAY 160uSec MOV R7,#0X30 LCALL INS LCALL DLY_160U ///// 5. INSTRUCTION 0X38 + DELAY 160uSec (DATA LENGTH=8, LINES=2) MOV R7,#0X38 LCALL INS LCALL DLY_160U ///// 6. INSTRUCTION 0X08 + DELAY 160uSec (DISPLAY OFF, CURSOR OFF) MOV R7,#0X08 LCALL INS LCALL DLY_160U ///// 7. INSTRUCTION 0X01 + DELAY 160uSec (CLEAR DISPLAY) MOV R7,#0X01 LCALL INS LCALL DLY_160U ///// 8. INSTRUCTION 0X06 + DELAY 160uSec (INCREMENT CURSOR) MOV R7,#0X06 LCALL INS LCALL DLY_160U ///// 9. INSTRUCTION 0X0C + DELAY 160uSec (DISPLAY ON) MOV R7,#0X0C LCALL INS LCALL DLY_160U ///// 10. DATA DISPLAY MOV DPTR,#MSG ;INITIALIZE POINTER MOV R0,#0X0 ;INITIALIZE COUNTER NEXT: MOV A,#0X00 MOVC A,@A+DPTR ;FETCH DATA BYTE FROM INTERNAL EPROM SETB RS ;SELECT DATA REGISTER CLR RW ;WRITE MODE MOV P2,A ;OUTPUT DATA TO PORT 2 SETB E CLR E ;APPLY ENABLE PULSE LCALL DLY_160U INC DPTR ;INCREMENT TO NEXT DATA DJNZ R0,NEXT HERE: LJMP HERE ;~~~~~~END OF PROGARM~~~~~~~ //////////////////////////////////////////////////////////////////////////////// ///// SUBROUTINES CSEG AT 0X0E00 INS: CLR RS ;SELECT INSTRUCTION REGISTER CLR RW ;WRITE MODE MOV P2,R7 ;OUTPUT TO PORT 2 SETB E CLR E ;ENABLE PULSE RET DLY_160U: MOV R6,#160 DJNZ R6,$ ;TOTAL DELAY = 80*2*1uSec = 160uSec RET ////////////////////////////////////////////////////////////////////////////////// ///// MESSAGE MSG: DB 'NiK' END NOTE: 1. 1ST TIME WHEN I PROGRAMMED MICROCONTROLLER AND CONNECTED IN CIRCUIT, BACKLIGHT OF LCD FLICKERED FOR SOME TIME AND IT BECOME DEAM. THAN I FOUND THAT IC7805 STOPPED WORKING, IT WAS PROVIDING ONLY 4.1V. SO, THAN I CHANGED IC7805 AND IT WAS WORKING PROPERLY. 2. I TESTED CONNECTION FROM MICROCONTROLLER TO LCD PINS WITH CONTINUITY TESTER. 3. WHEN I MEASURED RESISTANCE ACROSS BRIGHTNESS CONTROL POT (CONNECTED IN BOARD), IT IS SHOWING ABT 4.8K ONLY (i.e. BETWEEN VCC AND GND). 4. TESTED CIRCUIT WITH BOTH INITIAL INSTRUCTION 30H &38H. |