Electronic Projects, forums and more.

Go Back   Electronic Circuits Projects Diagrams Free > Electronics Categories > Micro Controllers


Micro Controllers Discuss all aspects of micro controllers - building them, coding them, etc. All controllers are welcome - PIC, BASIC, Z8 Encore!, etc.

Reply
 
Thread Tools Display Modes
Old 20th February 2008, 02:08 AM   (permalink)
Default what wrong with my keypad code

Uhm ... my question is in my code, red part, thanks in advance !
Code:
   // MNEMONICS FOR BUTTONS
   // MNEMONICS FOR LCD
   #define   lcd_rs   PIN_B0
   #define   lcd_rw   PIN_B1
   #define   lcd_e   PIN_B2
   #define   lcd_cmd_wri   0x00
   #define   lcd_data_wri   0x01
   #define   lcd_busy_rd   0x02
   #define   lcd_set_function   0x38   //8 bit interface, 2 line mode, 5x7 dot format
   #define   lcd_set_visible   0x0F   //Display on, cursor underline on, cursor blink on
   #define   lcd_set_shift   0x16   //Cursor move, Right shift
   #define   lcd_set_mode   0x06   //Increment, display shift off
   #define   lcd_set_cgaddr   0x40
   #define   lcd_set_ddaddr   0x80
   #define   lcd_clr   0x01
   #define   lcd_init   0x30
   #define   NULL   0
   #include "D:\Pic16F877\MyProject\Doit\MainDoit\Doit.h"


void LcdEnable();
void WrCmd2Lcd(int cmd);
void WrDat2Lcd(int data);
void InitLcd();
void Speech(int *words,int position);
void LcdWait();
int OnRelease();
void main()
{
   //INTRO OR GUIDED WORDS
   int hello[]="HELLO WORLD! ";
   int keyPressed,key;
   int array[16]={0x31,0x34,0x37,0x3C,0x32,0x35,0x38,0x30,0x33,0x36,0x39,0x3E,0x43,0x26,0x45,0x4D};
   //PIC SET-UP PARAMETERS
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   // TODO: USER CODE!!
   set_tris_b(0x00);
   set_tris_c(0x00);
   InitLcd();
   delay_ms(1000);
   WrDat2Lcd(array[1]);
   key=2;
   WrDat2Lcd(array[key]);
   WrDat2Lcd('A');
   WrDat2Lcd('B');
   Speech(hello,lcd_set_ddaddr+0x40);
   play:
   keyPressed=OnRelease();
   if (keyPressed == -1)
   goto play;
   WrDat2Lcd(array[keyPressed]); 
// I press '1' button, a square dark appear, 
// but if I add WrDat2Lcd('any one char here') after WrDat2Lcd(array[keyPressed]);  
// then when I press '1' button, 
// a square dark and the next number '1' appear on screen, could anyone explain me this phenomenon ? Thanks !!!
   goto play;
}
//----------------------
void LcdEnable()
{
   output_high(lcd_e);
   output_low(lcd_e);
}
//----------------------
void WrCmd2Lcd(int cmd)
{
   set_tris_d(0x00);
   output_high(lcd_rs);
   output_low(lcd_rs);
   output_d(cmd);
   LcdEnable();
}
//----------------------
void WrDat2Lcd(int data)
{
   set_tris_d(0x00);
   output_high(lcd_rs);
   output_low(lcd_rs);
   output_d(data);
   LcdEnable();
   output_high(lcd_e);
}
//----------------------
void InitLcd()
{
   set_tris_d(0x00);
   output_low(lcd_rs);   //added
   output_low(lcd_rw);   //added
   output_low(lcd_e);
   delay_ms(125);
   WrCmd2Lcd(lcd_init);
   delay_ms(20);
   LcdEnable();
   delay_us(200);
   LcdEnable();
   delay_us(100);
   WrCmd2Lcd(lcd_set_function);
   delay_ms(10);
   WrCmd2Lcd(lcd_set_visible);
   delay_ms(10);
   WrCmd2Lcd(lcd_clr);
   delay_us(100);
   WrCmd2Lcd(lcd_set_ddaddr);
   delay_us(100);
}
//-------------------------
void Speech(int *words,int position)
{
   int *textptr;
   textptr = words;
   WrCmd2Lcd(position);
   do
   {
   WrDat2Lcd(*textptr);
   *textptr++;
   }
   while(*textptr != '\0');
}
//----------------------
void LcdWait()
{
   int status;
   set_tris_d(0xFF);
   output_high(lcd_rw);
   do
   {
      status=input_d();
      LcdEnable();
   }
   while(status & 0x80);   // test busy flag.
}
//-------------------------
int OnRelease()
{
   int i,j,k;
   int value[4]={0x07,0x0B,0x0D,0x0E};
   set_tris_a(0x0f);
   set_tris_d(0xf0);
   k=0;
   for(i=0;i<4;i++)
   {
      output_d(value[i]);
      delay_us(100);
      for(j=0;j<4;j++)
      {
         if(!input(40+j))
         {
            do
            {
               delay_ms(400);
            }
            while(!input(40+j));
            return k;
         }
         else
            k++;
      }
   }
   return -1;
}
eleceyes is offline  
Reply With Quote
Reply

Bookmarks

Thread Tools
Display Modes


Similar Threads
Thread Thread Starter Forum Replies Latest
Need PIC16F84A Cool Project Agent 009 Micro Controllers 158 11th March 2007 06:14 AM
Code not working..help Electrix Micro Controllers 15 26th September 2005 11:12 AM
Whats wrong with this code..?? Electrix Micro Controllers 3 30th July 2005 02:08 PM
An error in pic16f84a, why? Zener_Diode Micro Controllers 6 11th April 2004 02:55 AM
code lock keypad questions.... eyevancsu Electronic Projects Design/Ideas/Reviews 7 10th April 2003 07:16 AM



All times are GMT. The time now is 06:48 PM.


Electronic Circuits  |  Electronics Wiki
Powered by vBulletin® Version 3.7.0
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.