嵌入式开发常用C语言代码(持续更新)
·35 字·1 分钟阅读
嵌入式开发
按键扫描
u8 last_key;
void Key_Scan(u8 keyIndex)
{
// 有按键按下
if (keyIndex && (last_key != keyIndex))
{
switch (keyIndex)
{
case 0x01: // 移动
break;
case 0x02: // 定时
break;
case 0x03: // 开关
app.power_flag = !app.power_flag;
break;
case 0x04: // 挡位
break;
default:
break;
}
}
last_key = keyIndex;
}
数码管正反推扫描
将数码管的led每一个看成一个独立的个体,进行扫描
u8 DispBuf[] = {0x00, 0x00};
unsigned char segment[] = {
0x3F,
0x06,
0x5B,
0x4F,
0x66, // 0-4
0x6D,
0x7D,
0x07,
0x7F,
0x6F, // 5-9
0x40,
0x71,
0x74, // '-', F, H
};
void f_digitalTubeScan()
{
static unsigned char state = 0;
// 重置引脚状态
TUBE_1 = 0;
TUBE_2 = 0;
TUBE_3 = 0;
TUBE_4 = 0;
TUBE_5 = 0;
PCM0 &= 0x04;
PBM1 &= 0x04;
PBM2 = 0;
PBM3 &= 0x30;
// 将数码管分成一个一个的led灯去扫描
switch (state)
{
case 0:
PBM2 = 0x44;
if (DispBuf[0] & 0x01)
{
TUBE_3 = 1;
TUBE_5 = 0;
}
break;
case 1:
PCM0 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x02)
{
TUBE_1 = 1;
TUBE_5 = 0;
}
break;
case 2:
PBM3 |= 0x04;
PBM2 |= 0x04;
if (DispBuf[0] & 0x04)
{
TUBE_2 = 1;
TUBE_5 = 0;
}
break;
case 3:
PBM1 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x08)
{
TUBE_4 = 1;
TUBE_5 = 0;
}
break;
case 4:
PBM3 |= 0x04;
PBM2 |= 0x04;
if (DispBuf[0] & 0x10)
{
TUBE_2 = 0;
TUBE_5 = 1;
}
break;
case 5:
PCM0 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x20)
{
TUBE_1 = 0;
TUBE_5 = 1;
}
break;
case 6:
PBM1 |= 0x40;
PBM2 |= 0x04;
if (DispBuf[0] & 0x40)
{
TUBE_4 = 0;
TUBE_5 = 1;
}
break;
case 7:
PBM2 = 0x44;
if (DispBuf[1] & 0x01)
{
TUBE_3 = 0;
TUBE_5 = 1;
}
break;
case 8:
PCM0 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x02)
{
TUBE_3 = 1;
TUBE_1 = 0;
}
break;
case 9:
PBM3 |= 0x04;
PBM2 |= 0x40;
if (DispBuf[1] & 0x04)
{
TUBE_3 = 1;
TUBE_2 = 0;
}
break;
case 10:
PBM1 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x08)
{
TUBE_3 = 1;
TUBE_4 = 0;
}
break;
case 11:
PBM1 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x10)
{
TUBE_3 = 0;
TUBE_4 = 1;
}
break;
case 12:
PCM0 |= 0x40;
PBM2 |= 0x40;
if (DispBuf[1] & 0x20)
{
TUBE_3 = 0;
TUBE_1 = 1;
}
break;
case 13:
PBM3 |= 0x04;
PBM2 |= 0x40;
if (DispBuf[1] & 0x40)
{
TUBE_3 = 0;
TUBE_2 = 1;
}
break;
}
state = (state + 1) % 14;
}
// 显示 12
DispBuf[0] = segment[1];
DispBuf[1] = segment[2];