#define ROLLBLOCKWIDTH (40) #define ROLLBLOCKHEIGHT (40) #define P1X (4) #define P1Y (1) #define MAX_X (128) #define MAX_Y (64) #define BPS (115200) #define FOSC (12000000) #define FCCLK (FOSC * 8) #define FCCO (FCCLK * 3) #define FPCLK (FCCLK / 4) #define DC (1) #define RST (0)什么意思
时间: 2023-08-05 17:48:13 浏览: 41
这是一段 C 语言的宏定义,是一种预处理指令,用于在编译时将常量值替换为代码中的相应符号。具体解释如下:
- ROLLBLOCKWIDTH:定义了一个名为 ROLLBLOCKWIDTH 的常量,其值为 40。
- ROLLBLOCKHEIGHT:定义了一个名为 ROLLBLOCKHEIGHT 的常量,其值为 40。
- P1X:定义了一个名为 P1X 的常量,其值为 4。
- P1Y:定义了一个名为 P1Y 的常量,其值为 1。
- MAX_X:定义了一个名为 MAX_X 的常量,其值为 128。
- MAX_Y:定义了一个名为 MAX_Y 的常量,其值为 64。
- BPS:定义了一个名为 BPS 的常量,其值为 115200。
- FOSC:定义了一个名为 FOSC 的常量,其值为 12000000。
- FCCLK:定义了一个名为 FCCLK 的常量,其值为 FOSC * 8。
- FCCO:定义了一个名为 FCCO 的常量,其值为 FCCLK * 3。
- FPCLK:定义了一个名为 FPCLK 的常量,其值为 FCCLK / 4。
- DC:定义了一个名为 DC 的常量,其值为 1。
- RST:定义了一个名为 RST 的常量,其值为 0。
这些常量可能在编写代码时会被多次使用,使用宏定义可以提高代码的可读性和可维护性。
相关问题
typedef和#define区别
typedef和#define都是用来给一个对象取一个别名,以增强程序的可读性。它们的区别如下:
1. 原理不同:typedef是在编译时处理的,有类型检查功能,而#define是在预处理阶段进行简单的文本替换。
2. 作用域不同:typedef在自己的作用域内给一个已经存在的类型取一个别名,而#define是全局替换,可以替换任何文本。
3. 使用方式不同:typedef不能在一个函数定义里面使用,而#define没有这个限制。
4. 对于复杂类型的定义,typedef更加方便,可以定义数组、指针、结构等类型,使程序书写简单,也使意义明确,增强可读性。
范例:
```c
// 使用typedef定义结构体别名
typedef struct {
int x;
int y;
} Point;
// 使用#define定义常量别名
#define PI 3.14159
int main() {
Point p;
p.x = 10;
p.y = 20;
int radius = 5;
double area = PI * radius * radius;
return 0;
}
```
选择51单片机(AT89C51),再选一个显示设备(AMPIRE12864),动态滚动显示自己的姓名中文(王瑞媛)和学号(202006084242)的keil代码#include <reg51.h> #define LCDLCDDisp_Off 0x3e #define LCDLCDDisp_On 0x3f #define Page_Add 0xb8 #define LCDCol_Add 0x40 #define Start_Line 0xC0 #define data_ora P1 sbit LCDMcs=P2^4 ; sbit LCDScs=P2^3 ; sbit LCDDi=P2^2 ; sbit LCDRW=P2^1 ; sbit LCDEnable=P2^0 ;
好的,这是您的代码:
```c
#include <reg51.h>
#include <string.h>
#define LCDLCDDisp_Off 0x3e
#define LCDLCDDisp_On 0x3f
#define Page_Add 0xb8
#define LCDCol_Add 0x40
#define Start_Line 0xC0
#define data_ora P1
sbit LCDMcs = P2^4;
sbit LCDScs = P2^3;
sbit LCDDi = P2^2;
sbit LCDRW = P2^1;
sbit LCDEnable = P2^0;
void delayms(int ms) {
int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++) {
;
}
}
}
void WriteCommand(unsigned char Command) {
LCDDi = 0;
data_ora = Command;
LCDEnable = 1;
LCDEnable = 0;
}
void WriteData(unsigned char Data) {
LCDDi = 1;
data_ora = Data;
LCDEnable = 1;
LCDEnable = 0;
}
void InitLCD(void) {
WriteCommand(LCDLCDDisp_Off);
delayms(5);
WriteCommand(LCDLCDDisp_On);
delayms(5);
WriteCommand(Page_Add);
WriteCommand(LCDCol_Add);
WriteCommand(Start_Line);
}
void DispChs(unsigned char x, unsigned char y, unsigned char *p) {
unsigned char i;
x = LCDCol_Add + x*16;
y = Page_Add + y;
WriteCommand(y);
WriteCommand(x);
for (i = 0; i < 16 && *p; i++, p++) {
WriteData(*p);
}
}
void main() {
unsigned char name[] = "王瑞媛";
unsigned char number[] = "202006084242";
unsigned char i;
InitLCD();
while (1) {
DispChs(0, 0, name);
DispChs(0, 1, number);
for (i = 0; i < 16; i++) {
WriteCommand(Start_Line + i);
delayms(500);
}
}
}
```
注意,这段代码假设您已经将 AMPIRE12864 连接到了 P1 端口上。如果您的硬件连接不同,请自行修改相应的代码。
此代码会在屏幕上不断滚动显示您的姓名和学号,每行显示 16 个字符,并且每隔 500ms 滚动一行。