View previous topic :: View next topic |
Author |
Message |
Salah
Joined: 15 Apr 2020 Posts: 4
|
Keypad 4x4 |
Posted: Wed Apr 15, 2020 1:02 pm |
|
|
Hello, I am new in pic c compiler, I was using MikroC and switched to CCS.
I am doing the program of the keypad 4x4 however I found the program of the keypad but it's not the one that I need to use.
I am going to change the program of the button " / " in keypad to clear all, the button " ON/C " delete one character not all, and the button " = " is to confirm.
Can anyone help me? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Apr 15, 2020 1:16 pm |
|
|
In the code library here:
<http://www.ccsinfo.com/forum/viewtopic.php?t=28022&start=14>
There is a more flexible version of the standard driver.
The value returned by each key is defined in the array 'KEYS'. You just change
the entries in this to what you want the keypad to return. |
|
|
Salah
Joined: 15 Apr 2020 Posts: 4
|
|
Posted: Wed Apr 15, 2020 1:55 pm |
|
|
Ttelmah wrote: | In the code library here:
<http://www.ccsinfo.com/forum/viewtopic.php?t=28022&start=14>
There is a more flexible version of the standard driver.
The value returned by each key is defined in the array 'KEYS'. You just change
the entries in this to what you want the keypad to return. |
I didn't find the ones I am looking for, could you help me more?
here is my program
Code: | void main ()
{//TRISA=0b010000;
port_b_pullups(true);
kbd_init();
lcd_init();
Trisc=0x00;
Portc=0x00;
T1CON=0b00110101;
TMR0=255;
OPTION_REG=0b00111000;
lcd_putc("Bonjour");
delay_ms(500);
lcd_putc('\f');
while (1)
{
c=kbd_getc();
if(c!=0){
if(c=='/')
lcd_putc('\f');
else
lcd_putc(c);
}
} |
I already found the program of clear all, I just need to find now program to delete one character and add it here. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Wed Apr 15, 2020 4:44 pm |
|
|
Since you're using an LCD module, there are at least 2 possible methods.
1) read the LCD module for the current cursor position, execute a 'backspace' command, then print the new character.
2) store the 'data' in an array (a buffer), when a 'backspace' is issued, subtract 1 from the index of the array, then insert the new character, you then have to print the entire array onto the LCD module.
#1 is easier BUT you need to be able to read the LCD module data.
#2 will be technically slower, but you may not notice that.
There may be more ways, everyone has their 'favorites'.
Jay |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Apr 15, 2020 4:56 pm |
|
|
Do you want backspace ? It's this:
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Thu Apr 16, 2020 12:35 am |
|
|
The point is you can change the definitions of the keys in the KEYS' array
to return the values to do what you actually 'want'. So change the key
you want to give backspace to be '\b', the one you want to clear screen
to '\f', and the one you want to be 'confirm' to '\n' (newline).
Then your code can just print every character till the '\n' is seen for
'confirm'.
However I have to query what you actually want to do?. Though this will
allow you to type to the LCD, if you want to actually 'do' anything with
this data you are going to have to store it while it is typed, so your program
can then use what has been typed.... |
|
|
Salah
Joined: 15 Apr 2020 Posts: 4
|
|
Posted: Thu Apr 16, 2020 10:08 am |
|
|
PCM programmer wrote: | Do you want backspace ? It's this:
|
It doesn't work, this is how I typed it :
Code: |
c=kbd_getc();
if(c!=0){
if(c=='/')
lcd_putc('\b');
else
lcd_putc(c);
}
|
|
|
|
Salah
Joined: 15 Apr 2020 Posts: 4
|
|
Posted: Thu Apr 16, 2020 10:31 am |
|
|
Here is the whole program guys, can you find the problem?
Code: |
#include <16f877.h>
#use delay( clock= 4M)
#fuses XT, NOWDT
#byte INTCON = 0x0B
#bit GIE=INTCON.7
#bit TOIE=INTCON.5
#byte TMR0=0x01
#byte PORTB=0x06
#byte TRISB=0x86
#byte PORTA=0x05
#byte TRISA=0x85
#byte OPTION_REG=0x81
#byte PIE1=0x8C
#byte TMR1H=0x0F
#byte TMR1L=0x0E
#byte T1CON=0x10
#bit PEIE = INTCON.6
#bit INTE=INTCON.4
#bit TMR1IE=PIE1.0
#bit RBIE=INTCON.3
#byte trisc=0x87
#byte Portc=0x07
int k=0,i=0,j=0,y=0,k1=0;
char c;
char password[5];
char kp[16];
int T[7]={0x00,0x01,0x02,0x04,0x08,0x10,0x00};
#include "clavier16T.c"
#include <lcd.c>
#priority rtcc,timer1,rb
#int_rtcc
void F()
{
TMR0=255;
k++;
if(k==2)
{k=0;
}
}
#int_timer1
void F2(){
if(k==1)
{
TMR1H=11;
TMR1L=220;
k1++;
Portc=T[j];
if(k1==3)
{k1=0;
j++;
if(j==1)
{
lcd_gotoxy(1,1);
lcd_putc("Electrovanne 1 en marche ");
}
if(j==2)
{lcd_gotoxy(1,1);
lcd_putc("Electrovanne 2 en marche ");}
if(j==3)
{lcd_gotoxy(1,1);
lcd_putc("Electrovanne 3 en marche ");}
if(j==4)
{lcd_gotoxy(1,1);
lcd_putc("Electrovanne 4 en marche ");}
if(j==5)
{lcd_gotoxy(1,1);
lcd_putc("Electrovanne 5 en marche ");}
if(j==7)
{j=0;k=0;
lcd_gotoxy(1,1);
lcd_putc("Electrovanne en repos. ");}
}
}
//lcd_gotoxy(1,2);
//printf(lcd_putc,"Electrovanne %u en marche",j);
}
#int_rb
void F3(){
c=kbd_getc();
if(c!=0){
if(c=='/')
lcd_send_byte(0,1);
else
lcd_putc(c);
}
}
i++;
}
void main ()
{//TRISA=0b010000;
port_b_pullups(true);
kbd_init();
lcd_init();
Trisc=0x00;
Portc=0x00;
T1CON=0b00110101;
TMR0=255;
OPTION_REG=0b00111000;
while (1)
{ GIE=1;
TOIE=1;
TMR1IE=1;
PEIE=1;
RBIE=1;
}
} |
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Thu Apr 16, 2020 11:20 am |
|
|
The biggest problem is that you're not using the easy to understand, easy to use CCS C language ! |
|
|
|