大家帮忙看看我的这段C语言程序在keil C51里为什么不能通过编译 高分!!能帮我修改成功的,有追加分送!

来源:百度知道 编辑:UC知道 时间:2024/09/23 01:37:09
#include <reg51.h>
#define Uchar unsigned char
#define Uint unsigned int
sbit IoClk=P1^0;
sbit Address=P1^1;
sbit DO=P1^2;
sbit CS=P1^3;
sbit VCON=P1^4;
sbit PASSCON=P1^5;
sbit LED1CON=P2^6;
sbit LED2CON=P2^7;
sbit Bat_in_use1=P2^0;
sbit Bat_in_use2=P2^1;
sbit Bat_in_sup=P2^2;
static Uchar LED1=0;
static Uchar LED2;
static Uint BattleV;
static Uint SunBattleV;
static unsigned char Pass;
static code Uchar LEDTAB[]={0x02,0x9f,0x22,0x0c,0x08,0x68,0xc0,0x2f,0xff,0x08};
Uint A_Dchang(Uchar port);
void DispLED1(void);
void DispLED2(void);
void DispChar(char howmuch);
void cls(void);
void Delay(Uint i);
void nop();
void Work_at_Night(void);
void Work_at_Day(void);
void main(void)
{ int SunSize[2];
Pass=0;

出现ATTEMPT TO DEFINE AN ALREADY DEFINED LABEL,表示以前已经定义过一个标号,要换一个标号

movc a,@a+dptr
movc a,@a+pc

对于这两条指令,查了一下网上的兄弟的解释:

movc a,@a+dptr
从DPTR开始偏移A个地址的数读取到A中.
DPTR一般为数据段的首地址.
movc a,@a+pc
从PC指令地址开始偏移A个地址的数读取到A中.
PC为当前指令地址.

这两个指令都是从程序空间中读取数据.

貌似我也不大听懂,得去问问老师

还有对于PUSH A Keil老是编译出现为什么编译说错,
EXPRESSION TYPE DOSE NOT MATCH INSTRUCTION

网上的兄弟

1.说应该为PUSH ACC

2.是编译选项不对,应选择韦福汇编器

3.为什么不是A,而是ACC?

因为:A表示的是内存地址,ACC表示的是寄存器

51中,可以将寄存器入栈,不可以将内存入栈。

4.在51指令中没有PUSH A,只有PUSH ACC,同样对累加器A进行位操作时,没有A.0,只有ACC.0
A是ACC的缩写,有些地方不能互换,原因我也不知道,书中是这么写的,编译软件也是这么认的,否则就出错。

呵呵,英语呀!
一大片提示,都是说你的 REG51.H 文件里面的错误。

你的程序,只有一个错误,如下:

if(INT0==1) goto end00; 找不到目的地
……
end00: 把这里改成冒号“:”即可

同一楼

13个a打进去

你用的C语言写的,编译时候选的是汇编ASM