单片机c语言程序问题,请帮我看一下错在哪里

程序是从书上看来的,keil4编译的时候出现
Build target 'Target 1'
compiling Main.c...
MAIN.C(42): error C141: syntax error near '='
MAIN.C(42): error C141: syntax error near 'else'
MAIN.C(42): error C141: syntax error near '='
MAIN.C(46): error C141: syntax error near '='
MAIN.C(46): error C141: syntax error near 'else'
MAIN.C(46): error C141: syntax error near '='
…………
…………
程序是这样子的,希望各位大神能帮我找出哪里有问题

1 DelayNus 微秒级延时
2 DelayNms 毫秒级延时
3 EEPROMEnable EEPROM 使能
4 EEPROMDisable EEPROM 禁止
5 EEPROMSetAddress 设置EEPROM 地址
6 EEPROMStart EEPROM 启动触发
7 EEPROMReadByte EEPROM 读取单个字节
8 EEPROMWriteByte EEPROM 写入单个字节
9 EEPROMSectorErase EEPROM 擦除扇区
10 PortInit 端口初始化
11 main 函数主体

#include "stc.h"
#include <intrins.h>
#define NOP() _nop_()
#define HIGH 1
#define LOW 0
#define LS164_DATA(x) {if((x))P0^0=1;else P0^0=0;}
#define LS164_CLK(x) {if((x))P0^7=1;else P0^7=0;}
#define LCD1602_LINE1 0
#define LCD1602_LINE2 1
#define LCD1602_LINE1_HEAD 0x80
#define LCD1602_LINE2_HEAD 0xC0
#define LCD1602_DATA_MODE 0x38
#define LCD1602_OPEN_SCREEN 0x0C
#define LCD1602_DISP_ADDRESS 0x80
#define LCD1602_RS(x) {if((x))P0^1=1;else P0^1=0;}
#define LCD1602_RW(x) {if((x))P0^2=1;else P0^2=0;}
#define LCD1602_EN(x) {if((x))P0^3=1;else P0^3=0;}
#define LCD1602_PORT LS164Send

void DelayNus(unsigned int t)
{
unsigned int d=0;
d=t;
do
{
NOP();
}while(--d >0);
}

void LS164Send(unsigned char byte)
{
unsigned char j;
for(j=0;j<=7;j++)
{
if(byte&(1<<(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}
LS164_CLK(LOW);
LS164_CLK(HIGH);
}
}
void LCD1602WriteByte(unsigned char byte)
{
LCD1602_PORT(byte);
LCD1602_RS(HIGH);
LCD1602_RW(LOW);
LCD1602_EN(LOW);
DelayNus(50);
LCD1602_EN(HIGH);
}
void LCD1602WriteCommand(unsigned char command)
{
LCD1602_PORT(command);
LCD1602_RS(LOW);
LCD1602_RW(LOW);
LCD1602_EN(LOW);
DelayNus(50);
LCD1602_EN(HIGH);
}

void LCD1602SetXY(unsigned char x,unsigned char y)
{
unsigned char address;
if(y == LCD1602_LINE1)
{
address=LCD1602_LINE1_HEAD+x;
}
else
{address=LCD1602_LINE2_HEAD+x;
}
LCD1602WriteCommand(address);
}

void LCD1602PrintfString(unsigned char x,unsigned char y,unsigned char *s)
{
LCD1602SetXY(x,y);
while(s && *s)
{
LCD1602WriteByte(*s);
s++;
}
}
void LCD1602ClearScreen(void)
{
LCD1602WriteCommand(0x01);
DelayNus(50);
}
void LCD1602Init(void)
{
LCD1602ClearScreen();
LCD1602WriteCommand(LCD1602_DATA_MODE);//显示模式设置,设置16x2 显示,5x7 点阵,
//8 位数据接口
LCD1602WriteCommand(LCD1602_OPEN_SCREEN);//开显示
LCD1602WriteCommand(LCD1602_DISP_ADDRESS); //起始显示地址
LCD1602ClearScreen();
}

void PortInit(void)
{
P0=P1=P2=P3=0xFF;
}

void main(void)
{ unsigned char i;
P2=0xFE;
PortInit();
LCD1602Init();
LCD1602PrintfString(0,LCD1602_LINE1,"HELLOCAST");
while(1)
{
;

}
}

第1个回答  2012-11-23
{if((x))P0^0=1;else P0^0=0;}

在程序体里面是不能用P0 ^ 0 = 1;这样的语句的。此时^按照异或运算符处理,所以必定会产生语法错误。
正确的做法是在程序开头声明位变量,之后引用。
sbit P0_0 = P0 ^ 0;
...
{if((x))P0_0=1;else P0_0=0;}本回答被提问者和网友采纳
第2个回答  2012-11-23
if(byte&(1<<(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}

你的if后面条件好像有问题,肯定一直为真,所以else变成了无意义。
第3个回答  2012-11-23
P0^0,P0^1,这个不能作为左值!

能帮我看一下这个程序那里有语法错误(单片机 C语言)
编译器给出的是第29行附近存在一个语法错误。从你给出的程序代码来看,括号与分号用的比较混乱,25行和28行的括号是配对的,那么第26行的for语句没有循环体,应该使用分号结束。

C语言单片机程序 初学大家帮忙看看错在哪里了 #include <reg51.h...
程序百分百没问题,可能是编译的有问题,你 用的是keil编译的吗? 建议你多重新编译一下, 也有可能是你烧写程序的时候 数据传输的过程中出错了,校验出错 一般是传输过程中某个或者某些bit或者byte出错 建议你重新编译 重新下载烧写试试, 单片机这东西就是经常出些小问题,有时候我们买的开发板或者有...

请问这个单片机的C程序的错在哪里?编译不了。 SHIJIAN.C(4): e...
unchar code table[ ]="welcome!"unchar code table[ ]="MCU-STUDY-BOSRD"第一:这是话句,后面应跟分号。第二:数组的元素应用{}包起来。第三:如果用数组,字符串应分开写,如unchar code table[ ]={'w','e','l','c','o','m','e','!'};如果想用字符串请用unchar code *...

单片机C语言编译错误: requireAccelerator
单片机C语言编译错误:requires ANSI-style prototype是设置错误造成的,解决方法为:1、打开Keil后选择【File】下的【new】新建一个空白文档。将编辑好的程序源码复制到该文件中。2、选择左上角的保存按钮进行保存,将弹出保存对话框。3、选择保存路径和编辑文件名。记住,这里的文件名很重要,如果你是C...

...哪里错了,该怎么改!~~~ 急急急。。。 单片机C语言高手速度来啦...
我猜想 if(key1==0)(delay(50);if(key1==0)(temp=1);)你的意思是 if(key1==0){ delay(50);if(key1==0)(temp=1);} if 后面用大括号,不是小括号。if (表达式){ 语句。。。}

51单片机,这个程序错在哪里呢?编译器总提示C(32): error C141: syntax...
main函数的while循环里面,调用函数你还给参数加个类型,这是语法错误。

单片机C语言编程与汇编混合编程时出现的问题
MOV R2,#20 D1:MOV R3,#100 D2:MOV R4,#229 DJNZ R4,DJNZ R3,D2 DJNZ R2,D1 pragma endasm 的意思是这段程序向SRC文件编译时保持源代码不变 也就把这段汇编加进SRC汇编文件中。但C文件要生成HEX文件时是通过OBJ文件进行的,所以直接编译是肯定出错的 正确的方法是生成SRC文件后 打开直接...

单片机的C程序中的问题
4、delay()是编程者自己编制的一个延时函数,不是C语言中的标准函数,正因为在前面定义了此函数,所以main()中才能调用;如果没有前面的定义,在程序编译的环节就会报错,无法生成代码。至于调用方法,上面说过了,因为不需要传递参数,所以括号中什么也不用写,如果写了反倒会出错。你可以详细看一下2...

单片机c语言程序提示 error C141: syntax error near ';'是哪儿出错了...
语法错误啊,少个分号,就在第二次 WE=1后面

大师们,请教一下,我在单片机c语言编译时出现零错误,一警告“L16”是怎...
警告一般都是你语法有点错误,或者有时候不一定是你预想的情况。不是错误有时候可以不理,但是最好还是知道,

相似回答