|
|
View previous topic :: View next topic |
Author |
Message |
Nisar
Joined: 16 Nov 2007 Posts: 20
|
4x4 Keypad and 6 Seven Segment |
Posted: Fri Mar 20, 2009 12:37 pm |
|
|
I want to display on seven segment when any key from keypad is pressed. i.e when I press key1 display show 1, key2 show 2 and so on. Plz anyone send me CCS C code example.
Regards
Nisar Ahmed |
|
|
Nisar
Joined: 16 Nov 2007 Posts: 20
|
4x4 Keypad and 6 Seven Segment CCS C Code for every one |
Posted: Tue Mar 31, 2009 12:10 pm |
|
|
Code: | //experiment purpose: familiar how to scan key matrix
//program without process key shake,not think multi-keys pressed at the same time too.
//the lowest Seven Segment display corresponding key( such as press K10 display 10,press K25 display 25)
//if no key pressed display FF
//key and key scan result corresponding
// key key scan result key key scan result
// K1 0XE7 K09 0XB7
// K2 0XEB K10 0XBB
// K3 0XED K11 0XBD
// K4 0XEE K12 0XBE
// K5 0XD7 K13 0X77
// K6 0XDB K14 0X7B
// K7 0XDD K15 0X7D
// K8 0XDE K16 0X7E
#include <16F877.h> // PIC16F877 header file
#use delay(clock=4000000) // for 4Mhz crystal
#fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode
#byte port_a=5 /* define the location of register port_a */
#byte port_b=6 /* define the location of register port_b */
#byte port_c=7 /* define the location of register port_c */
#byte port_d=8 /* define the location of register port_d */
int result;
void delay(); //delay function declare
void init(); //I/O PORT initialize function declare
void scan(); //key scan function declare
void display(int x); //display function declare
//---------------------------------------------------
//main program
void main()
{
while(1) //circle work
{
init(); //call initialize subprogram
scan(); //call key scan subprogram
display(result); //call result display subprogram
}
}
//---------------------------------------------------
//initialize function
void init()
{
// Set_tris_a(0X07); // set A PORT general I/O PORT
Set_tris_a(0X0F); //A PORT low 4 bits INPUT,high 4 bits OUTPUT
Set_tris_c(0XF0); //C PORT high 4 bits INPUT,low 4 bits OUTPUT
Set_tris_d(0X00); //set D PORT OUTPUT
Port_a=(0XFF);
Port_d=(0XFF); //clear all display
}
//---------------------------------------------------
//key scan program
void scan()
{
Port_C=(0XF7); //C3 OUTPUT low,the other 3 bits OUTPUT high
delay_us(1); //delay
result=PORT_C; //read C PORT
result=result&0xf0; //clear low 4 bits
if(result!=0xf0) //judge if high 4 bits all 1(all 1 is no key press)
{
result=result|0x07; //no,add low 4 bits 0x07 as key scan result
}
else //yes,change low 4 bits OUTPUT, judge if a key press again
{
Port_C=(0XFb); //C2 OUTPUT low,the other 3 bits OUTPUT high
delay_us(1); //delay
result=PORT_C; //read C PORT
result=result&0xf0; //clear low 4 bits
if(result!=0xf0) //judge if high 4 bits all 1(all 1 is no key press)
{
result=result|0x0b; //no,add low 4 bits 0x0b as key scan result
}
else //yes,change low 4 bits OUTPUT, judge if a key press again
{
Port_C=(0XFd); //C1 OUTPUT low,the other 3 bits OUTPUT high
delay_us(1); //delay
result=PORT_C; //read C PORT
result=result&0xf0; //clear low 4 bits
if(result!=0xf0) //judge if high 4 bits all 1(all 1 is no key press)
{
result=result|0x0d; //no,add low 4 bits 0x0d as key scan result
}
else //yes,change low 4 bits OUTPUT, judge if a key press again
{
Port_C=(0XFe); //C0 OUTPUT low,the other 3 bits OUTPUT high
delay_us(1); //delay
result=PORT_C; //read C PORT
result=result&0xF0;//clear low 4 bits
if(result!=0xF0) //judge if high 4 bits all 1(all 1 is no key press)
{
result=result|0x0e;//no,add low 4 bits 0x0e as key scan result
}
else //yes,all key scan end,no key press,set no key press flag
{
result=0xFF; //key scan result 0xff as no key press flag
}
}
}
}
}
//----------------------------------------------------------
//display program
void display(int x)
{
switch(result)
{
case 0xe7:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0xf9;PORT_A=0X2F;delay(); break; //K10
case 0xeb:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0xa4;PORT_A=0X2F;delay(); break; //K11
case 0xed:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0xb0;PORT_A=0X2F;delay(); break; //K12
case 0xee:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0x99;PORT_A=0X2F;delay(); break; //K13
case 0xd7:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0x92;PORT_A=0X2F;delay(); break; //K14
case 0xdb:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0x82;PORT_A=0X2F;delay(); break; //K15
case 0xdd:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0Xf8;PORT_A=0X2F;delay(); break; //K16
case 0xde:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0X80;PORT_A=0X2F;delay(); break; //K17
case 0xb7:
PORT_D=0xc0;PORT_A=0X1F;delay(); PORT_D=0X90;PORT_A=0X2F;delay(); break; //K18
case 0xbb:
PORT_D=0xf9;PORT_A=0X1F;delay(); PORT_D=0Xc0;PORT_A=0X2F;delay(); break; //K19
case 0xbd:
PORT_D=0xf9;PORT_A=0X1F;delay(); PORT_D=0xf9;PORT_A=0X2F;delay(); break; //K20
case 0xbe:
PORT_D=0xf9;PORT_A=0X1F;delay(); PORT_D=0xa4;PORT_A=0X2F;delay(); break; //K21
case 0x77:
PORT_D=0xf9;PORT_A=0X1F;delay(); PORT_D=0xb0;PORT_A=0X2F;delay(); break; //K22
case 0x7b:
PORT_D=0xf9;PORT_A=0X1F;delay(); PORT_D=0x99;PORT_A=0X2F;delay(); break; //K23
case 0x7d:
PORT_D=0xf9;PORT_A=0X1F;delay(); PORT_D=0x92;PORT_A=0X2F;delay(); break; //K24
case 0x7e:
PORT_D=0xf9;PORT_A=0X1F;delay(); PORT_D=0x82;PORT_A=0X2F;delay(); break; //K25
case 0xff:
PORT_D=0x8e;PORT_A=0X1F;delay(); PORT_D=0x8e; PORT_A=0X2F; delay(); //no key press
}
}
//------------------------------------------------------------------
//delay program
void delay() //delay program
{
int i; //define integer variable
for(i=0x50;i--;); //delay
} |
Regards
Nisar ahmed |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Tue Mar 31, 2009 6:43 pm |
|
|
Nisar,
Have you posted this in the code library? I'm sure some folks would appreciate it. |
|
|
John P
Joined: 17 Sep 2003 Posts: 331
|
|
Posted: Wed Apr 01, 2009 11:02 am |
|
|
Congratulations on being the only person ever to post code here with any attention given to clear formatting! All right, maybe the second person, or the third.
I hope you have pullup resistors on the input pins of Port C, because if you don't, there's no expectation that the input pins will test high when no button is pressed; they'll just be a floating level. If you used Port B instead, you could use the internal pullups and not have this issue.
If a user presses two buttons at once, you may have a situation of two outputs fighting with each other. You could avoid this by setting all the bits in the output register low, but use the TRIS register to make only one pin at a time actually be an output. |
|
|
otacon
Joined: 12 Nov 2010 Posts: 3
|
|
Posted: Fri Nov 12, 2010 10:18 pm |
|
|
There is something wrong with this code, port A always not in low or high(emulation by proteus). How about solve? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9226 Location: Greensville,Ontario
|
|
Posted: Sat Nov 13, 2010 6:18 am |
|
|
re:
problem ... Port A in Proteus simulation not working correctly.
solution..... DO NOT trust Proteus ! It is a simulator NOT the real world !
That being said, try a very,very simple program with the PORT A problem and if it fails, get rid of Proteus. If it works, reduce this program to just the Port A code and simulate it. If it fails compare the two programs to see what is different between them.
In over 35 years of programming, I've nevere found a simulator that I'd trust your life to ! |
|
|
otacon
Joined: 12 Nov 2010 Posts: 3
|
|
Posted: Sun Nov 14, 2010 9:57 pm |
|
|
I have a source can run in Proteus as well,it very short,it's 5x5 key board.Read from PortC and PortD,display resuilt in led 7s driver by Port B and PortE. It's can be anti shaking and have keypressed/keyrelease feature
This is Sub:
//////////////////////////////////////////
int rotate,n,k,col,key_value,key_release;
void read_key()
{
output_C(0xff);
rotate = 0xfe;
for(n=1;n<6;++n) //n la gia tri cot
{
output_D(rotate);
delay_us(10);
col=portC; //doc vao tu PortC
if(col!=0xff)
goto have_key1;
else
rotate=rotate<<1; //dich trai 1 bit
}
key_release=0xff;
key_value=0;
goto let_out;
have_key1:
if(key_release==0xff)
{
for(k=1;k<6;k++) //k la gia tri hang
{
if(!bit_test(col,k-1))
{
key_value=((k-1)*5+(n-1)+1); //gia tri phim bam tu 1-25
key_release=0x00; //keypressed
}
}
}
let_out:
delay_us(5);
}
//////////////////////////////////////////
I have a Proteus File,but i don't know how to upload here.If you need,PM for me! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|