论坛» 企业专区» TI

【MSP焕新大作战】课程2任务2之MSPM0数码管HC595驱动

高工
2024-05-09 18:02 1楼

74HC595A包括一个8位移位寄存器和一个8位D型锁存器和三态并行输出。移位寄存器接受串行数据并提供串行输出。移位寄存器也提供并行数据输出和8位锁存器。移位寄存器和锁存器都有独立的时钟输入。这个IC还具有异步复位的功能HC595A可以直接和CMOSMPU的和MCU的SPI接口进行连接。


电器参数:

引脚功能:


数码管原理图:


驱动时许

4.jpg

开发板与数码管链接:

000.jpg

原理:74HC595,这是一个8位串行输入到并行输出的移位寄存器,带有一个存储寄存器和三态输出)常用于驱动数码管,因为它能够有效减少微控制器(MCU)的I/O端口使用。下面是使用HC595驱动数码管的基本原理:

  1. 移位寄存器与存储寄存器

    • HC595包含一个8位的移位寄存器和一个8位的存储寄存器。数据通过串行方式(一位一位)输入到移位寄存器中,每次在移位时钟脉冲(SH_CP)的上升沿,数据会向左移动一位。

    • 当所有8位数据都串行输入完毕后,通过在存储器时钟脉冲(ST_CP)上产生一个脉冲,这些数据会被转移到并行输出的存储寄存器中。

  2. 并行输出

    • 移位寄存器中的数据被转移到存储寄存器后,会立即反映到Q0-Q7这8个并行输出端口上。这些输出通常连接到数码管的段选线上,以控制数码管显示哪个数字或字符。

  3. 级联扩展

    • 若要驱动多位数码管,可以通过级联多个HC595来扩展输出端口。第一个HC595的Q7'(第9脚)连接到下一个HC595的DS(数据输入)引脚,这样第二个芯片就会在第一个芯片数据传输完成后开始接收数据。每个额外的HC595可以增加8个输出,用于驱动更多数码管的公共端或段选线。

  4. 数码管的控制

    • 数码管通常有两种控制方式:共阴极和共阳极。对于共阴极数码管,要显示某个数字,需要将对应段选线(a-g及dp)设置为高电平;而对于共阳极,则需设置为低电平。位选线(用于选择要显示哪一位数码管)则直接由MCU或其他逻辑控制,或者也可以通过HC595的某些输出端控制。

GPIO配置;


002.jpg


程序设计:

#include "ti_msp_dl_config.h" //dat -- PA27 : 串行数据输入 //SCLK-- PA26 :移位时钟 //RCLK-- PA13 :并行寄存器锁存时钟 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E, F uint8_t Disp_DX[ 16 ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //段显 uint8_t Disp_PX[ 8 ]={1,2,3,4,5,6,7,8}; //片选 //uint8_t Disp_DX[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x77, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xFF, 0xBF } #define HC595_DAT(x) ((x)?(DL_GPIO_setPins(HC595_PORT, HC595_DIO_PIN)) : (DL_GPIO_clearPins(HC595_PORT, HC595_DIO_PIN))) #define HC595_CLK(x) ((x)?(DL_GPIO_setPins(HC595_PORT, HC595_SCLK_PIN)) : (DL_GPIO_clearPins(HC595_PORT, HC595_SCLK_PIN))) #define HC595_RCK(x) ((x)?(DL_GPIO_setPins(HC595_PORT, HC595_RCLK_PIN)) : (DL_GPIO_clearPins(HC595_PORT, HC595_RCLK_PIN))) #define LED(x) ((x)?(DL_GPIO_setPins(HC595_PORT, HC595_TEST_PIN)) : (DL_GPIO_clearPins(HC595_PORT, HC595_TEST_PIN))) uint8_t TimerCnt,TmpVal; void Display_Out() { HC595_RCK(0); delay_cycles(100); HC595_RCK(1); delay_cycles(100); } void HC595_WriteData(uint8_t data) { uint8_t i; for(i = 0; i < 8; i++) { if((data & 0x80)>0){ HC595_DAT(1); } else { HC595_DAT(0); } data <<= 1; delay_cycles(100); HC595_CLK(0); delay_cycles(100); HC595_CLK(1); delay_cycles(100); } } //发送一个数字(0-9)到指定位的数码管 //dis_num 发送的数字(0-9) //dis_bit 发送到第几个数码管,即:片选(0-7) void HC595_SEND_DATA(uint8_t disp_num, uint8_t disp_bit) { HC595_WriteData(disp_num); HC595_WriteData(1<= 2) { TimerCnt = 0; TmpVal --; if(TmpVal == 0) { TmpVal = 10; } } break; default: break; } } /* void TIMER_0_INST_IRQHandler(void) { switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) { case DL_TIMER_IIDX_ZERO: TimerCnt++; if(TimerCnt >= 100) { TimerCnt = 0; TmpVal++; if(TmpVal > 500)TmpVal=0; } break; default: break; } } */ /* This results in approximately 0.5s of delay assuming 32MHz CPU_CLK */ #define DELAY (16000000) int main(void) { TmpVal = 10; SYSCFG_DL_init(); NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN); while (1) { LED(0); Disp_Data(0000,TmpVal); // delay_cycles(1600000); delay_cycles(1600000); // LED(1); // delay_cycles(1600000); delay_cycles(1600000); // Disp_Data(8888,8888); } }

视频见回复!


专家
2024-05-10 10:44 2楼

有采用HC595驱动点阵屏的吗?

高工
2024-05-18 16:36 3楼

任务2视频
https://www.bilibili.com/video/BV1VAuWerEk2/?vd_source=386b01bba507a9e89965cc9b7e3a5fff

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]