独立按键和矩阵按键
独立按键使用:
按键读取前置:
Key_Val = Kel_Read() //读取键码值
Key_Down = Key_Val & (Key_Val ^ Key_Old); //检测下降沿
Key_Up = ~Key_Val & (Key_Val ^ Key_Old); //检测上升沿
Key_Old = Key_Val; //扫描辅助变量
按键读取:
unsigned char Key_Read(){
unsigned char temp = 0;
if(P3_4 == 0) temp=1;
if(P3_5 == 0) temp=2;
if(P3_6 == 0) temp=3;
if(P3_7 == 0) temp=4;
return temp;
}
自定义函数中unsigned char和void的区别:
**void (无返回值):**表示不回头,当调用一个函数只是为了让它执行一个动作(比如点亮一个 LED 灯、延时 1 秒),而不需要它告诉你任何信息时,用 void。如果用 void,函数执行完就结束了,主程序(main)不知道到底按了哪个键。
unsigned char (有返回值): 表示带个结果回来,Key_Read 函数的任务是“去检查一下按键,并告诉我哪一个按键被按下了”。使用 unsigned char,函数最后可以用 return temp; 把检测到的编号(1, 2, 3 或 4)“带回”给调用它的地方。
举个例子: 就像你派一个员工去仓库看还有没有货:
-
void模式: 员工去仓库看了看,然后直接回家了。你依然不知道有没有货。 -
返回类型模式: 员工去仓库看了看,回来递给你一张纸条(返回值),上面写着“有”或“无”。
==和=的区别:
| 符号 | 名称 | 作用 | 例子 |
|---|---|---|---|
= |
赋值运算符 | 把右边的值给左边的变量 | temp = 1;(把 1 存进 temp 里) |
== |
等号运算符 | 询问左右两边是否相等 | if(P3_4 == 0)(P3.4 端口现在是 0 吗?) |
如果在 if 里误用了 = 会怎样?
如果你写成 if(P3_4 = 0):
-
程序会先把
P3_4的电平强制改写成 0(这可能导致硬件逻辑错误)。 -
if语句会判断这个赋值动作的结果。在 C 语言中,0代表“假”。 -
结果:这个
if永远不会成立,你的按键检测就失效了。
bit是什么
在单片机 C 语言编程(特别是你正在使用的 Keil C51)中,bit 是一个非常特殊且高效的变量类型。
简单来说,bit 就是**“位”**变量。
1. bit 类型核心定义
-
占用空间: 只有 1 个位 (bit)。
-
取值范围: 只有两个值:0 或 1(也可以理解为 False 或 True)。
-
存储位置: 它存储在 8051 单片机内部 RAM 中专门的一块**“位寻址区”**(地址范围是
20H到2FH)。
2. 为什么要用 bit?
在单片机资源极其有限的情况下(特别是 51 单片机,内存可能只有几百字节),bit 类型非常节省空间:
-
如果你用
unsigned char定义一个开关状态(开/关),它会占用 8 位 (1 字节)。 -
如果你用
bit定义,它只占用 1 位。 -
相当于 1 个
char的空间可以存放 8 个bit变量。
3. bit 与 sbit 的区别(新手最易混淆点)
这是你在学习 Keil 时一定会遇到的两个概念,它们非常像,但用途不同:
| 类型 | 作用 | 举例 | 形象理解 |
|---|---|---|---|
bit |
定义一个变量,用来存 0 或 1。 | bit flag = 0; |
像是在本子上画个勾或叉,记录个状态。 |
sbit |
绑定一个硬件引脚。 | sbit LED = P1^0; |
像是给电灯开关贴个标签,叫“LED”。 |
4. 使用 bit 的限制(避坑指南)
因为 bit 涉及到硬件底层特殊的寻址方式,所以它不像 int 或 char 那么自由:
-
不能定义 bit 数组: 你不能写
bit error_code[8];(错误)。 -
不能定义 bit 指针: 你不能写
bit *p;(错误)。 -
函数限制:
bit类型可以作为函数的返回值,也可以作为参数,这在处理逻辑判断时非常方便。
5. 实际代码示例
假设你要做一个按键检测,并记录按键是否被“按下过”:
C
bit is_pressed = 0; // 定义一个位变量,记录按键状态
void main() {
if (P3_4 == 0) { // 如果引脚被拉低
is_pressed = 1; // 把位变量设为 1
}
if (is_pressed) { // 相当于 if (is_pressed == 1)
// 执行相应的动作
is_pressed = 0; // 处理完后清零
}
}
总结
bit 是专门为单片机这种“斤斤计较”内存的硬件设计的。如果你只需要记录一个“是/否”、“开/关”、“有/无”的状态,用 bit 是性能最好、最省内存的选择。w