功能概述
每按一次按键,LEDNum 加 1,然后把这个数取反后输出到 P2 口,点亮对应的 LED。
因为 LED 是低电平点亮,所以取反后,值为 0 的位对应的 LED 会亮。
代码
c
#include <mcs51/8051.h>
void DelayXms(unsigned int xms)
{
unsigned char i, j;
if(xms == 0) return;
do {
i = 2;
j = 239;
do {
while (--j);
} while (--i);
} while (--xms);
}
void main(void)
{ // LEDNum 是一个 8 位变量,初始值为 0,用来记录当前要显示的数值。
unsigned char LEDNum = 0;
while(1)
{
if(P3_1 == 0) // 按键按下
{
DelayXms(20); // 消抖
while(P3_1 == 0); // 等待松手
DelayXms(20); // 消抖
LEDNum++;
P2 = ~LEDNum;
}
}
}
为什么要取反?
LED 是低电平点亮。
- LEDNum = 1 时,二进制是 0000 0001,取反后是 1111 1110,P2.0 输出低电平,第一个 LED 亮。
- LEDNum = 2 时,二进制是 0000 0010,取反后是 1111 1101,P2.1 输出低电平,第二个 LED 亮。
- LEDNum = 3 时,二进制是 0000 0011,取反后是 1111 1100,P2.0 和 P2.1 都亮。
理论运行效果
| 按键次数 | LEDNum | 二进制 | P2 输出(取反后) | 亮的 LED |
|---|---|---|---|---|
| 0 | 0 | 0000 0000 | 1111 1111 | 全灭 |
| 1 | 1 | 0000 0001 | 1111 1110 | P2.0 |
| 2 | 2 | 0000 0010 | 1111 1101 | P2.1 |
| 3 | 3 | 0000 0011 | 1111 1100 | P2.0、P2.1 |
| 4 | 4 | 0000 0100 | 1111 1011 | P2.2 |
| 5 | 5 | 0000 0101 | 1111 1010 | P2.0、P2.2 |
相当于用 LED 显示 0~255 的二进制数。
显示效果
