求助 51单片机程序问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 14:40:35
求助高手帮我看看这段4*4键盘扫描 7段数码管显示的程序错在哪里
#include <reg51.h>
#define rowkey() (~P1)&0x0f
#define SEG P2
char TAB[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0x88,0x83,0xa7,0xa1,0x84,0x8e,0xbf,0x7f};
void decouncer(void);
main()
{
unsigned char scan,row,col,kcode;
SEG=0x7f;
scan=0xef;

for(col=0;col<4;col++)
{
int keyin ;
P1=scan;
keyin=rowkey();

if(keyin!=0)
{
decouncer();
for(row=0;row<4;row++)
{
if(0x01<<row==keyin)
kcode=4*col+row;
SEG=TAB[kcode];
}
}

scan=(scan<<1)/0x01;
}
}

void decouncer(void)
{
int j;
for(j=0;j<2400;j++);

}
在keil c里 编译是对的 但是调试时就不行了 提示: *** error 65: access violation at C:0x0700 : no 'execute/read' permission

你的程序编译时不报错,但是,你的main()函数写的不对,你的main()函数中执行到scan=(scan<<1)/0x01就结束了,编译后,单片机的pc值指向C:0x0700,而后面已经没有代码可以执行了,因此,此时单片机已经执行完了你的所有程序,没有指令可以继续执行了,所以就报错了!
你只要在scan=(scan<<1)/0x01这句之后加上一句(我是在中文输入法下写下面这个程序的,直接复制会有错误提示)while(1){;};或者是将while(1)
{
for(col=0;col<4;col++)
{
int keyin ;
P1=scan;
keyin=rowkey();

if(keyin!=0)
{
decouncer();
for(row=0;row<4;row++)
{
if(0x01<<row==keyin)
kcode=4*col+row;
SEG=TAB[kcode];
}
}
scan=(scan<<1)/0x01;
}
}

软件仿真调试,没有报错。
可能是你的硬件仿真器有问题。

软件里怎么报错的?那段报错的信息请贴上来下。

你就是想让他1—16显示吧!我这有一个,不过不知道你是用什么控制的因为它需要动态吗?

不懂