Hello EveryBody, I am working on LCD (16x2) and i have built some of my ideas about LCD programming but i am using Assembly language for my LCD, well as all things was going sweet so as every programmer is having something wrong ... (in starting) my problem specification is that i am using that LCD in 8-bit mode and i have connected my AT89C2051 (with some pull-ups) P1 DB P3.7 RS P3.5 RW P3.4 E and i have interfaced my LCD with my MCu but my problem is that i am getting the LCD not working ... (i dont know why) .... i have interfaced my LCD but there only little bit of contrast....i mean to say that there nothing visible... even i move my 10K-ohm-POT to the ground.....
and i have done some programming, so could any one please help me .... (i am really stucked) any help will be appritiatable.....
<code> ORG 0000H LJMP MAIN ORG 0030H RS EQU P3.7 RW EQU P3.5 EN EQU P3.4 MAIN: LCALL DELAY CLR EN MOV DPTR,#MYCOM LCALL LCD_INI MOV DPTR,#MYDATA LCALL LOOP MOV A,#0C9h LCALL COM LCALL DELAY MOV DPTR,#MYDAT2 LCALL LOOP AGAIN: SJMP AGAIN ;======================================== COM: MOV P1,A CLR RS CLR RW SETB EN LCALL DELAY CLR EN RET ;======================================== DATAW: MOV P1,A SETB RS CLR RW SETB EN LCALL DELAY CLR EN RET ;======================================== DELAY: MOV R6,#100 HERE2: MOV R7,#250 HERE: DJNZ R7,HERE DJNZ R6,HERE2 RET ;======================================== LCD_INI: CLR A MOVC A,@A+DPTR LCALL COM LCALL DELAY JZ GO_B1 INC DPTR SJMP LCD_INI GO_B1: RET ;======================================== LOOP: CLR A MOVC A,@A+DPTR LCALL DATAW LCALL DELAY INC DPTR JZ GO_B2 SJMP LOOP GO_B2: RET ;======================================== MYCOM: DB 38H,0EH,06,01,84H,0 MYDATA: DB "DAREDEVIL",0 MYDAT2: DB "GUNS AND ROSES",0 ;======================================== END </code>
Asif Ali "DareDevil"
There are 3 things that you need to do: 1) Get the tech docs for the LCD and read it. The document will have a table showing all the command words and probably a flow diagram on how to initialize and read/write data to the LCD.
2) There are a lot of code samples on the web. Try searching.
3) Why assembly? Try learning 'C'.
Hello sir I as you have said that Why Assembly ? use C. so sir the answer is that i was C programmer but for evantually i have learnt the Assembly just for my LCD interfacing and i have done very much hard working in learning Assembly :-( well i will create the program in C also but as you have pointed out that pin3 to ground ... well i have tried that but there is problem that only the Second coulmn of LCD is showing me Black boxes ... and that boxes are not very much black .... (Why?)
And thank you for your Reply well and hoping that you will help me little more..
i have read the DataSheet of 16x2 LCD (HD44780A) but nothing good is happend .... :-(
i was C programmer 1) that C is 'self documenying' is a myth that has been debunked often, did you believe that one? 2) whatever C is or is not, assembly definitely is not in any way 'self documenying'
hoping that you will help me little more gladly will help with commented code.
The amazing thing is that if you commented your code and, as suggested above, compared it to the flowchart in the LCD datasheet I would bet you would find the problem yourself.
Erik
erik malund wrote: "The amazing thing is that if you commented your code ... I would bet you would find the problem yourself"
Absolutely. Code documentation is not meant just for 'other people read'. A well commented code will capture the programmer's intentions and clarify the effects of the related logic.
The best definition for a bug I've ever seen is:
A bug is a mismatch between the documentation and the actual behavior of a program.
You can write spaghettiware in pretty much any language. It doesn't really matter whether you program in C, Python or Assembly, as long as you write clear comments and structure your code cleanly. But PLEASE, never write comments like "load 0x41 into the accumulator", or "go to LOOP".
I wrote above: "None of the instructions you are using affect the Z flag, ..."
Which is ABSOLUTE NONSENSE! Please forgive-me for that. OF COURSE, the 8051 core has no Z flag. Testing for zero in A should work as written. (thank you all for not flaming immediately)
The fact that I routinely write 8051 assembly functions does not make my gross mistake better. I can only blame it to cross-cpu contamination or brain damage :-0
Anyway, I am following this subject in the other forum you have started, and you seem to have progressed to the point of locating your mistake in the initialization code. The Hitachi documentation specifies that you send the init sequence to the display 4 times, with a delay of 10ms between sequences. Check your timings.
Well sir i have checked my initialization according to HD44780 in my simulator i have found that its 0.012S so i think that its very enough for delay purpose Right ?
View all questions in Keil forum