- 打卡等级:常住居民I
- 打卡总天数:74
- 最近打卡:2026-05-28 14:51:12
已绑定手机
中级会员
- 积分
- 253
|
发表于 2026-4-13 16:41:04
|
显示全部楼层
第九集 数码管
数码管分为共阳极数码管和共阴极数码管,按颜色分为AS单色和BS双色
数码管接线方式
数码管原理图中A--G控制LED的亮灭,一般称为段,COM是一位数码管的公共端,用来控制具体哪一位的数码管工作,称为位,通过段和位的配合数码管可以显示不同的内容
利用ISP工具可以生成数码管的段名代码,提高工作效率
HC595 8 位移位寄存器
可以减少单片机I/O口的占用
HC595 数据传输时序图
一位数码管静态显示代码
u8 SEG_NUM[] =
{
0x3F, /*'0', 0*/
0x06, /*'1', 1*/
0x5B, /*'2', 2*/
0x4F, /*'3', 3*/
0x66, /*'4', 4*/
0x6D, /*'5', 5*/
0x7D, /*'6', 6*/
0x07, /*'7', 7*/
0x7F, /*'8', 8*/
0x6F, /*'9', 9*/
0x77, /*'A', 10*/
0x7C, /*'B', 11*/
0x39, /*'C', 12*/
0x5E, /*'D', 13*/
0x79, /*'E', 14*/
0x71, /*'F', 15*/
0x40, /*'-', 16*/
0x00, /*' ', 17*/
0x80, /*'.', 18*/
};
void Send_595(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
dat <<= 1; // dat = (dat<<1)
HC595_SER = dat; // 先把数据写到引脚上
HC595_SCK = 1; // 输出上升沿的时钟信号
HC595_SCK = 0;
}
}
void Display_Seg(u8 HC595_1,u8 HC595_2)
{
Send_595(HC595_1); // 数码管段码输出,高电平点亮
Send_595(HC595_2); // 数码管位码, 低电平点亮
HC595_RCK = 1; // 数据输出
HC595_RCK = 0;
}
void Seg_Task(void)
{
Display_Seg(SEG_NUM[0],0xfe);
}
任务二 :动态显示12345678
u8 Seg_no = 0;
void Seg_Task(void)
{
Display_Seg(SEG_NUM[Seg_no+1],~T_NUM[Seg_no]); // 数码管刷新段码和页码
Seg_no ++;
if(Seg_no > 7)
{
Seg_no = 0;
};
[Seg_no+1]和[Seg_no]+1的区别,[Seg_no]+1:Seg_no为零时为 0x3F+1之后就和段码表不一致,实验中就会产生段码的现象
任务三:用数码管做一个时钟
u8 Seg_no = 0;
u8 shi = 0;
u8 fen = 0;
u8 miao = 0;
void Seg_Task(void)
{
u8 num = 0;
if(Seg_no == 0)
{
num = shi / 10;
Display_Seg(SEG_NUM[num],~T_NUM[0]); // 数码管刷新段码和页码
}
else if(Seg_no == 1)
{
num = shi % 10;
Display_Seg(SEG_NUM[num],~T_NUM[1]); // 数码管刷新段码和页码
}
else if(Seg_no == 2)
{
Display_Seg(SEG_NUM[16],~T_NUM[2]); // 数码管刷新段码和页码
}
else if(Seg_no == 3)
{
num = fen / 10;
Display_Seg(SEG_NUM[num],~T_NUM[3]); // 数码管刷新段码和页码
}
else if(Seg_no == 4)
{
num = fen % 10;
Display_Seg(SEG_NUM[num],~T_NUM[4]); // 数码管刷新段码和页码
}
else if(Seg_no == 5)
{
Display_Seg(SEG_NUM[16],~T_NUM[5]); // 数码管刷新段码和页码
}
else if(Seg_no == 6)
{
num = miao / 10;
Display_Seg(SEG_NUM[num],~T_NUM[6]); // 数码管刷新段码和页码
}
else if(Seg_no == 7)
{
num = miao % 10;
Display_Seg(SEG_NUM[num],~T_NUM[7]); // 数码管刷新段码和页码
}
Seg_no ++;
if(Seg_no > 7)
{
Seg_no = 0;
}
}
void TIMECOUNT_Task(void)
{
miao ++;
if(miao > 59)
{
miao = 0;
fen ++;
if(fen > 59)
{
fen = 0;
shi ++;
if(shi > 23)
{
shi = 0;
}
}
}
}
擎天柱 LED-DIP40 流水灯 仿真代码
u8 state_now = 0;
void PLED_40(void)
{
u8 cod[8]; // 仿真代码
cod[0] = 0x0f; // 开启P0-P3
cod[1] = 0x01; // P0
cod[2] = 0x01; // P1
cod[3] = ~T_NUM[state_now]; // P2
cod[4] = 0x01; // P3
LED40_SendData(cod,5);
P2 = ~T_NUM[state_now]; // 擎天柱 代码
state_now ++;
if(state_now > 7)
state_now = 0;
}
|
|