| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Praad 
 
 
 Joined: 15 May 2008
 Posts: 5
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 15, 2008 1:07 pm |   |  
				| 
 |  
				|  	  | PCM programmer wrote: |  	  | In your schematic, you have the R/W pin connected to ground. With that connection, you must "comment out" the following line
 in the Flex LCD driver.   Do this by adding comment symbols in
 front of the line.  Example:
 
  	  | Quote: |  	  | // #define USE_LCD_RW   1 | 
 
 Then re-compile and test it.
 | 
 
 This morning i did :
 
 
  	  | Code: |  	  | #define USE_LCD_RW   0
 
 | 
 
 
 Is this the same thing?
 
 I'll try it as soon as possible (Monday... :s)
 
 
 thx²
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 15, 2008 1:24 pm |   |  
				| 
 |  
				| Absolutely not ! 
 If you define it as 0, it is still defined !
 
 You must comment it out if the R/W line is connected to ground.
 |  |  
		|  |  
		| Praad 
 
 
 Joined: 15 May 2008
 Posts: 5
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu May 15, 2008 1:38 pm |   |  
				| 
 |  
				| Ok thx for your help PCM Programmer. I'll try it Monday
  |  |  
		|  |  
		| Praad 
 
 
 Joined: 15 May 2008
 Posts: 5
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sat May 17, 2008 5:56 am |   |  
				| 
 |  
				| By using the lib how could i clear a line (the first or the second) ? I ask that because i would like to print a string which is displayed blinking.
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sat May 17, 2008 10:11 am |   |  
				| 
 |  
				| Please ask general questions about using an LCD in the main forum. |  |  
		|  |  
		| netmonster 
 
 
 Joined: 08 Aug 2008
 Posts: 1
 
 
 
			    
 
 | 
			
				| lcd_Print |  
				|  Posted: Fri Aug 08, 2008 6:33 am |   |  
				| 
 |  
				| Hi all, I really thank u for this amazing driver, I'm using it to dive my LCD 2X16 and it is perfect.
 
 Well I wanted to add some extensions to the driver and I'll post them as soon as i finish...
 
 Good luck all
 
  |  |  
		|  |  
		| zafzaf82 
 
 
 Joined: 20 Jun 2006
 Posts: 1
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Sep 04, 2008 5:34 pm |   |  
				| 
 |  
				|  	  | Code: |  	  | /* for 4x20 LCD and 2x16 LCD
 * Filename : lcd.c
 * Hardware : Controller  -> all pic series
 */
 
 /**** LCD pinleri ****/
 #define LCD_en PIN_D2  //lcdyi yetkilendirmek icin
 #define LCD_rs PIN_D3  //konut yada kod yapmak icin
 #define LCD_D7 PIN_D7  //lcd veri yolu pin tasarrufu için 4 bit kullandık
 #define LCD_D6 PIN_D6
 #define LCD_D5 PIN_D5
 #define LCD_D4 PIN_D4
 /*********************/
 //LCD_rw ucu 0'a bagli
 
 #define lcd_line_bir  0x80 // LCD RAM adres 1. satir
 #define lcd_line_iki  0xC0 // LCD RAM adres 2. satir
 #define lcd_line_uc   0x94 // LCD RAM adres 3. satir
 #define lcd_line_dort 0xD4 // LCD RAM adres 4. satir
 
 /***************************************************
 * Prototype(s)                                    *
 ***************************************************/
 void LCD_yetkilendirme();                          // LCD yetkilendirme
 void LCD_komut(unsigned char komut);               // LCD komut
 void LCD_putc(unsigned char ascii);                // LCD tek karakter yazma
 void LCD_string_yaz(unsigned char *lcd_string);    // LCD string yazma
 void LCD_init();
 void LCD_goto_xy(unsigned char x,unsigned char y);
 
 /***************************************************
 * Sources                                         *
 ***************************************************/
 
 //===================================================
 void LCD_yetkilendirme()
 //===================================================
 {
 output_bit( LCD_en , 0); /* Clear bit EN */   //lcd yi bir kere yetki,lendirmek için
 delay_ms(2);
 output_bit( LCD_en , 1); /* Set bit EN */
 }
 
 //===================================================
 void LCD_komut(unsigned char komut)   //lcdye komut gönder
 //===================================================
 {
 unsigned char nibble;
 output_bit( LCD_rs , 0); /* Clear bit RS */
 nibble = (komut>>4) & 0x0F;  //ilk 4 bitini gönderdik
 output_bit(LCD_D4 , (nibble & 0x01) );       //pinlere tek tek gönderdik. buton tek seferde göndermediği için
 output_bit(LCD_D5 , (nibble>>1 & 0x01) );
 output_bit(LCD_D6 , (nibble>>2 & 0x01) );
 output_bit(LCD_D7 , (nibble>>3 & 0x01) );
 LCD_yetkilendirme();
 nibble = komut & 0x0F;
 output_bit(LCD_D4 , (nibble & 0x01) );
 output_bit(LCD_D5 , (nibble>>1 & 0x01) );
 output_bit(LCD_D6 , (nibble>>2 & 0x01) );
 output_bit(LCD_D7 , (nibble>>3 & 0x01) );
 LCD_yetkilendirme();
 delay_ms(2);
 }
 //===================================================
 void LCD_putc(unsigned char ascii)   //karakter gönderir. tek karakter
 //===================================================
 {
 unsigned char nibble;
 output_bit( LCD_rs , 1); /* Set bit RS *///veri gönderdiğin için 1 oldu.
 nibble = (ascii>>4) & 0x0F;//0x0f ile maskeliyor.
 output_bit(LCD_D4 , (nibble & 0x01) );       //pinlere tek tek gönderdik. buton tek seferde göndermediği için
 output_bit(LCD_D5 , (nibble>>1 & 0x01) );
 output_bit(LCD_D6 , (nibble>>2 & 0x01) );
 output_bit(LCD_D7 , (nibble>>3 & 0x01) );
 LCD_yetkilendirme();
 nibble = ascii & 0x0F;
 output_bit(LCD_D4 , (nibble & 0x01) );
 output_bit(LCD_D5 , (nibble>>1 & 0x01) );
 output_bit(LCD_D6 , (nibble>>2 & 0x01) );
 output_bit(LCD_D7 , (nibble>>3 & 0x01) );
 LCD_yetkilendirme();
 delay_ms(2);
 }
 
 //===================================================
 void LCD_string_yaz(unsigned char *lcd_string)
 //===================================================
 {
 while (*lcd_string)
 {
 LCD_putc(*lcd_string++);
 }
 }
 
 void LCD_init()
 {
 output_bit( LCD_en , 1); /* Set bit EN */
 output_bit( LCD_rs , 0); /* CLr bit RS */
 LCD_komut(0x33);
 LCD_komut(0x32);
 LCD_komut(0x28);
 LCD_komut(0x0C);
 LCD_komut(0x06);
 LCD_komut(0x01); /* Clear */
 delay_ms(100);
 }
 
 //===================================================
 void LCD_goto_xy(unsigned char x, unsigned char y)   //lcdye istediğimiz yere veri yazmamızı sağlar. satir ve sütün olarak
 //x ,y=sutun,satir
 //===================================================
 {
 int adres;  //ramdeki adresi tutar
 
 switch( y )
 {
 case 1:
 adres = lcd_line_bir;
 break;
 case 2:
 adres = lcd_line_iki;
 break;
 case 3:
 adres = lcd_line_uc;
 break;
 case 4:
 adres = lcd_line_dort;
 break;
 }
 
 adres += x-1;
 LCD_komut(adres); //lcdye veri gönderiyor
 }
 
 | 
 
 
 
  	  | Code: |  	  | #include <18F452.h>
 #device adc=10
 #fuses HS,NOWDT,NOPROTECT,NOLVP
 #use delay(clock=40000000,,RESTART_WDT)
 #use rs232(baud=57600, xmit=PIN_C6, rcv=PIN_C7)
 #ORG 0x7000,0x7FFF {} // Added for bootloader
 #include <stdio.h>
 #include "LCD_zafer.c"
 
 void main()
 {
 setup_adc_ports( ADC_OFF  );
 SETUP_ADC(ADC_OFF);
 DISABLE_INTERRUPTS(GLOBAL);
 SETUP_CCP1(CCP_OFF);
 SETUP_CCP2(CCP_OFF);
 SET_TIMER0(RTCC_OFF);
 SET_TIMER1(T1_DISABLED);
 SET_TIMER3(T3_DISABLED);
 
 output_d(0x00);
 
 LCD_init();
 LCD_goto_xy(1,1);
 printf(LCD_putc,"    ZAFER ONUR      ");
 LCD_goto_xy(1,2);
 printf(LCD_putc,"  LCD DENEME V1.0   ");
 LCD_goto_xy(1,3);
 printf(LCD_putc,"********************");
 LCD_goto_xy(1,4);
 printf(LCD_putc,"********************");
 
 
 
 while(true);
 }
 
 | 
 |  |  
		|  |  
		| peaps 
 
 
 Joined: 15 Sep 2008
 Posts: 11
 Location: Hemel Hempstead, Hertfordshire, UK
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon Sep 15, 2008 3:26 pm |   |  
				| 
 |  
				| Hi, 
 I would like to mention a potential problem with this library, or maybe I'm doing something wrong..
 
 When I use the \n newline I get a garbage character output to the LCD. I have tried using a 16x2 device and also an 8x2 which did work, but also outputted the same weird character. I have remmed out the #define USE_LCD_RW line and set the pin constants, but apart from that the code is vanilla as taken from the first post.
 
 Does anyone else get this symptom? Using latest compiler on a 16F819.
 
 Thanks,
 
 Andy Peaple.
 
 
  	  | Code: |  	  | #include <16f819.h> #fuses INTRC_IO, NOWDT, NOPUT, NOMCLR, NOBROWNOUT, NOCPD
 #use delay(clock=8000000)
 #include <flex_lcd.c>
 
 //==========================
 void main()
 {
 
 setup_oscillator(OSC_8MHZ);
 setup_ccp1(CCP_OFF);
 setup_adc(ADC_OFF);
 setup_adc_ports(NO_ANALOGS);
 
 delay_ms(2000);
 lcd_init();  // Always call this first.
 
 lcd_putc("\fHello World\n");
 lcd_putc("Line Number 2");
 
 while(1);
 }
 | 
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Sep 15, 2008 3:33 pm |   |  
				| 
 |  
				| 1.  Post the manufacturer and part number of the 16x2 LCD. 
 2.  Post your compiler version.
 
 3.  Post the list of #define statements for the pin connections
 between the PIC and the 16x2 LCD.
 
 4.  Post the list of physical connections (wires or tracks) between
 the LCD and the PIC.
 
 5.  Have you connected the R/W pin on the LCD to ground ?
 If not, what is it connected to ?
 |  |  
		|  |  
		| peaps 
 
 
 Joined: 15 Sep 2008
 Posts: 11
 Location: Hemel Hempstead, Hertfordshire, UK
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon Sep 15, 2008 3:58 pm |   |  
				| 
 |  
				| 1. Display is made by: Orient Display Co. Ltd., part no. OD-DM1602F. 2. Compiler version: 4.013
 
 3. LCD pin defines:
 
 #define LCD_DB4   PIN_B3
 #define LCD_DB5   PIN_B2
 #define LCD_DB6   PIN_B1
 #define LCD_DB7   PIN_B0
 
 #define LCD_E     PIN_A2
 #define LCD_RS    PIN_A3
 #define LCD_RW    PIN_A4
 
 4. Pin mappings:
 
 PIN_A2 -=> Enable
 PIN_A3 -=> Register Select
 PIN_B0 -=> Data_7
 PIN_B1 -=> Data_6
 PIN_B2 -=> Data_5
 PIN_B3 -=> Data_4
 
 PIN_A4 is not connected to anything.
 
 5. The R/W terminal on the LCD module is tied directly to ground.
 
 Thanks
 Andy P.
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Sep 15, 2008 4:35 pm |   |  
				| 
 |  
				| I don't have vs. 4.013.  I have 4.014 and compiled it for that, and compared the .LST file to vs. 4.079.   They're effectively the same.
 You don't have the NOLVP fuse but the compiler sets that for you
 so that's not the problem.   (However, check the end of your .LST
 file to confirm this, since you are using a slightly earlier version).
 
 It's possible that there's a problem with the lack of using the R/W pin.
 There are several ways to test this.
 
 1.  You could remove the GND on the LCD's R/W pin and connect it
 to pin A4 on the PIC.    Uncomment the USE_RW_PIN line in the
 flex driver file.   See if it now works when the R/W pin is used.
 
 Or,
 
 2.  It's possible that the problem is caused by sensitivity in your LCDs
 to the size of the delays in the flex driver.  You could increase the
 delay in the send_byte() routine from 60 us, to say, 100 us or more.
 
 Also,
 
 You could temporarily reduce the speed of the internal oscillator. Set
 your use delay statement to 1 MHz.    Change the setup_oscillator()
 statement to 1 MHz.  You actually don't need this statement.  When the
 compiler sees the fuse #use delay() statement, it puts in code which
 does the same thing as the setup_oscillator() statement.  But anyway,
 see if the lower oscillator frequency makes it start working.   If so, this
 is a clue that the delays in the flex driver must be increased for your LCD.
 |  |  
		|  |  
		| peaps 
 
 
 Joined: 15 Sep 2008
 Posts: 11
 Location: Hemel Hempstead, Hertfordshire, UK
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Tue Sep 16, 2008 4:02 pm |   |  
				| 
 |  
				| Hi, thanks for the reply. 
 I have tried connecting the R/W pin to the LCD module, increasing the delay from 60us to 500us and reducing the clock speed of the PIC to 1Mhz, but unfortunately I still get the weird character after a new line.
 
 I have also tried it on a different LCD, a 16x1. I get a different type of character on this module.
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  |  
		|  |  
		| peaps 
 
 
 Joined: 15 Sep 2008
 Posts: 11
 Location: Hemel Hempstead, Hertfordshire, UK
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon Sep 29, 2008 1:25 pm |   |  
				| 
 |  
				| Just tried the CCS driver lcd.c, but still getting weird char at a \n. 
 Similar code still...
 
  	  | Code: |  	  | #include <16f819.h> #use delay(clock=1000000)
 #include <lcd.c>
 #fuses INTRC_IO, NOWDT, NOPUT, NOMCLR, NOBROWNOUT, NOCPD
 #bit LED = 5.1
 
 
 void main(void) {
 
 //   set_tris_a(0b00000000);
 setup_oscillator(OSC_1MHZ);
 setup_ccp1(CCP_OFF);
 setup_adc(ADC_OFF);
 setup_adc_ports(NO_ANALOGS);
 
 LED = 1;
 delay_ms(1000);
 LED = 0;
 
 
 lcd_init();
 
 while(1==1) {
 delay_ms(500);
 LED = 1;
 lcd_putc("\f12345678");
 delay_ms(500);
 
 
 lcd_putc("\f********\n--------");
 delay_ms(250);
 }
 
 }
 | 
 
 I'll try that other library you mentioned next..
 Andy
 |  |  
		|  |  
		| peaps 
 
 
 Joined: 15 Sep 2008
 Posts: 11
 Location: Hemel Hempstead, Hertfordshire, UK
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Sat Oct 04, 2008 10:40 am |   |  
				| 
 |  
				| I have found out what the problem is, and frankly, I am surprised that no one else has come across this before. This problem also exists with the CCS lcd.c driver that ships with the compiler. 
 The strange character is not due to '\n' but rather NULL CHARS at the end of strings.
 
 When calling lcd_putc("Hello World");
 
 a '\0' also gets sent at the end of the string which the LCD just outputs as garbage.
 
 To get around this problem I have made a very small ammendment to the lcd_putc() function:
 
 
  	  | Quote: |  	  | void lcd_putc( char c) { switch (c) {
 case '\f'   : lcd_send_byte(0,1);
 delay_ms(2);
 break;
 case '\n'   : lcd_gotoxy(1,2);        break;
 case '\b'   : lcd_send_byte(0,0x10);  break;
 // do nothing in case of Null char
 case '\0'   : break;
 default     : lcd_send_byte(1,c);     break;
 }
 }
 | 
 
 Note the additional switch statement that handles null chars.
 
 Andy Peaple
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |