- 打卡等级:偶尔看看I
- 打卡总天数:16
- 最近打卡:2025-09-17 00:55:10
已绑定手机
注册会员
- 积分
- 107
|
第九集 数码管 学习笔记
擎天柱交流网址:https://www.stcaimcu.com/thread-11902-1-1.html
里面会有注意事项及常见编程错误等信息
一、数码管介绍
本质都是LED,类型分共阴共阳,74HC595
二、数码管显示原理
显示段码,位码,总显示时间不能大于20ms
三、数码管静态显示
任务1:在第一位上显示0
在任务列表中加入
{0, 1, 1, Seg_Task},
在io.c中加入代码:
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*/
};
u8 T_NUM[8] =
{
0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};
void Init_595(void)
{
HC595_SER = 0;
HC595_RCK = 0;
HC595_SCK = 0;
}
/************向HC595发送一个字节函数************/
void Send_595(u8 dat)
{
u8 i;
for (i=0;i<8;i++)
{
dat<<=1;
HC595_SER = CY; //先把数据写到引脚上
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;
}
u8 Seg_no = 0;
void Seg_Task(void)
{
Display_Seg( SEG_NUM[0], ~T_NUM[0]);
}
在io.h中增加如下定义:
#define HC595_SER P34
#define HC595_RCK P35
#define HC595_SCK P32
void Init_595(void);
void Send_595(u8 dat);
void Display_Seg(u8 HC595_1, u8 HC595_2);
void Seg_Task(void);
就可以在第一位显示出“0”了。
四、 数码管动态显示
任务2,显示12345678
只要改写下列函数
void Seg_Task(void)
{
Display_Seg( SEG_NUM[Seg_no+1], ~T_NUM[Seg_no]); //刷段码和位码
Seg_no++;
if(Seg_no>7)
Seg_no = 0;
}
任务3,按00-00-00的格式显示时分秒
在任务列表中加入
{0, 1000, 1000, TIMECOUNT_Task}, /* task 5 Period: 1000ms */
在io.c中加入代码
u8 shi = 0;
u8 fen = 0;
u8 miao = 0;
void TIMECOUNT_Task(void)
{
miao ++;
if( miao>59 )
{
miao = 0;
fen++;
if( fen>59 )
{
fen = 0;
shi ++;
if( shi>23 )
shi = 0;
}
}
}
void Seg_Task(void)
{
for(i=0;i<8;i++)
{
//算出每一位的值并显示出来
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
Seg_no++;
if(Seg_no>7)
Seg_no = 0;
}
在io.h中增加如下定义:
void TIMECOUNT_Task(void);
就能在LED上显示时分秒了
五、虚拟显示—LED和数码管
(有空的时候可以看一下)
课后小练习
简易10秒免单计数器,
1、在前四位数码管上显示目标时间,即“10.00”表示定时时间10秒钟
2、后四位显示当前的计时00.00,最小单位为10ms
3、按下开始按钮后,每10ms最末尾的数字+1,直到按下结束按钮后停止计数。
在任务表添加两个任务
{0, 1, 1, Seg_Task},
{0, 10, 10, TIMECOUNT_Task},
在io.c中加入如下代码:
U16 js = 0;
U8 flag=0;
void TIMECOUNT_Task(void)
{
If(flag==0)
js ++;
if(P32==0)
flag=1;
}
void Seg_Task(void)
{
if(Seg_no==0)
{
num = 1;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
else if(Seg_no==1)
{
num = 0;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
else if(Seg_no==2)
{
num = 0;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
else if(Seg_no==3)
{
num = 0;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
else if(Seg_no==5)
{
num = js/1000;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
else if(Seg_no==6)
{
num = (js%1000)/100;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
else if(Seg_no==7)
{
num = (js%100)/10;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
else if(Seg_no==8)
{
num = js%10;
Display_Seg( SEG_NUM[num], ~T_NUM[Seg_no]);
}
Seg_no++;
if(Seg_no>7)
Seg_no = 0;
}
|
|