// TestLCDKey.c // Program to test LCD and keypad. // For project using USB interface with Bootloader // The LCD display with two lines, 24 characters each. // There are three control lines (RD4:RD6) and four data lines (RD3:RD0). // RD6 - RS=0 Data represents Command, RS=1 Data represents Character // RD5 - RW=0 Writing into the LCD module // RD4 - E =1 Data is latched into LCD module during low to hight transition // The keypad is connected to an keypad encoder which generate 0000 to 1111 // RB5 - DA Data Available pin output 1 when a key is pressed // RB3 to RB0 - Data output by encoder #include #include #include "lcd.h" // Include file is located in the project directory // Include this when using Bootloader Program ================================ #pragma udata extern void _startup (void); // See c018i.c in your C18 compiler dir #pragma code _RESET_INTERRUPT_VECTOR = 0x000800 void _reset (void) { _asm goto _startup _endasm } #pragma code #pragma code _HIGH_INTERRUPT_VECTOR = 0x000808 void _high_ISR (void) { ; } #pragma code _LOW_INTERRUPT_VECTOR = 0x000818 void _low_ISR (void) { ; } #pragma code #pragma code // additional codes ends here =============================================================== // Your program declarations start here:==== #define LCD_RS PORTDbits.RD6 // Register Select on LCD #define LCD_EN PORTDbits.RD4 // Enable on LCD controller #define LCD_WR PORTDbits.RD5 // Write on LCD controller #define KEY_DA PORTBbits.RB5 // 74922 DA output #define KEY_PORT PORTB // RB3 to RB0 has keypad data unsigned char key,msgindex,outchar,lcdindex,p1,p2,p3,p4,p5,p6,p7,p8,p9,key2,inchar; unsigned int i; char Message1 [ ] = "Enter number : "; // Defining a 20 char string char tst [4]="POLY"; //--- Function for writing a command byte to the LCD in 4 bit mode ------------- void lcd_write_cmd(signed char cmd) { unsigned char temp2; LCD_RS = 0; // Select LCD for command mode Delay10TCYx(4); // 40us delay for LCD to settle down temp2 = cmd; temp2 = temp2 >> 4; // Output upper 4 bits, by shifting out lower 4 bits PORTD = temp2 & 0x0F; // Output to PORTD which is connected to LCD Delay1KTCYx(10); // 10ms -Delay at least 1 ms before strobing lcd_strobe(); Delay1KTCYx(10); // 10ms - Delay at least 1 ms after strobing temp2 = cmd; // Re-initialise temp2 PORTD = temp2 & 0x0F; // Mask out upper 4 bits Delay1KTCYx(10); // 10ms - Delay at least 1 ms before strobing lcd_strobe(); Delay1KTCYx(10); // 10ms - Delay at least 1 ms before strobing } //---- Function to write a character data to the LCD --------------------------- void lcd_write_data(char data) { char temp1; LCD_RS = 1; // Select LCD for data mode Delay10TCYx(4); // 40us delay for LCD to settle down temp1 = data; temp1 = temp1 >> 4; PORTD = temp1 & 0x0F; Delay1KTCYx(10); LCD_RS = 1; Delay1KTCYx(10); //_-_ strobe data in lcd_strobe(); Delay1KTCYx(10); temp1 = data; PORTD = temp1 & 0x0F; Delay1KTCYx(10); LCD_RS = 1; Delay1KTCYx(10); //_-_ strobe data in lcd_strobe(); Delay1KTCYx(10); } //-- Function to generate the strobe signal for command and character---------- void lcd_strobe(void) // Generate the E pulse { LCD_EN = 1; // E = 0 Delay1KTCYx(1); // 1ms delay for LCD_EN to settle LCD_EN = 0; // E = 1 Delay1KTCYx(1); // 1ms delay for LCD_EN to settle } //---- Function to initialise LCD module ---------------------------------------- void lcd_init(void) { TRISD = 0x00; PORTD = 0x00; // PORTD is connected to LCD data pin LCD_EN = 0; LCD_RS = 0; // Select LCD for command mode LCD_WR = 0; // Select LCD for write mode Delay10KTCYx(250); // Delay a total of 1 s for LCD module to Delay10KTCYx(250); // Delay10KTCYx(250); // Delay10KTCYx(250); // finish its own internal initialisation /* The data sheets warn that the LCD module may fail to initialise properly when power is first applied. This is particularly likely if the Vdd supply does not rise to its correct operating voltage quickly enough. It is recommended that after power is applied, a command sequence of 3 bytes of 3xh be sent to the module. This will ensure that the module is in 8-bit mode and is properly initialised. Following this, the LCD module can be switched to 4-bit mode. */ lcd_write_cmd(0x33); lcd_write_cmd(0x32); lcd_write_cmd(0x28); // 001010xx – Function Set instruction // DL=0 :4-bit interface,N=1 :2 lines,F=0 :5x7 dots lcd_write_cmd(0x0E); // 00001110 – Display On/Off Control instruction // D=1 :Display on,C=1 :Cursor on,B=0 :Cursor Blink on lcd_write_cmd(0x06); // 00000110 – Entry Mode Set instruction // I/D=1 :Increment Cursor position // S=0 : No display shift lcd_write_cmd(0x01); // 00000001 Clear Display instruction Delay10KTCYx(20); // 20 ms delay } //----- Function to obtained wait for key press and returns its ASCII value char getkey(void) { char keycode; const unsigned char lookup[] = "123F456E789DA0BC "; while (KEY_DA==0); //wait for key to be pressed keycode=KEY_PORT &0x0F; //read from encoder at portB,mask upper 4 bits while (KEY_DA==1); //wait for key to be released return(lookup[keycode]); //convert keycode to its ascii value for LCD } //Function of lookup table int myLookup(char myChar) { int myRet = 0; //find ascii given char if (myChar == 'A'){ myRet = 65; } else if(myChar == 'B'){ myRet = 66; } else if(myChar == 'C'){ myRet = 67; } else if(myChar == 'D'){ myRet = 68; } else if(myChar == 'E'){ myRet = 69; } else if(myChar == 'F'){ myRet = 70; } else if(myChar == 'G'){ myRet = 71; } else if(myChar == 'H'){ myRet = 72; } else if(myChar == 'I'){ myRet = 73; } else if(myChar == 'J'){ myRet = 74; } else if(myChar == 'K'){ myRet = 75; } else if(myChar == 'L'){ myRet = 76; } else if(myChar == 'M'){ myRet = 77; } else if(myChar == 'N'){ myRet = 78; } else if(myChar == 'O'){ myRet = 79; } else if(myChar == 'P'){ myRet = 80; } else if(myChar == 'Q'){ myRet = 81; } else if(myChar == 'R'){ myRet = 82; } else if(myChar == 'S'){ myRet = 83; } else if(myChar == 'T'){ myRet = 84; } else if(myChar == 'U'){ myRet = 85; } else if(myChar == 'V'){ myRet = 86; } else if(myChar == 'W'){ myRet = 87; } else if(myChar == 'X'){ myRet = 88; } else if(myChar == 'Y'){ myRet = 89; } else if(myChar == 'Z'){ myRet = 90; } return myRet; }//end func void moveSol(int ascKey){ switch(ascKey) //motors { case 0: PORTA=0b11111111; //intial start to make sure that all the solenoids are down & it also acts as a spacebar Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 65: PORTA=0b00111110; //display A Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 66: PORTA=0b00111010; //display B Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 67: PORTA=0b00111100; //display C Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 68: PORTA=0b00110100; //display D Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 69: PORTA=0b00110110; //display E Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 70: PORTA=0b00111000; //display F Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 71: PORTA=0b00110000; //display G Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 72: PORTA=0b00110010; //display H Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 73: PORTA=0b00111001; //display I Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 74: PORTA=0b00110001; //display J Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 75: PORTA=0b00101110; //display K Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 76: PORTA=0b00101010; //display L Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 77: PORTA=0b00101100; //display M Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 78: PORTA=0b00100100; //display N Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 79: PORTA=0b00100110; //display O Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 80: PORTA=0b00101000; //display P Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 81: PORTA=0b00100000; //display Q Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 82: PORTA=0b00100010; //display R Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 83: PORTA=0b00101001; //display S Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 84: PORTA=0b00011110; //display T Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 85: PORTA=0b00001110; //display U Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 86: PORTA=0b00100010; //display V Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 87: PORTA=0b00010001; //display W Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 88: PORTA=0b00001100; //display X Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 89: PORTA=0b00000100; //display Y Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; case 90: PORTA=0b00000110; //display Z Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec Delay10KTCYx(250); //delay 1sec break; }//end move sol } // ---- Main Program --------------------------------------------------------------- void main(void) { lcd_init(); // Initialise LCD module TRISA=0b00000000; // Initialise the Motor PORTA=0b00000000; LCD_RS = 1; // Select LCD for character data mode Delay1KTCYx(1); // 1 ms delay while(1) { lcd_write_cmd(0x80); // Move cursor to line 1 position 1 for (msgindex = 0; msgindex < 15; msgindex++) //for 20 char LCD module { outchar = Message1[msgindex]; lcd_write_data(outchar); // write character data to LCD } lcd_write_cmd(0xC0); // Move cursor to line 2 position 1 { key=getkey(); // waits and get an ascii key number when pressed p1=key; //display first number lcd_write_data(key); //display on LCD key=getkey(); p2=key; //display second number lcd_write_data(key); //display on LCD key=getkey(); p3=key; //display third number lcd_write_data(key); //display on LCD key=getkey(); p4=key; //display fourth number lcd_write_data(key); //display on LCD key=getkey(); p5=key; //display fifth number lcd_write_data(key); //display on LCD key=getkey(); p6=key; //display sixth number lcd_write_data(key); //display on LCD key=getkey(); p7=key; //display eight number lcd_write_data(key); //display on LCD key=getkey(); p8=key; //display ninth number lcd_write_data(key); //display on LCD key=getkey(); p9=key; //confirm key = Enter any input on the keypad to end //lcd_write_data(key); //display on LCD } if(p1=='6' && p2=='5') { key2=65; } else if (p1=='6' && p2=='6') { key2=66; } else if (p1=='6' && p2=='7') { key2=67; } else if (p1=='6' && p2=='8') { key2=68; } else if (p1=='6' && p2=='9') { key2=69; } else if (p1=='7' && p2=='0') { key2=70; } else if (p1=='7' && p2=='1') { key2=71; } else if (p1=='7' && p2=='2') { key2=72; } else if (p1=='7' && p2=='3') { key2=73; } else if (p1=='7' && p2=='4') { key2=74; } else if (p1=='7' && p2=='5') { key2=75; } else if (p1=='7' && p2=='6') { key2=76; } else if (p1=='7' && p2=='7') { key2=77; } else if (p1=='7' && p2=='8') { key2=78; } else if (p1=='7' && p2=='9') { key2=79; } else if (p1=='8' && p2=='0') { key2=80; } else if (p1=='8' && p2=='1') { key2=81; } else if (p1=='8' && p2=='2') { key2=82; } else if (p1=='8' && p2=='3') { key2=83; } else if (p1=='8' && p2=='4') { key2=84; } else if (p1=='8' && p2=='5') { key2=85; } else if (p1=='8' && p2=='6') { key2=86; } else if (p1=='8' && p2=='7') { key2=87; } else if (p1=='8' && p2=='8') { key2=88; } else if (p1=='8' && p2=='9') { key2=89; } else if (p1=='9' && p2=='0') { key2=90; } else if (p1=='0' && p2=='0') //intial start to make sure that all the solenoids are down & it also acts as a spacebar {key2=0; } for (i = 0; i<4; i++) //i=the number of letters to appear with the motor { char c1 = tst[i]; //read character inside array //lookup ascii of char c1 int ascKey =myLookup(c1); moveSol(ascKey); } lcd_write_cmd(0x01); // 00000001 Clear Display instruction Delay1KTCYx(250); // Delay for 1 s before proceeding to repeat Delay1KTCYx(250); //while(1); } }