编了个C语言的键盘程序有点问题,请指点下!

wdydq 2007-12-20 11:26:30
做了个机械手,想用键盘来控制抓,放物品,现在他显示字符时有点错,高手能帮我在keil里跑下,把我的这个错改下吗?谢谢了!原程序如下:(P2.0--P2.7 是段选,P1.0--P1.5是位选,P0.0--P0.3是列选,P0.4--P0.7是行选)

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
code char tab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x80};
void delay (void){
uchar i;
for(i=254;i>0;i--);
}
uchar keyscan(void){
uchar sccode, recode;
P3=0xf0;
if((P3&0xf0)!=0xf0)
{
delay();
if ((P3&0xf0)!=0xf0)
{
sccode=0xfe; //键盘逐行扫描
while((sccode&0x10)!=0)
{
P3=sccode;
if ((P3&0xf0)!=0xf0)
{
recode=(P3 & 0xf0); //被按键的行玛
sccode=sccode&0x0f;
return((sccode)+(recode));
}
else sccode=(sccode<<1)|0x01; //修改扫描玛
}
}
}
void display (uchar keydisp) 这句要改 {
uchar keytab[18]= {0x7e,0x7d,0x7b,0x77,0xbd,0xbb,0xb7,0xdb,0xd7,0xbe,0xde,0xee,0xed,0xeb,0xe7;}
uchar m;
for(m=0;m<16; m++)
{
if (keytab[m]==keydisp) //查键码表,m为键值
{
P2=0xfe;
P0=tam[m]; //键值显示
}
}
}
void main()
{
uchar key;
P2=0xfe; P0=0x40
P3=0xff;
if(P3==0xff)
{
while(1)
{
key=keyscan();
display(key);
}
}
}
...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
有点难度哦
yanglin5131421 2007-12-29
  • 打赏
  • 举报
回复
强人 呀
ttneil 2007-12-25
  • 打赏
  • 举报
回复
我没有去理你的实现内容,我把你的程序的所有语法错误改正过来,顺便也编排了一下。现在这个程序是可以编译运行的了。
其中keyscan()少了一个},还有就是tam我猜你是tab。类型重定义我用了typedef取代#define,这样编译器才会做类型检查。
其他好像都是小问题了。

#include <reg51.h>

typedef unsigned char uchar;
typedef unsigned int uint;

code char tab[16] =
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x80
};

void delay(void)
{
uchar i;

for (i = 254; i > 0; i--);
}


uchar keyscan(void)
{
uchar sccode;
uchar recode;

P3 = 0xf0;
if ((P3 & 0xf0)!= 0xf0)
{
delay();
if ((P3 & 0xf0) != 0xf0)
{
sccode = 0xfe; //键盘逐行扫描
while ((sccode & 0x10) != 0)
{
P3 = sccode;
if ((P3 & 0xf0)!= 0xf0)
{
recode=(P3 & 0xf0); //被按键的行玛
sccode = sccode & 0x0f;
return ((sccode)+(recode));
}
else
{
sccode = (sccode << 1) | 0x01; //修改扫描玛
}
}
}
}
}


void display(uchar keydisp)
{
uchar keytab[18] =
{
0x7e,0x7d,0x7b,0x77,0xbd,0xbb,0xb7,0xdb,0xd7,0xbe,0xde,0xee,0xed,0xeb,0xe7
};
uchar m;

for (m = 0; m < 16; m++)
{
if (keytab[m] == keydisp) //查键码表,m为键值
{
P2 = 0xfe;
P0 = tab[m]; //键值显示
}
}
}

void main()
{
uchar key;

P2 = 0xfe;
P0 = 0x40;
P3 = 0xff;
if (P3 == 0xff)
{
while(1)
{
key = keyscan();
display(key);
}
}
}
wdydq 2007-12-21
  • 打赏
  • 举报
回复
请帮到改下,我现在在keil里还是跑不过去呀!到底如何来修正它呀!
wdydq 2007-12-21
  • 打赏
  • 举报
回复
lbing7 2007-12-21
  • 打赏
  • 举报
回复
display (keydisp) 这句要改 {
uchar keytab[18]= {0x7e,0x7d,0x7b,0x77,0xbd,0xbb,0xb7,0xdb,0xd7,0xbe,0xde,0xee,0xed,0xeb,0xe7;}
uchar m;

这一串要注意的是:

在C里面,必须先定义/声明后使用

而且进行局部作用域的定义时,必须放在函数的最前部


LZ你的C语言功底要加强哦...

呵呵
lbing7 2007-12-21
  • 打赏
  • 举报
回复
void display (uchar keydisp) 这句要改

函数调用的时候不用加返回值类型

否则被视为声明为定义
在函数内部声明或定义函数的行为都是非法的
另:传参数的时候也不用再上参数类型

如果不匹配,编译器会告诉你的

lbing7 2007-12-21
  • 打赏
  • 举报
回复
sccode=(sccode < <1) |0x01; //修改扫描玛

中间多了空格

27,516

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧