Just some tips on the PIC and LCD

Discussion in 'Embedded Systems and Microcontrollers' started by beeson76, Sep 28, 2011.

  1. beeson76

    Thread Starter Member

    Apr 19, 2010
    185
    1
    I have a LCD connected to a PIC16F886 along with 13 switches to the "remaining" pins for the PIC

    Here is the layout

    I am using PORTA0, 1, 3 of my PIC16F886 for the control lines to my LCD.

    I am using PORTC0-3 for my data lines for my LCD

    I have 13 switches all tied to the PIC using all of PORTB and the remaining 4 pins on PORTC.

    Then I am using 1 pin on PORTA for the remaining 13th switch.

    I know this question is vague, but can anyone see a problem with this scenario? Such as pins being set up right etc.

    I have it in the program as the the pins being pulled low (RB0 == 0) for example.

    I have to use a PIC with 28 pins because the only programmer I have is only 28 pins. And the only chip I have access to right now is the PIC16F886. So I so really prefer to stay with this arrangement if possible.

    I will try to post the program tomorrow with schematic. I was just wanting to start a post to get some answers if possible.

    Thanks for any help provided. I love this forum:)
     
  2. MMcLaren

    Well-Known Member

    Feb 14, 2010
    759
    116
    Have you considered multiplexing the switches with the LCD D4..D7 lines? If you were to use those lines as switch matrix column driver lines you would only need another four I/O pins (and diodes) to read up to 16 switches in a 4x4 matrix configuration. That would reduce your I/O pin requirements from 20 pins (13+7) to 11 pins (4+7).

    Regards, Mike
     
  3. Eric007

    Senior Member

    Aug 5, 2011
    1,041
    33
    I think multiplexing is a better way to implement your hardware...

    Excuse me! I don't really get what you mean by that!! The programmer you have is only 28 pins???? Can you please explain...you mean your chip Not your programmer, right?

    Regards
     
  4. t06afre

    AAC Fanatic!

    May 11, 2009
    5,939
    1,222
    This will depend on what kind of programmer you have also. The important thing is not the number pins. But if the programmer software support the chip or not.
     
  5. beeson76

    Thread Starter Member

    Apr 19, 2010
    185
    1
    Thanks for the replies.

    I use the PicKit 2 as my programmer for my chips. I only have the development boards for the 28 pin and the 20 pin. I knew the 20 pin was too few so I am going with the 28 pin. And the only 28 pin chip I have right now is the PIC16F886.

    I have messed around with matrix switches a few months ago, and the idea is pretty neat. But for this project, I want to use this switch (schematic is provided).

    Im am still very new at this stuff. Mainly a hobby to see what I can do. So I appreciate your replies very much. I am having a lot of fun with it, and I am learning a lot too.

    So with this switch, I don't see any way of putting it into a matrix type switch. Any help and suggestions is greatly appreciated.

    Thanks again.
     
  6. BMorse

    Senior Member

    Sep 26, 2009
    2,675
    234
    A pickit 2 programmer supports all sorts of Microchip uC's..... it is all in the way you connect the ICSP pins of the uC (If capable of In Circuit Serial Programming anyway...) So you are not limited to using those particular uC's as you can program any uC capable of ICSP...
     
  7. t06afre

    AAC Fanatic!

    May 11, 2009
    5,939
    1,222
  8. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,386
    1,605
    Hush up guys, his breadboarding platform is the expansion board, and as it has (albeit small) prototyping area is does have a place to stick down parts and try things. It's a good thing to start with known working hardware.

    beesons: Your basic scheme seems OK. Just to start yourself off in a good place only add the LCD and get that to display something ("Hello World" is traditional). You are going to spend some time just getting that to work (we all did).

    Then you can start adding some buttons to make it do something useful. Don't get into multiplexed buttons yet, make something simple work, just a couple of buttons maybe, so you learn all the gotcha's about adding buttons (like pull up or down resistors, debouncing, contact clearing...).

    Make small steps so each one builds on the previous step.
     
  9. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,386
    1,605
    beeson: also MAKE THAT SCHEMATIC. It has to be the first step, even for simple things, so you know what you're doing and will still know when you have to stop for a day or a month.
     
  10. MMcLaren

    Well-Known Member

    Feb 14, 2010
    759
    116
    beeson,

    Did that bank of switches come wired that way or did you wire it that way?

    BTW, I agree with Ernie. Take your time and do it one step at a time. Some newcomers try to do too all at once, often skipping important steps and research.

    Mike
     
  11. beeson76

    Thread Starter Member

    Apr 19, 2010
    185
    1
    Thanks everyone for the replies.

    Here is the schematic for the switch and PIC and LCD.

    The switches came that way. I have also gotten the LCD wired up with the "Hello World" being displayed right now:) It was kinda nice seeing that because usually it takes me a while to get to this point. So the LCD is being inialized etc.

    A while ago, I tried putting all the data and control lines on one PORT and I couldnt get it done. It just didnt click with me moving the upper and lower bits around. That is why I have them on 2 different PORTS right now. I think that may be a problem though on PORTC.

    Any thoughts and help is appreciated very much.

    Thanks.
     
  12. beeson76

    Thread Starter Member

    Apr 19, 2010
    185
    1
    Here is the main code for the program

    Code ( (Unknown Language)):
    1.  
    2. //
    3. //Programmed into this program is a debounce of 10 ms.  It is a very simple debounce statement.  It mainly consists of
    4. //a while statement with a debounce statement followed by another while statement.  The first while statement test to see
    5. //if a button is pressed.  If a button is pressed, a pause of 10ms is done, followed by another check of the button press.
    6. //If the button is stilled pressed, the while loop continues.  If the button is not pressed, the while loop is broken
    7. //and it jumps back to the next while loop and tests again.  Therefore the debounce in this program is 10ms.
    8. //
    9. //Please noticed commented out lines.  There may be some left in, so further development can take place.  Further development
    10. //may consists of ideas or thoughts that are not yet programmed.  There may also still be left in this program some statements
    11. //that simply don't do anything.  This is also left in so further development may take place.
    12.  
    13.  
    14. #define _LEGACY_HEADERS
    15. #include <htc.h>
    16. #include "lcd.h"
    17.  
    18. //DEFINE STATEMENTS
    19. #define SW1         RC4
    20. #define SW2         RC5
    21. #define SW3         RC6
    22. #define SW4         RC7
    23. #define SW5         RB0
    24. #define SW6         RB1
    25. #define SW7         RB2
    26. #define SW8         RB3
    27. #define SW9         RB4
    28. #define SW10        RB5
    29. #define SW11        RB6
    30. #define SW12        RB7
    31.  
    32. #define DelayS(T)       {unsigned char i; for (i = 0; i < T * 10; i++) __delay_ms(100);}    //Delay Macro
    33. #define _XTAL_FREQ              4000000                             //Needs to be set for __delay_ms
    34. //#define DEBOUNCE      10*1000/256                                 //Switch Debounce Count = 10ms/(256us/tick)
    35. //#define DEBOUNCELOW(PIN)
    36.  
    37. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    38.  
    39. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    40. ////CONFIGURATION FUSES (BITS)
    41. ////Master Clear Reset enabled & Internal RC No Clock & Watchdog Timer Disable & Power Up Timer On & Brown Out Reset Disabled &
    42. ////Low Voltage Porgramming Disabled & Code Unprotect
    43. __CONFIG (MCLREN & INTIO & WDTDIS & PWRTEN & BORDIS & LVPDIS & UNPROTECT);
    44. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    45.  
    46.  
    47. main()
    48. {
    49.    
    50. PORTA = 0x00;                                       //PORTA is cleared and set low
    51. PORTB = 0xFF;                                       //(0b11111111 binary) (0xFF hex)--ROWS set to HIGH, COLUMNS set to HIGH  
    52.                                                     //PORTB7:B0 is set to high,high,high,high,high,high,high,high
    53.                                                    
    54. //PORTC = 0x00;                                     //PORTC is cleared and set low
    55. PORTC = 0xF0;                                       //PORTC is set to high, high, high, high, low, low, low, low
    56. TRISA = 0x00;                                       //Set PORTA to outputs for LCD--RA1, RA2, RA4 are Control lines for LCD
    57.  
    58. TRISB = 0x7C;                                       //(0b01111100 binary) (0x7C hex)--ROWS set to INPUT, COLUMNS set to OUTPUT
    59.                                                     //PORTB7:B0 is set to output,input,input,input,input,input,output,output,
    60.                                                     //ROWS set to INPUT
    61.  
    62. //TRISC = 0x00;                                     //Set PORTC to outputs for LCD--RC0:RC3 are Data Lines for LCD
    63. TRISC = 0xF0;                                       //Set PORTC to outputs for LCD--RC0:RC3 are Data Lines for LCD
    64.                                                     //Set PORTC to inputs for Pins RC4:RC7 for switch
    65.  
    66. ANSEL = 0;                                          //Initialize A/D Ports off
    67. ANSELH = 0;                                         //Initialize ........
    68. CM1CON0 = 0;                                        //Initialize Comparator 1 off
    69. CM2CON0 = 0;                                        //Initialize Comparator 2 off
    70.  
    71. OPTION = 0b01010101;                                //OPTION REG
    72.                                                     //xbxxxxx101  1:64
    73.                                                     //xbxxxx0xxx  Prescaler set to Timer0
    74.                                                     //xbxxx1xxxx  (T0SE) set to Increment on high-to-low transition on T0CKI pin
    75.                                                     //xbxx0xxxxx  (T0CS) Internal instruction cycle clock
    76.                                                     //xbx1xxxxxx  (INTEDG) Interrupt on rising edge of INT pin
    77.                                                     //xb0xxxxxxx  (RBPU) PORTB pull-ups are enabled by individual PORT latch values
    78. RBPU = 0;                                           //Don't think I need this, but to be safe...PORTB Weak Internal Pullups enabled
    79. WPUB0 = 0;                                          //COL_1 Weak pullup is individually DISABLED--OUTPUT
    80. WPUB1 = 0;                                          //COL_2 Weak Pullup is inidivdually DISABLED--OUTPUT
    81. WPUB2 = 0;                                          //Not being used...Weak Pullup is individually DISABLED
    82. WPUB3 = 1;                                          //ROW_1 Weak Pullup is individually ENABLED--INPUT
    83. WPUB4 = 1;                                          //ROW_2 Weak Pullup is individually ENABLED--INPUT
    84. WPUB5 = 1;                                          //ROW_3 Weak Pullup is individually ENABLED--INPUT
    85. WPUB6 = 1;                                          //ROW_4 Weak Pullup is individually ENABLED--INPUT
    86. WPUB7 = 0;                                          //COL_3 Weak Pullup is individually DISABLED--INPUT
    87.  
    88.  
    89. lcd_init();                                         //LCD Display is Initialized...See LCD.C file and LCD.h
    90. lcd_clear();
    91.  
    92. char a;                                                 //
    93. char b;                                                 //
    94.  
    95. while (1)
    96.     {
    97.         lcd_goto(0);                                    //Go to Line 1 Position 1
    98.         lcd_puts("Hello");                              //Display ""
    99.         lcd_goto(40);                                   //Go to Line 2 Position 1
    100.         lcd_puts("Press Button");                       //Display "Press Button"
    101.         b = 0;
    102.        
    103.         while (SW1 == 0)                                //While SW1 is 0(Low)(Pressed)...
    104.             {
    105.                 __delay_ms(10);                         //Delay 10 ms (Switch Debounce)
    106.                 while (SW1 == 0)                        //Check to see if SW1 is low after Debounce
    107.                     {
    108.                         for (a = b; a < 1; a++)         //For Statement to cycle lcd_clear only once
    109.                             {
    110.                                 lcd_clear();            //lcd_clear should only cycle once because a = (b = 0)
    111.                             }
    112.                
    113.                         lcd_goto(0);                    //On LCD go to Position 1 (Line 1, Position 0)
    114.                         lcd_puts("SW1 Pressed");        //Display ""
    115.                         b = 1;                          //Char B is now 1 so For Statement cycles once
    116.                     }
    117.             }
    118.         while (SW2 == 0)                                //While ROW_2 is 0(Low)(Pressed)...
    119.             {                                           //
    120.                 __delay_ms(10);                         //
    121.                 while (SW2 == 0)                        //
    122.                     {                                   //
    123.                         for (a = b; a < 1; a++)         //
    124.                             {                           //
    125.                                 lcd_clear();            //...
    126.                             }                           //...      
    127.                         lcd_goto(0);                    //...
    128.                         lcd_puts("SW2 Pressed");        //Display ""
    129.                         b = 1;                          //
    130.                     }                                   //
    131.             }                                           //
    132.         while (SW3 == 0)                                //While ROW_1 is 0(Low)(Pressed)...
    133.             {                                           //
    134.                 __delay_ms(10);                         //
    135.                 while (SW3 == 0)                        //
    136.                     {                                   //...
    137.                         for (a = b; a < 1; a++)         //
    138.                             {                           // 
    139.                                 lcd_clear();            //...
    140.                             }                           //...
    141.                         lcd_goto(0);                    //...
    142.                         lcd_puts("SW3 Pressed");            //Display ""
    143.                         b = 1;                          //
    144.                     }                                   //
    145.             }                                           //
    146.         while (SW4 == 0)                                //If ROW 4 is LOW
    147.             {                                           //...
    148.                 __delay_ms(10);                         //
    149.                 while (SW4 == 0)                        //
    150.                     {                                   //
    151.                         for (a = b; a < 1; a++)         //
    152.                             {                           //
    153.                                 lcd_clear();            //...
    154.                             }                           //...
    155.                         lcd_goto(0);                    //...
    156.                         lcd_puts("SW4 Pressed");            //Display ""
    157.                         b = 1;                          //
    158.                     }                                   // 
    159.             }                                           //
    160.                
    161.         while (SW5 == 0)                                //and If ROW 1 is LOW...
    162.             {                                           //...
    163.                 __delay_ms(10);                         //
    164.                 while (SW5 == 0)                        //
    165.                     {                                   //
    166.                         for (a = b; a < 1; a++)         //
    167.                             {                           //
    168.                                 lcd_clear();            //...
    169.                             }                           //...
    170.                         lcd_goto(0);                    //...
    171.                         lcd_puts("SW5");                //Display ""
    172.                         b = 1;                          //
    173.                     }                                   //
    174.             }                                           //
    175.         while (SW6 == 0)                                //if ROW 2 is LOW...
    176.             {                                           //...
    177.                 __delay_ms(10);                         //
    178.                 while (SW6 == 0)                        //
    179.                     {                                   //
    180.                         for (a = b; a < 1; a++)         //
    181.                             {                           //
    182.                                 lcd_clear();            //...
    183.                             }                           //...      
    184.                         lcd_goto(0);                    //...
    185.                         lcd_puts("SW6 Pressed");        //Display ""
    186.                         b = 1;                          //
    187.                     }                                   //
    188.             }                                           //
    189.         while (SW7 == 0)                                //
    190.             {                                           //...
    191.                 __delay_ms(10);                         //
    192.                 while (SW7 == 0)                        //
    193.                     {                                   //
    194.                         for (a = b; a < 1; a++)         //
    195.                             {                           //
    196.                                 lcd_clear();            //...
    197.                             }                           //...
    198.                         lcd_goto(0);                    //...
    199.                         lcd_puts("SW7 Pressed");        //Display "SW7"
    200.                         b = 1;                          //
    201.                     }                                   //
    202.             }                                           //
    203.         while (SW8 == 0)                                //
    204.             {                                           //...
    205.                 __delay_ms(10);                         //
    206.                 while (SW8 == 0)                        //
    207.                     {                                   //
    208.                         for (a = b; a < 1; a++)         //
    209.                             {                           //
    210.                                 lcd_clear();            //...
    211.                             }                           //...
    212.                         lcd_goto(0);                    //...
    213.                         lcd_puts("SW8 Pressed");        //Display ""
    214.                         b = 1;                          //
    215.                     }                                   //
    216.             }                                           //
    217.                
    218.         while (SW9 == 0)                                //and If ROW 1 is LOW...
    219.             {                                           //...
    220.                 __delay_ms(10);                         //
    221.                 while (SW9 == 0)                        //
    222.                     {                                   //
    223.                         for (a = b; a < 1; a++)         //
    224.                             {                           //
    225.                                 lcd_clear();            //...
    226.                             }                           //...
    227.                         lcd_goto(0);                    //...
    228.                         lcd_puts("SW9 Pressed");        //
    229.                         b = 1;                          //
    230.                     }                                   //
    231.             }                                           //
    232.         while (SW10 == 0)                               //
    233.             {                                           //...
    234.                 __delay_ms(10);                         //
    235.                 while (SW10 == 0)                       //
    236.                     {                                   //
    237.                         for (a = b; a < 1; a++)         //
    238.                             {                           //
    239.                                 lcd_clear();            //...
    240.                             }                           //...      
    241.                         lcd_goto(0);                    //...
    242.                         lcd_puts("SW10 Pressed");       //Display ""
    243.                         b = 1;                          //
    244.                     }                                   //
    245.             }                                           //
    246.         while (SW11 == 0)                               //
    247.             {                                           //...
    248.                 __delay_ms(10);                         //
    249.                 while (SW11 == 0)                       //
    250.                     {                                   //
    251.                         for (a = b; a < 1; a++)         //
    252.                             {                           //
    253.                                 lcd_clear();            //...
    254.                             }                           //...
    255.                         lcd_goto(0);                    //...
    256.                         lcd_puts("SW11 Pressed");       //Display ""
    257.                         b = 1;                          //                 
    258.                     }                                   //
    259.             }                                           //
    260.         while (SW12 == 0)                               //
    261.             {                                           //...
    262.                 __delay_ms(10);                         //
    263.                 while (SW12 == 0)                       //
    264.                     {                                   //
    265.                         for (a = b; a < 1; a++)         //
    266.                             {                           //
    267.                                 lcd_clear();            //...
    268.                             }                           //...
    269.                         lcd_goto(0);                    //...
    270.                         lcd_puts("SW12 Pressed");       //Display ""
    271.                         b = 1;                          //
    272.                     }                                   //
    273.             }                                           //
    274.        
    275.     }                                                   //
    276. }                                                       //
    277.  
    278.  
     
  13. BMorse

    Senior Member

    Sep 26, 2009
    2,675
    234
    You may want to add some 10k pullup resistors on your switch input lines, so you do not get any "ghost" inputs coming from the switches, this way the inputs stay High until a switch is pressed......
     
  14. beeson76

    Thread Starter Member

    Apr 19, 2010
    185
    1
    Thanks BMorse. I will certainly look into the resistors and try to incorporate them into the circuit.

    Also included is the lcd.c file

    Code ( (Unknown Language)):
    1.  
    2.  
    3. /*
    4.  *  LCD Interface Example
    5.  *  This code will interface to a standard LCD controller
    6.  *  like the Hitachi HD44780.  It uses it in 4 bit mode, with
    7.  *  the hardware connected as follows (the standard 14 pin
    8.  *  LCD connector is used):
    9.  *
    10.  *  PORTC bits 0-3 are connected to LCD Data Bits 4-7 (High Nibble)
    11.  *  PORTA bit 2 is connected to the LCD RS input (Register Select)
    12.  *  RW input (Read/Write) is connected to Ground
    13.  *  PORTA bit 1 is connected to the LCD EN bit (Enable)
    14. */
    15.  
    16. #include    <htc.h>
    17. #include    "lcd.h"
    18.  
    19. void pause (unsigned short usvalue);            //Establish pause routine function
    20.  
    21. #define LCD_RS          RA2
    22. #define LCD_RW          RA4
    23. #define LCD_EN          RA1
    24. #define LCD_DATA        PORTC
    25. #define LCD_STROBE()    ((LCD_EN = 1), (LCD_EN = 0))
    26. #define  DelayS(T)              {unsigned char i; for (i = 0; i < T * 10; i++) __delay_ms(100);}    //Delay Macro
    27. #define  _XTAL_FREQ             4000000
    28.  
    29. /*Write a byte to the LCD in 4 bit mode*/
    30.  
    31. void
    32. lcd_write(unsigned char c)
    33. {
    34.     __delay_ms(1);
    35.     LCD_DATA = ((c >> 4) & 0x0F);
    36.     LCD_STROBE();
    37.     LCD_DATA = (c & 0x0F);
    38.     LCD_STROBE();
    39. }
    40.  
    41. /*Clear and Home the LCD*/
    42.  
    43. void
    44. lcd_clear(void)
    45. {
    46.     LCD_RS = 0;
    47.     lcd_write(0x1);
    48.     __delay_ms(2);
    49. }
    50.  
    51. /*Write a string of characters to the LCD*/
    52.  
    53. void
    54. lcd_puts(const char * s)
    55. {
    56.     LCD_RS = 1;                                 //Write Characters
    57.     while(*s)
    58.     {
    59.         lcd_write(*s++);
    60.     }
    61. }
    62.  
    63. /*Write one character to the LCD*/
    64.  
    65. void
    66. lcd_putch(char c)
    67. {
    68.     LCD_RS = 1;                                 //Write Characters
    69.     lcd_write(c);
    70. }
    71.  
    72. /*Go to the Specified Position*/
    73.  
    74. void
    75. lcd_goto(unsigned char pos)
    76. {
    77.     LCD_RS = 0;
    78.     lcd_write(0x80 + pos);
    79. }
    80.  
    81. /*Initialize the LCD - put into 4 bit mode*/
    82.  
    83. void
    84. lcd_init()
    85. {
    86.     char init_value;
    87.    
    88.     ANSEL = 0;                                  //Disable Analog Pins on PORTA
    89.    
    90.     init_value = 0x3;
    91.     TRISA = 0;
    92.     TRISC = 0;
    93.     LCD_RS = 0;
    94.     LCD_EN = 0;
    95.     LCD_RW = 0;
    96.    
    97.     __delay_ms(15);                                 //Wait 15ms after Power applies)
    98.     LCD_DATA = init_value;
    99.     LCD_STROBE();
    100.     __delay_ms(10);
    101.     LCD_STROBE();
    102.     __delay_ms(10);
    103.     LCD_STROBE();
    104.     __delay_ms(10);
    105.     LCD_DATA = 2;                               //Four Bit Mode
    106.     LCD_STROBE();
    107.    
    108.     lcd_write(0x28);                            //Set Interface Length
    109.     lcd_write(0xF);                             //Display On, Cursor On, Cursor Blink
    110.     lcd_clear();                                //Clear Screen
    111.     lcd_write(0x6);                             //Set Entry Mode
    112. }
    113.  
    114.  
    115.  
    The problem I am running into now is that since I am using PORTC for my data lines, its taking the full PORT to do it. (I believe anyway.::)) Is there anyway of differintiating (spelled that wrong) that I want to use the lower 4 pins instead of the whole port. And if I do that would that work with the set of code.

    As I mentioned before I tried I didnt really understand the concept of upper and lower nibbles on that PORT from a while ago.

    Thanks again for any help.
     
  15. CraigHB

    Member

    Aug 12, 2011
    127
    15
    You can work compeltely bitwise if you want so you don't have to consider ports as entities of 4 or 8 bits. There's a bunch of instructions that allow you to do things on a bit by bit basis. One of the main differences between micro-controllers and micro-processors is the ability to do this. Of course, coding parallel comms are easier when you can group things into a nibble or byte, but you don't have to do that.

    I once coded an LCD display using 8 bit parallel comms without using a single group of bits, in other words, with some bits scattered in one register and some bits scattered in another register. I needed an LCD with very fast refresh on a small board so that's what I ended up with. Now I usually use serial comms for LCDs, but that was a long time ago when LCDs were slower. Display speeds have improved quite a bit since then.
     
  16. beeson76

    Thread Starter Member

    Apr 19, 2010
    185
    1
    When I add the 10k pullup resistors they should be connected between the ground and the pin right?
     
  17. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,386
    1,605
    That would be for a pull down resistor. A pull up resistor goes to Vdd.

    However, the good news is that PIC already has pull ups built right into PortB where your switches are, all you have to do is turn them on.

    Check Section 3.4.2 of your data sheet.
     
    Last edited: Sep 29, 2011
  18. t06afre

    AAC Fanatic!

    May 11, 2009
    5,939
    1,222
    No pullups shall be connected to the same level as the microcontroller VDD. As you want to pull it up to a high level. Else it would have been named pulldown resistor.
     
  19. CraigHB

    Member

    Aug 12, 2011
    127
    15
    Typically, the switch connects to the low side with a pull-up between it and the high side. But, if you want to reverse the logic, you can connect the switch to the high side with a pull-down connecting the switch to the low side.

    The more conventional way to do it is with a pull-up since it avoids putting direct supply voltage on the switch (more of a concern for higher voltage) and makes it easier to add debouncing and/or ESD protection.
     
  20. beeson76

    Thread Starter Member

    Apr 19, 2010
    185
    1
    Here is my newest code. Pullup resisters are all working perfect by way of the built in resistors on PORTB.

    To make things easier I switched 4 of my switches to PORTA. I am using PINS 0, 3, 5, 6 on PORTA now and my control lines are taking PINS 1, 2, 4.

    But when I push a button, it flashes the switch name but then just locks up. I have pullups on all of those pins that have switches on them. It like its not clearing or something.

    Code ( (Unknown Language)):
    1.  
    2. #define _LEGACY_HEADERS
    3. #include <htc.h>
    4. #include "lcd.h"
    5.  
    6. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    7. ////DEFINE STATEMENTS
    8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    9. #define SW1         RA0
    10. #define SW2         RA3
    11. #define SW3         RA5
    12. #define SW4         RA6
    13. #define SW5         RB0
    14. #define SW6         RB1
    15. #define SW7         RB2
    16. #define SW8         RB3
    17. #define SW9         RB4
    18. #define SW10        RB5
    19. #define SW11        RB6
    20. #define SW12        RB7
    21.  
    22. #define DelayS(T)       {unsigned char i; for (i = 0; i < T * 10; i++) __delay_ms(100);}    //Delay Macro
    23. #define _XTAL_FREQ              4000000                             //Needs to be set for __delay_ms
    24. //#define DEBOUNCE      10*1000/256                                 //Switch Debounce Count = 10ms/(256us/tick)
    25. //#define DEBOUNCELOW(PIN)
    26.  
    27. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    28.  
    29. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    30. ////CONFIGURATION FUSES (BITS)
    31. ////Master Clear Reset enabled & Internal RC No Clock & Watchdog Timer Disable & Power Up Timer On & Brown Out Reset Disabled &
    32. ////Low Voltage Porgramming Disabled & Code Unprotect
    33. __CONFIG (MCLREN & INTIO & WDTDIS & PWRTEN & BORDIS & LVPDIS & UNPROTECT);
    34. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    35.  
    36.  
    37. main()
    38. {
    39. PORTA = 0x00;                                       //PORTA is cleared 
    40. PORTA = 0xE9;                                       //(ob11101001 binary) (0xE9 hex)
    41.                                                     //PORTA7:A0 is set to high,high,high,low,high,low,low,high
    42.                                                    
    43. PORTB = 0x00;                                       //PORTB is cleared
    44. PORTB = 0xFF;                                       //(0b11111111 binary) (0xFF hex)  
    45.                                                     //PORTB7:B0 is set to high,high,high,high,high,high,high,high
    46.                                                    
    47. PORTC = 0x00;                                       //PORTC is cleared
    48. PORTC = 0xF0;                                       //PORTC is set to high, high, high, high, low, low, low, low
    49.  
    50.  
    51. TRISA = 0xE9;                                       //(0b11101001 binary)   (0xE9 hex)
    52.                                                     //LCD--RA1, RA2, RA4 are Control lines for LCD
    53.                                                     //RA0, RA3, RA5, RA6 are set for switches
    54.                                                     //PORTA7:A0 is set to input,input,input,output,input,output,output,input
    55.  
    56. TRISB = 0xFF;                                       //(0b11111111 binary) (0x7C hex)
    57.                                                     //All of PORTB are set for switches
    58.                                                     //PORTB7:B0 is set to input,input,input,input,input,input,input,input
    59.                                                
    60.  
    61. TRISC = 0x00;                                       //(0b00000000 binary) (0x00 hex)
    62.                                                     //All of PORTC is set for LCD
    63.                                                     //PORTC7:C0 is set to output,output,output,output,output,output,output,output
    64.                                                    
    65.  
    66. ANSEL = 0;                                          //Initialize A/D Ports off
    67. ANSELH = 0;                                         //Initialize ........
    68. CM1CON0 = 0;                                        //Initialize Comparator 1 off
    69. CM2CON0 = 0;                                        //Initialize Comparator 2 off
    70.  
    71. OPTION = 0b01010101;                                //OPTION REG
    72.                                                     //xbxxxxx101  1:64
    73.                                                     //xbxxxx0xxx  Prescaler set to Timer0
    74.                                                     //xbxxx1xxxx  (T0SE) set to Increment on high-to-low transition on T0CKI pin
    75.                                                     //xbxx0xxxxx  (T0CS) Internal instruction cycle clock
    76.                                                     //xbx1xxxxxx  (INTEDG) Interrupt on rising edge of INT pin
    77.                                                     //xb0xxxxxxx  (RBPU) PORTB pull-ups are enabled by individual PORT latch values
    78. RBPU = 0;                                           //Don't think I need this, but to be safe...PORTB Weak Internal Pullups enabled
    79. WPUB0 = 1;                                          //COL_1 Weak pullup is individually ENABLED--INPUT
    80. WPUB1 = 1;                                          //COL_2 Weak Pullup is inidivdually ENABLED--INPUT
    81. WPUB2 = 1;                                          //Not being used...Weak Pullup is individually ENABLED
    82. WPUB3 = 1;                                          //ROW_1 Weak Pullup is individually ENABLED--INPUT
    83. WPUB4 = 1;                                          //ROW_2 Weak Pullup is individually ENABLED--INPUT
    84. WPUB5 = 1;                                          //ROW_3 Weak Pullup is individually ENABLED--INPUT
    85. WPUB6 = 1;                                          //ROW_4 Weak Pullup is individually ENABLED--INPUT
    86. WPUB7 = 1;                                          //COL_3 Weak Pullup is individually ENABLED--INPUT
    87.  
    88.  
    89. lcd_init();                                         //LCD Display is Initialized...See LCD.C file and LCD.h
    90. lcd_clear();
    91.  
    92. char a;                                                 //
    93. char b;                                                 //
    94.  
    95. while (1)
    96.     {
    97.         lcd_goto(0);                                    //Go to Line 1 Position 1
    98.         lcd_puts("Hello");                              //Display ""
    99.         lcd_goto(40);                                   //Go to Line 2 Position 1
    100.         lcd_puts("Press Button");                       //Display "Press Button"
    101.         b = 0;
    102.        
    103.         while (SW1 == 0)                                //While SW1 is 0(Low)(Pressed)...
    104.             {
    105.                 __delay_ms(10);                         //Delay 10 ms (Switch Debounce)
    106.                 while (SW1 == 0)                        //Check to see if SW1 is low after Debounce
    107.                     {
    108.                         for (a = b; a < 1; a++)         //For Statement to cycle lcd_clear only once
    109.                             {
    110.                                 lcd_clear();            //lcd_clear should only cycle once because a = (b = 0)
    111.                             }
    112.                
    113.                         lcd_goto(0);                    //On LCD go to Position 1 (Line 1, Position 0)
    114.                         lcd_puts("SW1 Pressed");        //Display ""
    115.                         b = 1;                          //Char B is now 1 so For Statement cycles once
    116.                     }
    117.             }
    118.         while (SW2 == 0)                                //While ROW_2 is 0(Low)(Pressed)...
    119.             {                                           //
    120.                 __delay_ms(10);                         //
    121.                 while (SW2 == 0)                        //
    122.                     {                                   //
    123.                         for (a = b; a < 1; a++)         //
    124.                             {                           //
    125.                                 lcd_clear();            //...
    126.                             }                           //...      
    127.                         lcd_goto(0);                    //...
    128.                         lcd_puts("SW2 Pressed");        //Display ""
    129.                         b = 1;                          //
    130.                     }                                   //
    131.             }                                           //
    132.         while (SW3 == 0)                                //While ROW_1 is 0(Low)(Pressed)...
    133.             {                                           //
    134.                 __delay_ms(10);                         //
    135.                 while (SW3 == 0)                        //
    136.                     {                                   //...
    137.                         for (a = b; a < 1; a++)         //
    138.                             {                           // 
    139.                                 lcd_clear();            //...
    140.                             }                           //...
    141.                         lcd_goto(0);                    //...
    142.                         lcd_puts("SW3 Pressed");            //Display ""
    143.                         b = 1;                          //
    144.                     }                                   //
    145.             }                                           //
    146.         while (SW4 == 0)                                //If ROW 4 is LOW
    147.             {                                           //...
    148.                 __delay_ms(10);                         //
    149.                 while (SW4 == 0)                        //
    150.                     {                                   //
    151.                         for (a = b; a < 1; a++)         //
    152.                             {                           //
    153.                                 lcd_clear();            //...
    154.                             }                           //...
    155.                         lcd_goto(0);                    //...
    156.                         lcd_puts("SW4 Pressed");            //Display ""
    157.                         b = 1;                          //
    158.                     }                                   // 
    159.             }                                           //
    160.                
    161.         while (SW5 == 0)                                //and If ROW 1 is LOW...
    162.             {                                           //...
    163.                 __delay_ms(10);                         //
    164.                 while (SW5 == 0)                        //
    165.                     {                                   //
    166.                         for (a = b; a < 1; a++)         //
    167.                             {                           //
    168.                                 lcd_clear();            //...
    169.                             }                           //...
    170.                         lcd_goto(0);                    //...
    171.                         lcd_puts("SW5 Pressed");        //Display ""
    172.                         b = 1;                          //
    173.                     }                                   //
    174.             }                                           //
    175.         while (SW6 == 0)                                //if ROW 2 is LOW...
    176.             {                                           //...
    177.                 __delay_ms(10);                         //
    178.                 while (SW6 == 0)                        //
    179.                     {                                   //
    180.                         for (a = b; a < 1; a++)         //
    181.                             {                           //
    182.                                 lcd_clear();            //...
    183.                             }                           //...      
    184.                         lcd_goto(0);                    //...
    185.                         lcd_puts("SW6 Pressed");        //Display ""
    186.                         b = 1;                          //
    187.                     }                                   //
    188.             }                                           //
    189.         while (SW7 == 0)                                //
    190.             {                                           //...
    191.                 __delay_ms(10);                         //
    192.                 while (SW7 == 0)                        //
    193.                     {                                   //
    194.                         for (a = b; a < 1; a++)         //
    195.                             {                           //
    196.                                 lcd_clear();            //...
    197.                             }                           //...
    198.                         lcd_goto(0);                    //...
    199.                         lcd_puts("SW7 Pressed");        //Display "SW7"
    200.                         b = 1;                          //
    201.                     }                                   //
    202.             }                                           //
    203.         while (SW8 == 0)                                //
    204.             {                                           //...
    205.                 __delay_ms(10);                         //
    206.                 while (SW8 == 0)                        //
    207.                     {                                   //
    208.                         for (a = b; a < 1; a++)         //
    209.                             {                           //
    210.                                 lcd_clear();            //...
    211.                             }                           //...
    212.                         lcd_goto(0);                    //...
    213.                         lcd_puts("SW8 Pressed");        //Display ""
    214.                         b = 1;                          //
    215.                     }                                   //
    216.             }                                           //
    217.                
    218.         while (SW9 == 0)                                //and If ROW 1 is LOW...
    219.             {                                           //...
    220.                 __delay_ms(10);                         //
    221.                 while (SW9 == 0)                        //
    222.                     {                                   //
    223.                         for (a = b; a < 1; a++)         //
    224.                             {                           //
    225.                                 lcd_clear();            //...
    226.                             }                           //...
    227.                         lcd_goto(0);                    //...
    228.                         lcd_puts("SW9 Pressed");        //
    229.                         b = 1;                          //
    230.                     }                                   //
    231.             }                                           //
    232.         while (SW10 == 0)                               //
    233.             {                                           //...
    234.                 __delay_ms(10);                         //
    235.                 while (SW10 == 0)                       //
    236.                     {                                   //
    237.                         for (a = b; a < 1; a++)         //
    238.                             {                           //
    239.                                 lcd_clear();            //...
    240.                             }                           //...      
    241.                         lcd_goto(0);                    //...
    242.                         lcd_puts("SW10 Pressed");       //Display ""
    243.                         b = 1;                          //
    244.                     }                                   //
    245.             }                                           //
    246.         while (SW11 == 0)                               //
    247.             {                                           //...
    248.                 __delay_ms(10);                         //
    249.                 while (SW11 == 0)                       //
    250.                     {                                   //
    251.                         for (a = b; a < 1; a++)         //
    252.                             {                           //
    253.                                 lcd_clear();            //...
    254.                             }                           //...
    255.                         lcd_goto(0);                    //...
    256.                         lcd_puts("SW11 Pressed");       //Display ""
    257.                         b = 1;                          //                 
    258.                     }                                   //
    259.             }                                           //
    260.         while (SW12 == 0)                               //
    261.             {                                           //...
    262.                 __delay_ms(10);                         //
    263.                 while (SW12 == 0)                       //
    264.                     {                                   //
    265.                         for (a = b; a < 1; a++)         //
    266.                             {                           //
    267.                                 lcd_clear();            //...
    268.                             }                           //...
    269.                         lcd_goto(0);                    //...
    270.                         lcd_puts("SW12 Pressed");       //Display ""
    271.                         b = 1;                          //
    272.                     }                                   //
    273.             }                                           //
    274.        
    275.     }                                                   //
    276. }                                                       //
    277.  
     
Loading...