Tadej---零基础入门(二)笔记

独立按键和矩阵按键

独立按键使用:

按键读取前置:

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 charvoid的区别:

**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)

  1. 程序会先把 P3_4 的电平强制改写成 0(这可能导致硬件逻辑错误)。

  2. if 语句会判断这个赋值动作的结果。在 C 语言中,0 代表“假”。

  3. 结果:这个 if 永远不会成立,你的按键检测就失效了。

bit是什么

在单片机 C 语言编程(特别是你正在使用的 Keil C51)中,bit 是一个非常特殊且高效的变量类型。

简单来说,bit 就是**“位”**变量。


1. bit 类型核心定义

  • 占用空间: 只有 1 个位 (bit)

  • 取值范围: 只有两个值:01(也可以理解为 False 或 True)。

  • 存储位置: 它存储在 8051 单片机内部 RAM 中专门的一块**“位寻址区”**(地址范围是 20H2FH)。

2. 为什么要用 bit

在单片机资源极其有限的情况下(特别是 51 单片机,内存可能只有几百字节),bit 类型非常节省空间:

  • 如果你用 unsigned char 定义一个开关状态(开/关),它会占用 8 位 (1 字节)

  • 如果你用 bit 定义,它只占用 1 位

  • 相当于 1 个 char 的空间可以存放 8 个 bit 变量。


3. bitsbit 的区别(新手最易混淆点)

这是你在学习 Keil 时一定会遇到的两个概念,它们非常像,但用途不同:

类型 作用 举例 形象理解
bit 定义一个变量,用来存 0 或 1。 bit flag = 0; 像是在本子上画个勾或叉,记录个状态。
sbit 绑定一个硬件引脚 sbit LED = P1^0; 像是给电灯开关贴个标签,叫“LED”。

4. 使用 bit 的限制(避坑指南)

因为 bit 涉及到硬件底层特殊的寻址方式,所以它不像 intchar 那么自由:

  1. 不能定义 bit 数组: 你不能写 bit error_code[8];(错误)。

  2. 不能定义 bit 指针: 你不能写 bit *p;(错误)。

  3. 函数限制: 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