德州仪器课程二发帖:数码管的驱动原理、关键软件代码以及实现结果
一、硬件原理
本课程的目标在于使用按键对数码管的显示进行按键控制,该部分代码使用了共阳极HC595驱动数码管,共阳极HC595驱动数码管共用VCC电源,因此在使用时候,应注意灌电流与拉电流的不同与区别。
该数码管使用5个针脚进行数据输入与供电,这5个针脚分别表示SCLK、CLK、DIO及VCC、GND,具体原理图如下所示:
该数码在接入前,需要先去掉PA27、PA26、PA13的跳线帽,在进行关键代码之前,需要先把按键针脚设定为PA14针脚。
其中在TI-sysconfig配置中,应该先把按键配置为input,内置电阻设定为上拉电阻;另外将HC595数码管的三个针脚,设定为输出、标准模式,具体配置如下:
二、关键软件代码
根据项目功能要求,本部分课程的关键代码做如下设计。首先对HC595及按键状态进行宏定义,然后编写5个功能函数,作为数码管数据输入的调用接口。在主程序代码的编写上,先设定按键监测,然后使用按键计数器对数码管的数字显示进行控制,最终实现课程锁应该达到的功能,具体代码如下:
#include "ti_msp_dl_config.h"
#define DELAY (16000000)
//宏定义HC595DIO打开
#define HC595_DIO_0 DL_GPIO_clearPins(GPIOA,27);//宏定义HC595DIO关闭
#define HC595_SCK_1 DL_GPIO_setPins(GPIOA,26);//宏定义HC595-SCK打开
#define HC595_SCK_0 DL_GPIO_clearPins(GPIOA,26);//宏定义HC595-SCK关闭
#define HC595_RCK_1 DL_GPIO_setPins(GPIOA,13);//宏定义HC595-RCK打开
#define HC595_DIO_1 DL_GPIO_setPins(GPIOA,27);
#define HC595_RCK_0 DL_GPIO_clearPins(GPIOA,13);//宏定义HC595-RCK关闭
uint8_t Display_DX[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uint8_t Display_PX[ 8]={1,2,3,4,5,6,7,8};
void Display_Out() //定义数码管点亮输出函数 PA13先清零再拉高;
{
delay_cycles(2000);
HC595_RCK_0;
delay_cycles(2000);
HC595_RCK_1;
}
void HC595_WriteData(uint8_t data) //定义数码管数据写入函数
{
uint8_t i;
for (i=0;i<8;i++)
{
if ((data & 0x80)>0)
{
HC595_DIO_1;
}
else
{
HC595_DIO_0;
}
data <<=1;
delay_cycles(2000);
HC595_SCK_0;
delay_cycles(2000);
HC595_SCK_1;
}
}
void HC595_SEND_DATA(uint8_t dis_num,uint8_t dis_bit) //定义数码管发送数据函数
{
HC595_WriteData(dis_num);
HC595_WriteData(1<<dis_bit);
Display_Out();
}
void Display_Data(uint16_t dataL,uint16_t dataH) //定义数码管显示数据位函数
{
uint16_t tempL,tempH;
uint8_t num_q,num_b,num_s,num_g;
tempL=dataL;
num_q=tempL/1000;
num_b=tempL/100%10;
num_s=tempL/10%10;
num_g=tempL%10;
HC595_SEND_DATA(Display_DX[num_q],3);
HC595_SEND_DATA(Display_DX[num_b],2);
HC595_SEND_DATA(Display_DX[num_s],1);
HC595_SEND_DATA(Display_DX[num_s],0);
tempH=dataH;
num_q=tempH/1000;
num_b=tempH/100%10;
num_s=tempH/10%10;
num_g=tempH%10;
HC595_SEND_DATA(Display_DX[num_q],7);
HC595_SEND_DATA(Display_DX[num_b],6);
HC595_SEND_DATA(Display_DX[num_s],5);
HC595_SEND_DATA(Display_DX[num_s],4);
}
int main(void)
{
SYSCFG_DL_init();
delay_cycles(100000);
while(1)
{
delay_cycles(2000000);
Display_Data(1234,5678);
}
}
三、实现效果
在进行调试过程中,改进了一些宏定义的写法,同时对部分变量的定义进行了修正,最终完美实现了系统需要的达到的功能,通过手动按动按键,顺利实现数码管的数字输出。相关照片如下图所示: