你这个编译不通过吧。??参数定义要放函数开头, 还有,看你的扫描不对,应该是一次只是仅送一个口为0 然后扫,然后再送第二个口,扫。你的0X10,左移,却每次一个口为高,反了。送口值尽量先定义好,如0XFE 0XFD,0XFB,0XF7 呵呵,只能一个口为0。P口有上拉
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar key=16,key_p=16;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴数码管段选码表,无小数点
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<110;i++);
}
void key_press()
{
uchar kess;
P1=0x0f;
delay(1);
kess=P1^0x0f; //P1口的状态导或上0x0f,如果下了高4位不管,看低4位是多少
switch (kess)
{
case 1:key=0; break;
case 2:key=1; break;
case 4:key=2; break;
case 8:key=3; break;
default: key = 16;
}
P1=0xf0;
delay(1);
kess=P1>>4^0x0f;
switch (kess)
{
case 1:key+=12;break;
case 2:key+=8; break;
case 4:key+=4; break;
case 8:key+=0; break;
}
}
void key_tst()
{
if(P1!=0xf0)
delay(5);
if(P1!=0xf0)
key_press();
if(key_p!=key)
{
P0=table[key];
P2=0xff;
key_p=key;
}
delay(100);
}
void main()
{
P0=0x00;
while(1)
{
key_tst();
}
}
你对一下这个吧。
你好!
http://hi.baidu.com/chinasndw
我这上面有相关的按键程序,你可以参考!祝你成功!