关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误,请各位帮帮忙,把错误给修改下。谢

#include<reg52.h>

unsigned char num[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;
unsigned char k;
void delay_nms(unsigned int n);
{
unsigned int i,j;
for(i=n,i>0,i--)
for (j=112,j>0,j--)
}
void getkey()
{
unsigned char x,y,z;
p^1=0x0f;
if(p^1!=0x0f)
{delay_nms(10);
if(p1!=0x0f)
{x=p1&0x0f;
p^1=0xf0;
Y=p^1&0xf0;
z=x|y;
switch(z)
; {
case 0xe7;k=0;break;
case 0xd7;k=1;break;
case 0xb7;k=2;break;
case 0x77;k=3;break;
case 0xeb;k=4;break;
case 0xdb;k=5;break;
case 0xbb;k=6;break;
case 0x7b;k=7;break;
case 0xed;k=8;break;
case 0xdd;k=9;break;
case 0xbd;k=10;break;
case 0x7d;k=11;break;
case 0xee;k=12;break;
case 0xde;k=13;break;
case 0xbe;k=14;break;
case 0x7e;k=15;break;
}
}
}
}
void main(void)
{unsigned char m=0;
unsigned char n=0;
while(1)
{
getkey()
m=k/10;
n=k&10;
p^2=num[m];
p^0=num[n];

}
}

//电路说明如下。
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//两位数码显示器: P0口输出七段码,P2口输出位选码。
//==============================================================
//C语言程序如下。
/*************************************************************
* 文件名: KEY_LED.c
* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
**************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
/**************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***************************************************************/
void Delay_1ms(uint x)
{
uint i;
uchar j;
for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
}
/**************************************************************
* 名称: Keyscan()
* 功能: P1外接4×4按键, 按照扫描法读出键值
* 输出: 按键值0~15/如无键按下, 返回16
***************************************************************/
uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循环四次
P1 = Buffer[j]; //在P1高四位分别输出一个低电平
temp = 0x01; //计划先判断P1.0位
for(i = 0; i < 4; i++) { //循环四次
if(!(P1 & temp)) //从P1低四位,截取1位
return (i + j * 4); //返回取得的按键值
temp <<= 1; //判断的位,左移一位
} }
return 16; //判断结束,没有键按下,返回16
} //呵呵,实质性的语句不过8行,就是这么简练!
/**************************************************************
* 名称: Display(uchar k)
* 功能: 将参数分成十位、个位分别显示
* 输入: k (键盘数值)
* 输出: P0口输出七段码,P2口输出位选码
***************************************************************/
void Display(uchar k)
{
P2 = 0; //消隐
P0 = table[k / 10];
P2 = 0x02; Delay_1ms(5); //显示5ms十位
P2 = 0; //消隐
P0 = table[k % 10];
P2 = 0x01; Delay_1ms(5); //显示5ms个位
}
/**************************************************************
* 名称 : Main()
* 功能 : 主函数
***************************************************************/
void Main(void)
{
uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值
while(1) {
//---------以下读入按键、消掉、等待按键释放
P1 = 0xff;
Key_Temp1 = Keyscan(); //先读入按键
if(Key_Temp1 != 16) { //如果有键按下
//Delay_1ms(10); //延时一下
Display(Key_Value); //可用显示代替延时
Key_Temp2 = Keyscan(); //再读一次按键
if (Key_Temp1 == Key_Temp2)//必须是两次相等
Key_Value = Key_Temp1; //才保存下来,这就是消除抖动
while(Keyscan() <= 16); //等待按键释放
}
//---------以下是对按键的处理
Display(Key_Value); //显示键值
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-06
p^1这个不是P1口,改成P1,;同理将p^2改成P2,p^0改成P0 ,这一句x=p1&0x0f;
中p1最好大写P1追问

恩,你说的对,我昨天查了下,应该是P1的,^后面是表示位的,谢谢了啊

本回答被提问者采纳
第2个回答  2011-03-05
根据你选的芯片,进行编译连接。P0,P1口都是在一个预定义文件里定义过的。也有可能是你的这个预定义文件丢失了。造成编译时,不认识P0,P1。追问

我也觉得是这样,但是我不会弄。没用过C语言写STC89c52单片机的程序,我以前都是用汇编的~所以有的细节还是不太明白~

第3个回答  2012-06-26
请问你这个课程设计在吗,我估计完不成这个课程设计,你能发给我吗,QQ1402352787
相似回答