Here is my code:
Does this look like I am debouncing the switch the correct way. Thanks for any help that you can give. I appreciate it a lot. Thanks again.
Rich (BB code):
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//This Pendant has 10 buttons using a 3 Column 4 Row
//Matrix Switch.
//
//Whenever a switch is pushed, that switches name is displayed on an LCD Display.
//Here are the names of the Buttons:
//Switch 1 -- Column 1 Row 4
//Switch 2 -- Column 2 Row 4
//Switch 3 -- Column 3 Row 4
//Switch 4 -- Column 1 Row 3
//Switch 5 -- Column 2 Row 3
//Switch 6 -- Column 3 Row 3
//Swtich 7 -- Column 1 Row 2
//Switch 8 -- Column 2 Row 2
//Switch 9 -- Column 3 Row 2
//Swtich 10 -- Column 1 Row 1
//Switch 11 -- Column 2 Row 1
//Switch 12 -- Column 3 Row 1
//
//The PIC16F886 Microcontroller from Microchip is being used.
//2x16 LCD Display being used
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include "lcd.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////DEFINE STATEMENTS
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define COL_1 RB0
#define COL_2 RB1
#define COL_3 RB7
#define ROW_1 RB3
#define ROW_2 RB4
#define ROW_3 RB5
#define ROW_4 RB6
#define DelayS(T) {unsigned char i; for (i = 0; i < T * 10; i++) __delay_ms(100);} //Delay Macro
#define _XTAL_FREQ 4000000 //Needs to be set for __delay_ms
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////CONFIGURATION FUSES (BITS)
////Master Clear Reset enabled & Internal RC No Clock & Watchdog Timer Disable & Power Up Timer On & Brown Out Reset Disabled &
////Low Voltage Porgramming Disabled & Code Unprotect
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
__CONFIG (MCLREN & INTIO & WDTDIS & PWRTEN & BORDIS & LVPDIS & UNPROTECT);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
PORTA = 0x00; //PORTA is cleared and set low
PORTB = 0xFF; //(0b11111111 binary) (0xFF hex)--ROWS set to HIGH, COLUMNS set to HIGH
//PORTB7:B0 is set to high,high,high,high,high,high,high,high
PORTC = 0x00; //PORTC is cleared and set low
TRISA = 0x00; //Set PORTA to outputs for LCD--RA1, RA2, RA4 are Control lines for LCD
TRISB = 0x7C; //(0b01111100 binary) (0x7C hex)--ROWS set to INPUT, COLUMNS set to OUTPUT
//PORTB7:B0 is set to output,input,input,input,input,input,output,output,
//ROWS set to INPUT
TRISC = 0x00; //Set PORTC to outputs for LCD--RC0:RC3 are Data Lines for LCD
ANSEL = 0; //Initialize A/D Ports off
ANSELH = 0; //Initialize ........
CM1CON0 = 0; //Initialize Comparator 1 off
CM2CON0 = 0; //Initialize Comparator 2 off
OPTION = 0b01010101; //OPTION REG
//xbxxxxx101 1:64
//xbxxxx0xxx Prescaler set to Timer0
//xbxxx1xxxx (T0SE) set to Increment on high-to-low transition on T0CKI pin
//xbxx0xxxxx (T0CS) Internal instruction cycle clock
//xbx1xxxxxx (INTEDG) Interrupt on rising edge of INT pin
//xb0xxxxxxx (RBPU) PORTB pull-ups are enabled by individual PORT latch values
RBPU = 0; //Don't think I need this, but to be safe...PORTB Weak Internal Pullups enabled
WPUB0 = 0; //COL_1 Weak pullup is individually DISABLED--OUTPUT
WPUB1 = 0; //COL_2 Weak Pullup is inidivdually DISABLED--OUTPUT
WPUB2 = 0; //Not being used...Weak Pullup is individually DISABLED
WPUB3 = 1; //ROW_1 Weak Pullup is individually ENABLED--INPUT
WPUB4 = 1; //ROW_2 Weak Pullup is individually ENABLED--INPUT
WPUB5 = 1; //ROW_3 Weak Pullup is individually ENABLED--INPUT
WPUB6 = 1; //ROW_4 Weak Pullup is individually ENABLED--INPUT
WPUB7 = 0; //COL_3 Weak Pullup is individually DISABLED--INPUT
lcd_init(); //LCD Display is Initialized...See LCD.C file and LCD.h
unsigned char debouncecount;
while (1)
{
lcd_clear; //Clear LCD
lcd_goto(0); //Go to Line 1 Position 1
lcd_puts("Matrix Switch"); //Display "Matrix Switch"
lcd_goto(40); //Go to Line 2 Position 1
lcd_puts("Press Button"); //Display "Press Button"
for (debouncecount = 0; debouncecount <= 10; debouncecount++);
{
__delay_ms(1);
COL_1 = 0; //COLUMN 1 is set LOW
if (ROW_1 == 0) //and If ROW 1 is LOW...
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 3"); //Display "Flat"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_2 == 0) //if ROW 2 is LOW...
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 6"); //Display "Switch 6"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_3 == 0) //If ROW 3 is LOW
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 9"); //Display "Switch 9"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_4 == 0) //If ROW 4 is LOW
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 12"); //Display "Switch 12"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
COL_1 = 1; //COLUMN 1 is set HIGH again
COL_2 = 0; //COLUMN 2 is set LOW
if (ROW_1 == 0) //and If ROW 1 is LOW...
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 2"); //Display "Switch 2"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_2 == 0) //if ROW 2 is LOW...
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 5"); //Display "Switch 5"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_3 == 0) //If ROW 3 is LOW
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 8"); //Display "Switch 8"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_4 == 0) //If ROW 4 is LOW
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 11"); //Display "Switch 11"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
COL_2 = 1; //COLUMN 2 is set HIGH again
COL_3 = 0; //COLUMN 3 is set LOW
if (ROW_1 == 0) //and If ROW 1 is LOW...
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 1"); //Display "Switch 1"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_2 == 0) //if ROW 2 is LOW...
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 4"); //Display "Switch 4"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_3 == 0) //If ROW 3 is LOW
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 8"); //Display "Switch 8"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
if (ROW_4 == 0) //If ROW 4 is LOW
{ //...
lcd_clear(); //...
lcd_goto(0); //...
lcd_puts("Switch 12"); //Display "Switch 12"
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(100);
}
COL_3 = 1; //COLUMN 3 is set HIGH again
debouncecount = 0;
}
}
}