#define知识点




#define a 10
 
void foo(); 
main(){
 
  printf("%d..",a);
   foo();
   printf("%d",a);
}
void foo(){
   #undef a
   #define a 50
}


输出:10..10..


#define a 10
void foo()
{
#undef a
#define a 50
}

void main(){

	printf("%d..",a);
	foo();
	printf("%d",a);

}


输出:50..50..



对于#define和#undef的宏定义,是在预编译阶段就进行处理的。
#define a 10 编译器并不考虑函数执行的过程,仅仅是在#define开始到文件结束或#undef内都是有效的。
而#undef a  #define a 50,作用域是接下来的代码




你所提出的问题与提供的文件内容**不相关**。 文件《30.动态LCD显示屏实验.pdf》主要介绍的是基于I2C通信协议的LCD1602显示屏的使用方法,涉及的是I2C接口(SDA、SCL引脚),而你提出的`ROW_1~ROW_4`、`COL_1~COL_4`以及宏定义引脚编号(如9、8、7等)属于**矩阵按键或直接驱动LCD的并行控制设计**,并未在原文件中提及。 因此,**忽略原文件中的接线方式和程序内容**,根据你的要求重新设计如下: --- ### 题目重述 请更改走线,按照指定的引脚定义(ROW_1~ROW_4 对应 9,8,7,6;COL_1~COL_4 对应 5,4,3,2),使用LCD1602作为输出设备完成接口设计。 > 注意:此处未说明输入源是否为矩阵键盘,但结合ROW/COL命名习惯,推测为4×4或4×3矩阵键盘输入,LCD1602用于显示按键值或其他信息。由于未提供具体功能目标(如显示什么内容),仅能基于常规应用进行推导。 --- ### 给出答案(答案为带注释的代码块) ```cpp // 引脚定义 #define ROW_1 9 #define ROW_2 8 #define ROW_3 7 #define ROW_4 6 #define COL_1 5 #define COL_2 4 #define COL_3 3 #define COL_4 2 #include <LiquidCrystal.h> // 初始化LCD (RS, E, D4, D5, D6, D7) // 假设LCD使用标准4-bit模式连接,D4~D7接任意数字引脚,本例中假设接在6,7,8,9(需避开ROW/COL占用) // 但由于ROW_1~ROW_4占用了6~9,故需另选引脚给LCD → 此处产生冲突! // 解决方案:改用I2C版LCD1602以避免引脚冲突 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // 默认地址0x27,16列2行 void setup() { // 设置行列引脚 pinMode(ROW_1, OUTPUT); pinMode(ROW_2, OUTPUT); pinMode(ROW_3, OUTPUT); pinMode(ROW_4, OUTPUT); pinMode(COL_1, INPUT_PULLUP); pinMode(COL_2, INPUT_PULLUP); pinMode(COL_3, INPUT_PULLUP); pinMode(COL_4, INPUT_PULLUP); lcd.init(); // 初始化LCD lcd.backlight(); // 打开背光 lcd.print("Matrix Ready"); // 显示启动信息 delay(1000); lcd.clear(); } void loop() { char key = scanKeypad(); if (key != '\0') { lcd.print(key); } delay(10); // 防抖 } // 扫描矩阵按键函数(简化版4x4) char scanKeypad() { int rowPins[] = {ROW_1, ROW_2, ROW_3, ROW_4}; int colPins[] = {COL_1, COL_2, COL_3, COL_4}; char keys[4][4] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; for (int r = 0; r < 4; r++) { digitalWrite(rowPins[r], LOW); // 行拉低 for (int c = 0; c < 4; c++) { if (digitalRead(colPins[c]) == LOW) { delay(20); // 消抖 while (digitalRead(colPins[c]) == LOW); // 等待释放 digitalWrite(rowPins[r], HIGH); // 恢复高电平 return keys[r][c]; } } digitalWrite(rowPins[r], HIGH); } return '\0'; // 无键按下 } ``` --- ### 代码解析 1. **引脚定义部分**:按照用户要求将ROW与COL分别绑定到指定数字引脚。 2. **LCD驱动选择**:因传统并行LCD需占用大量IO口(至少6个),与当前ROW/COL共用引脚冲突严重,故采用**I2C转接板驱动的LCD1602**,仅需A4(SDA)、A5(SCL),节省资源。 3. **矩阵扫描逻辑**:逐行输出低电平,检测哪一列被拉低,从而识别按键位置。 4. **防抖处理**:加入短暂延时和等待释放机制,防止误触发。 5. **显示输出**:每识别一个按键就在LCD上打印其字符。 > ⚠️ 注意硬件限制:若坚持使用非I2C版LCD1602,则必须重新分配引脚,否则与ROW/COL引脚冲突无法同时工作。 --- ### 知识点 - **I2C通信协议**:一种双线式串行总线,用于短距离通信,支持多设备挂载在同一总线上,减少MCU引脚占用。 - **矩阵键盘扫描原理**:通过逐行置低并检测列电平的方式确定按键位置,节省GPIO数量。 - **LCD1602 I2C驱动原理**:利用PCF8574/T扩展芯片将I2C信号转换为并行信号控制LCD,只需两个引脚即可操作屏幕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值