| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| densimitre 
 
 
 Joined: 21 Dec 2004
 Posts: 45
 
 
 
			    
 
 | 
			
				| How make a LCD menu |  
				|  Posted: Sun Dec 26, 2004 8:01 pm |   |  
				| 
 |  
				| Hi 
 Tha is, how make a LCD menu with 4 keys, up/down, menu and enter??
 
 some experience??
 
 Thank you
 |  |  
		|  |  
		| kender 
 
 
 Joined: 09 Aug 2004
 Posts: 768
 Location: Silicon Valley
 
 
			          
 
 | 
			
				|  |  
				|  Posted: Sun Dec 26, 2004 8:32 pm |   |  
				| 
 |  
				| Pick a serial LCD (Jameco, for example, has a good selection).  Probably you'll be able to get away with just polling the buttons. 
 One of my favorite tricks is to put the buttons next to the display and then use it to show the captions for the buttons (instead of putting the captions into the artwork of the front panel).
 
 Good luck,
 Nick
 |  |  
		|  |  
		| Haplo 
 
 
 Joined: 06 Sep 2003
 Posts: 659
 Location: Sydney, Australia
 
 
			    
 
 | 
			
				| Re: How make a LCD menu |  
				|  Posted: Mon Dec 27, 2004 3:45 am |   |  
				| 
 |  
				|  	  | densimitre wrote: |  	  | Hi 
 Tha is, how make a LCD menu with 4 keys, up/down, menu and enter??
 
 some experience??
 
 Thank you
 | 
 
 A good way to create menus is to implement a state machine.
 |  |  
		|  |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 |  |  
		|  |  
		| treitmey 
 
 
 Joined: 23 Jan 2004
 Posts: 1094
 Location: Appleton,WI   USA
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Thu Jan 06, 2005 3:35 pm |   |  
				| 
 |  
				| Guest, show us your code.  The controler chip isn't show in the pdf, so all we can do is try to debug your code. |  |  
		|  |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| 4 line x 40 characters LCD module with HD44780 Controller |  
				|  Posted: Thu Jan 06, 2005 3:51 pm |   |  
				| 
 |  
				| Here is the "main.c"  code: 
  	  | Code: |  	  | #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000)
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
 #include <LCD_40_char.c>
 
 void main()
 {
 
 
 lcd_init();
 
 
 
 
 while(1)
 {
 
 delay_ms(400);
 printf(lcd_putc,"\fThis is Line One of the LCD\n");
 delay_ms(20);
 printf(lcd_putc,"\This is Line Two\n");
 delay_ms(20);
 printf(lcd_putc,"\This is Line Three\n");
 delay_ms(20);
 printf(lcd_putc,"\This is Line Four");
 delay_ms(1000);
 
 
 
 
 }
 }
 | 
 
 ============================================
 //
 //  Driver   "LCD_40_char.c " as follow:
 //
 //
 =============================================
 
  	  | Code: |  	  | //////////////////////////////////////////////////////////////////////////// ////                             LCDD.C                                 ////
 ////                 Driver for common LCD modules                      ////
 ////                                                                    ////
 ////  lcd_init()   Must be called before any other function.            ////
 ////                                                                    ////
 ////  lcd_putc(c)  Will display c on the next position of the LCD.      ////
 ////                     The following have special meaning:            ////
 ////                      \f  Clear display                             ////
 ////                      \n  Go to start of second line                ////
 ////                      \b  Move back one position                    ////
 ////                                                                    ////
 ////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)     ////
 ////                                                                    ////
 ////  lcd_getc(x,y)   Returns character at position x,y on LCD          ////
 ////                                                                    ////
 ////////////////////////////////////////////////////////////////////////////
 ////        (C) Copyright 1996,1997 Custom Computer Services            ////
 //// This source code may only be used by licensed users of the CCS C   ////
 //// compiler.  This source code may only be distributed to other       ////
 //// licensed users of the CCS C compiler.  No other use, reproduction  ////
 //// or distribution is permitted without written permission.           ////
 //// Derivative programs created using this software in object code     ////
 //// form are not restricted in any way.                                ////
 ////////////////////////////////////////////////////////////////////////////
 
 // This structure is overlayed onto the data ports so that you may use
 // whatever ports you desire
 
 struct lcd_pin_map
 {
 int unusedA;        // portA is not used
 int unusedB;        // portB is not used
 int unusedC;        // portC is not used
 int     data : 4;   // lower nibble of portD is used for data lines
 BOOLEAN enable;     // PinD4
 BOOLEAN rw;         // PinD5
 BOOLEAN rs;         // PinD6
 BOOLEAN dummy;      // PinD7 is not used
 } lcd;
 #if defined(__PCH__)
 #locate lcd = 0xF80
 #else
 #locate lcd = 5
 #endif
 
 struct lcd_tris_map
 {
 int unusedA;        // portA is not used
 int unusedB;        // portB is not used
 int unusedC;        // portC is not used
 int data     : 4;   // lower nibble of portD is used for data lines
 int control  : 3;
 BOOLEAN dummy;      // PinD7 is not used
 } lcdtris;
 
 #if defined(__PCH__)
 #locate lcdtris = 0xF92
 #else
 #locate lcdtris = 0x85
 #endif
 
 #define set_tris_lcd(x) lcdtris.data = (x); lcdtris.control = 0;
 
 
 
 #define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
 #define lcd_line_two 0x40    // LCD RAM address for the second line
 
 
 BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
 // These bytes need to be sent to the LCD
 // to start it up.
 
 
 // The following are used for setting
 // the I/O port direction register.
 
 #define LCD_WRITE    0       // For write mode all pins are out
 #define LCD_READ     15      // For read mode data pins are in
 
 BYTE lcd_read_byte() {
 BYTE low,high;
 set_tris_lcd(LCD_READ);
 lcd.rw = 1;
 delay_cycles(1);
 lcd.enable = 1;
 delay_cycles(1);
 high = lcd.data;
 lcd.enable = 0;
 delay_cycles(1);
 lcd.enable = 1;
 delay_us(1);
 low = lcd.data;
 lcd.enable = 0;
 set_tris_lcd(LCD_WRITE);
 return( (high<<4) | low);
 }
 
 
 void lcd_send_nibble( BYTE n ) {
 lcd.data = n;
 delay_cycles(1);
 lcd.enable = 1;
 delay_us(2);
 lcd.enable = 0;
 }
 
 
 void lcd_send_byte( BYTE address, BYTE n ) {
 
 lcd.rs = 0;
 while ( bit_test(lcd_read_byte(),7) ) ;
 lcd.rs = address;
 delay_cycles(1);
 lcd.rw = 0;
 delay_cycles(1);
 lcd.enable = 0;
 lcd_send_nibble(n >> 4);
 lcd_send_nibble(n & 0xf);
 }
 
 
 void lcd_init() {
 BYTE i;
 set_tris_lcd(LCD_WRITE);
 lcd.rs = 0;
 lcd.rw = 0;
 lcd.enable = 0;
 delay_ms(15);
 for(i=1;i<=3;++i) {
 lcd_send_nibble(3);
 delay_ms(5);
 }
 lcd_send_nibble(2);
 for(i=0;i<=3;++i)
 lcd_send_byte(0,LCD_INIT_STRING[i]);
 }
 
 
 void lcd_gotoxy( BYTE x, BYTE y) {
 BYTE address;
 
 if(y!=1)
 address=lcd_line_two;
 else
 address=0;
 address+=x-1;
 lcd_send_byte(0,0x80|address);
 }
 
 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;
 default     : lcd_send_byte(1,c);     break;
 }
 }
 
 char lcd_getc( BYTE x, BYTE y) {
 char value;
 
 lcd_gotoxy(x,y);
 lcd.rs=1;
 value = lcd_read_byte();
 lcd.rs=0;
 return(value);
 }
 
 | 
 
 ========================
 I need to modify the above code / driver to use in a 4x40 LCD module
 instead of 2x16.  The above work fine with the first 2 lines.
 
 Please help.....
 
 Thanks..
 |  |  
		|  |  
		| treitmey 
 
 
 Joined: 23 Jan 2004
 Posts: 1094
 Location: Appleton,WI   USA
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Thu Jan 06, 2005 5:34 pm |   |  
				| 
 |  
				| I don't see the include for the processor. So I can't tell if your doing the #locate ontop of the i/o pins correctly.
 
 I need to know the processor, and the physical way you wired it.
 
 Is it to port A,B,C,D...
 |  |  
		|  |  
		| densimitre 
 
 
 Joined: 21 Dec 2004
 Posts: 45
 
 
 
			    
 
 | 
			
				| LCD driven by 74ls164 |  
				|  Posted: Thu Jan 06, 2005 9:48 pm |   |  
				| 
 |  
				| Hi, how can i introduce this code to make that LCD work with a 74ls164 shif register in 8 bit mode and not in 4 bit mode?? 
 How can i modify de lcd.c to do this??
 
 Or how make a C code than do the same funcion like this asm code???
 
 I know a littel of C....thank you
 
 
 
 
 
 
 
  	  | Code: |  	  | ; Send the byte in W to the 74HCT164
 __LCD_SEND:
 MOVWF   __LCD_TEMP              ; Store byte
 MOVLW   .8                              ; Eight data bits
 MOVWF   __LCD_CNTR              ; Store in counter
 __LCD_SENDLOOP:
 MOVLW   0
 RLF     __LCD_TEMP,F          ; Rotate left into carry
 BCF     LCD_DATA                    ; Assume carry low
 BTFSC   STATUS, C                  ; Carry high?
 BSF     LCD_DATA                    ; Yes. Set port bit
 ;        GOTO    $+1                           ; Wait for the data line to settle
 BSF     LCD_CLOCK                   ; Clock high
 ;        GOTO    $+1                             ; Make sure the HC164 sees the transition
 BCF     LCD_CLOCK      ; Clock low
 DECFSZ  __LCD_CNTR,   F   ; Decrement counter
 GOTO    __LCD_SENDLOOP          ; Not zero yet; keep going
 RETURN                          ; Counter=0; return.
 
 
 | 
 
 
 http://www.piclist.com/techref/io/lcd/unilcd.htm
 
 
 Bye
 |  |  
		|  |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| 4x40 LCD Problem |  
				|  Posted: Fri Jan 07, 2005 7:17 am |   |  
				| 
 |  
				| I use the PIC18F452 
 My hardware connection as follow:
 
 I use 4 bit data bus
 
 LCD  --- PIC
 ---------------
 DB4 ---  RD0
 DB5 ---  RD1
 DB6 ---  RD2
 DB7 ---  RD3
 
 
 Enable1 ---  RD4
 R/W -------  RD5
 RS ---------  RD6
 Enable2 ---  RD7
 
 I hope that the above information will help you understand my hardware connection.
 |  |  
		|  |  
		| Mark 
 
 
 Joined: 07 Sep 2003
 Posts: 2838
 Location: Atlanta, GA
 
 
			      
 
 | 
			
				| Re: LCD driven by 74ls164 |  
				|  Posted: Fri Jan 07, 2005 7:54 am |   |  
				| 
 |  
				|  	  | densimitre wrote: |  	  | Hi, how can i introduce this code to make that LCD work with a 74ls164 shif register in 8 bit mode and not in 4 bit mode?? 
 How can i modify de lcd.c to do this??
 
 Or how make a C code than do the same funcion like this asm code???
 
 I know a littel of C....thank you
 
 
 
 
 
 
 
  	  | Code: |  	  | ; Send the byte in W to the 74HCT164
 __LCD_SEND:
 MOVWF   __LCD_TEMP              ; Store byte
 MOVLW   .8                              ; Eight data bits
 MOVWF   __LCD_CNTR              ; Store in counter
 __LCD_SENDLOOP:
 MOVLW   0
 RLF     __LCD_TEMP,F          ; Rotate left into carry
 BCF     LCD_DATA                    ; Assume carry low
 BTFSC   STATUS, C                  ; Carry high?
 BSF     LCD_DATA                    ; Yes. Set port bit
 ;        GOTO    $+1                           ; Wait for the data line to settle
 BSF     LCD_CLOCK                   ; Clock high
 ;        GOTO    $+1                             ; Make sure the HC164 sees the transition
 BCF     LCD_CLOCK      ; Clock low
 DECFSZ  __LCD_CNTR,   F   ; Decrement counter
 GOTO    __LCD_SENDLOOP          ; Not zero yet; keep going
 RETURN                          ; Counter=0; return.
 
 
 | 
 
 
 http://www.piclist.com/techref/io/lcd/unilcd.htm
 
 
 Bye
 | 
 
 Take a look at the 74595.C file in your drivers directory.  It is very similar.
 |  |  
		|  |  
		| densimitre 
 
 
 Joined: 21 Dec 2004
 Posts: 45
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Jan 09, 2005 10:52 am |   |  
				| 
 |  
				| HI 
 Can you explain me that code 74595.c ???
 
 I dont understand it...
 
 Thank you
 |  |  
		|  |  
		| dyeatman 
 
 
 Joined: 06 Sep 2003
 Posts: 1968
 Location: Norman, OK
 
 
			    
 
 | 
			
				| How 74595.c works |  
				|  Posted: Sun Jan 09, 2005 5:49 pm |   |  
				| 
 |  
				| The driver is sending out the bits serially, one at a time MSB first, to the 74595. 
 First a loop is set up with the loop terminator multiplied by the number of 74595s being serviced times 8 bits since they are daisy chained.
 
 Then the code line below tests the high bit of EO (&0x80) to see if it is zero. If it is, the DO (data output) bit is set as a low bit output else  it is set as a high bit output.
 
 
 if((*(eo+(NUMBER_OF_74595-1))&0x80)==0)
 output_low(EXP_OUT_DO);
 
 In the lines following the one above EO is then rotated left one position and the clock line (EXP_OUT_CLOCK) is toggled to clock the DO bit just set to the 74595.  Then it  loops back and E0 is tested again for a zero in the MSB.
 |  |  
		|  |  
		| densimitre 
 
 
 Joined: 21 Dec 2004
 Posts: 45
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jan 10, 2005 4:40 am |   |  
				| 
 |  
				| OK 
 Thank you very much
 
 Isīt like 74164, i will try to modify the lcd.c driver to use 74ls164 as driver of lcd 16x2
 
 Bye
 |  |  
		|  |  
		| Mark 
 
 
 Joined: 07 Sep 2003
 Posts: 2838
 Location: Atlanta, GA
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon Jan 10, 2005 7:11 am |   |  
				| 
 |  
				|  	  | densimitre wrote: |  	  | OK 
 Thank you very much
 
 Isīt like 74164, i will try to modify the lcd.c driver to use 74ls164 as driver of lcd 16x2
 
 Bye
 | 
 
 Wrong, it is pretty close to it.  Aside from the setting/clearing then EXP_OUT_ENABLE, it does the same thing as your asm code.
 
  	  | Code: |  	  | 
 void write_LCD_port(BYTE data) {
 BYTE i;
 
 output_low(LCD_CLOCK);
 
 for(i=1;i<=8;++i) {  // Clock out bits
 if((data&0x80)==0)
 output_low(LCD_DATA);
 else
 output_high(LCD_DATA);
 data <<= 1;
 output_high(LCD_CLOCK);
 output_low(LCD_CLOCK);
 }
 }
 
 | 
 |  |  
		|  |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Wed Jan 12, 2005 2:27 pm |   |  
				| 
 |  
				|  	  | Mark wrote: |  	  |  	  | densimitre wrote: |  	  | OK 
 Thank you very much
 
 Isīt like 74164, i will try to modify the lcd.c driver to use 74ls164 as driver of lcd 16x2
 
 Bye
 | 
 
 Wrong, it is pretty close to it.  Aside from the setting/clearing then EXP_OUT_ENABLE, it does the same thing as your asm code.
 
  	  | Code: |  	  | 
 void write_LCD_port(BYTE data) {
 BYTE i;
 
 output_low(LCD_CLOCK);
 
 for(i=1;i<=8;++i) {  // Clock out bits
 if((data&0x80)==0)
 output_low(LCD_DATA);
 else
 output_high(LCD_DATA);
 data <<= 1;
 output_high(LCD_CLOCK);
 output_low(LCD_CLOCK);
 }
 }
 
 | 
 | 
 
 
 
 
 WOW Mark, you are a Master....i am learning C but ist a little complicated...
 
 Thank you so much....I hope this code will work for my project...
 
 
 How can i use this code like a driver.c  and set the control lines (DATA, CLOCK) from a main source code, and how i can share the RS and DATA lines without imcompatibility in PIC C, ex: portb.1 = RS and portb.1 DATA?...
 
 after shifted the byte, i will not use CLOCK, then DATAīs status doesnt affect the 74164, then i can use it to control RS line of LCD...
 
 
 Thank you
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |