keil - sdcc 在 keil 中工作的代码上给出语法错误
问题描述
我试图理解这段代码。它在一个教程中,我正在按照教程进行操作,所以我尝试了这段代码。
我使用 sdcc 编译它,但它在第 7 列给了我一个语法错误。
本教程显示代码在 keil 中工作。而且我发现你必须用 8051 头文件替换 reg51 头文件。但它仍然在第 7 列给出语法错误。
我不知道问题是什么。我什至无法开始理解它。
错误,
lcd.c:6: 语法错误: token -> 'rs' ; 第 7 栏
#include <8051.h>
#define lcd_data P2
sbit rs=P0^0;
sbit rw=P0^1;
sbit en=P0^2;
void lcd_init();
void cmd(unsigned char a);
void dat(unsigned char b);
void show(unsigned char *s);
void lcd_delay();
void lcd_init()
{
cmd(0x38);
cmd(0x0e);
cmd(0x01);
cmd(0x06);
cmd(0x0c);
cmd(0x80);
}
void cmd(unsigned char a)
{
lcd_data=a;
rs=0;
rw=0;
en=1;
lcd_delay();
en=0;
}
解决方案
Keil C51 的编译器有许多非标准的扩展,例如sbit
在您的代码中。在 SDCC 中,您可以使用 C99 标准中的 _Bool,或者__bit
,或__sbit
,这 3 个关键字在 SDCC 中是相同的。
在您的情况下,您还必须使用 extension __at
:
__bit __at (0x80) rs; /* I/O port 0, bit 0 */
警告:不要~
用于切换位,!
在 SDCC 中使用。
b = ~b; /* equivalent to b=1 instead of toggling b */
b = !b; /* toggles b */
更多信息请阅读官方文档:http ://sdcc.sourceforge.net/doc/sdccman.pdf
推荐阅读
- flutter - 转换为类型类 dart http 响应体
- java - 依赖关系引入了一个传递库,该库使用 TIFF 文件破坏 ImageIO.read
- java - 如何从处理器内的 Apache Camel 中的路由获取响应并在处理器内调用该路由?
- groovy - Spock-在被测类的私有方法调用中捕获方法参数
- scala - Scala Style:所有分支的模式匹配都是带有模式保护的通配符
- node.js - 使用特定选项或环境变量在 AWS lambda 中启动 NodeJS 运行时
- apache-spark - Apache Spark 驱动程序日志未指定阶段取消的原因
- docker - docker中的Gulp watch在docker中花费太长时间
- .net-core - 实体框架核心 3.1 中的 Pluralizer 模型名称
- c++ - SFINAE enable_if 与 is_same 用法