595驱动
哪位大神能详细的介绍一下,单片机怎么控制HC595,发送数据的过程是怎么样的。 怎么开始,怎么结束。 多谢了void Send595Byte(BYTE byte)
{
int i = 0;
for (i = 0; i < 8; i++)
{
GpioLow(SCK_GPIO);
if (byte & (1 << (7 - i)))
GpioHigh(MOSI_GPIO);
else
GpioLow(MOSI_GPIO);
GpioHigh(SCK_GPIO);
}
} GpioLow(CS_GPIO);
if (val < MAX_VALUE)
Send595Byte(~(Disp_Const | ((dig == g_iDotPos) ? DOT_MASK : 0)));
else
Send595Byte(0xFF);
Send595Byte(1 << dig | ((g_bLed != 0 ? 1 : 0) << 4));
//PB_ODR |= 0x10;
GpioHigh(CS_GPIO); 类似SPI的通讯方式,先发送1bit,再发送一个SCLK的波形。如下图所示:
随便找了一段代码,大概的通讯流程如下,SCK和SDI需要设置为对应的IO口输出高低状态:
void TP595WriteByte(uint8_t data)
{
uint8 i;
TP595_SCK_CLR();
for(i=0;i<8;i++) //msb (信号上升沿有效)
{
if(data&0x80)
{
TP595_SDI_SET();
}
else
{
TP595_SDI_CLR();
}
__delay__();
TP595_SCK_SET();
__delay__();
TP595_SCK_CLR();
data = data << 1;
}
__delay__();
TP595_RCK_SET();
__delay__();
TP595_RCK_CLR();
__delay__();
}
多谢各位兄弟的回复,太感谢了 本帖最后由 toofree 于 2018-9-28 11:59 编辑
/* USER CODE BEGIN 0 */
#define SHCP_H HAL_GPIO_WritePin(SHCP_GPIO_Port,SHCP_Pin,GPIO_PIN_SET)
#define SHCP_L HAL_GPIO_WritePin(SHCP_GPIO_Port,SHCP_Pin,GPIO_PIN_RESET)
#define DS_H HAL_GPIO_WritePin(DS_GPIO_Port,DS_Pin,GPIO_PIN_SET)
#define DS_L HAL_GPIO_WritePin(DS_GPIO_Port,DS_Pin,GPIO_PIN_RESET)
#define STCP_H HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_SET)
#define STCP_L HAL_GPIO_WritePin(STCP_GPIO_Port,STCP_Pin,GPIO_PIN_RESET)
#define MRn_H HAL_GPIO_WritePin(MRn_GPIO_Port,MRn_Pin,GPIO_PIN_SET)
#define MRn_L HAL_GPIO_WritePin(MRn_GPIO_Port,MRn_Pin,GPIO_PIN_RESET)
#define OEn_H HAL_GPIO_WritePin(OEn_GPIO_Port,OEn_Pin,GPIO_PIN_SET)
#define OEn_L HAL_GPIO_WritePin(OEn_GPIO_Port,OEn_Pin,GPIO_PIN_RESET)
void hc595(uint8_t * tab, uint8_t BytesN)
{
uint8_t *p = tab;
int32_t i,j;
MRn_H;
OEn_L;
SHCP_L;
DS_L;
STCP_L;
HAL_Delay(1);
for (i=0;i<BytesN;i++)
{
for (j=0;j<8;j++)
{
if((*p) & (1<<(7-j)))
DS_H;
else
DS_L;
HAL_Delay(1);
SHCP_H;
HAL_Delay(1);
SHCP_L;
}
p++;
}
HAL_Delay(1);
STCP_H;
HAL_Delay(1);
SHCP_L;
DS_L;
STCP_L;
}
/* USER CODE END 0 */
/**
* @briefThe application entry point.
*
* @retval None
*/
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t disp[] = {0x80,0xaa,0x55,0x01};
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
hc595(disp,sizeof(disp));
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
给你现敲了一段代码。
发送的数据是 uint8_t disp[] = {0x80,0xaa,0x55,0x01}; 4个字节,代表有4个HC595串联。
STM32CubeMX完整工程:
多谢给位兄弟了
STM32CubeMX配置STM32F030F4P6硬件SPI驱动串行数码管
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=615683&fromuid=2075309
(出处: 意法半导体STM32/STM8技术社区)
anny 发表于 2018-9-28 14:28
STM32CubeMX配置STM32F030F4P6硬件SPI驱动串行数码管
https://www.stmcu.org.cn/module/forum/forum.php?mod ...
标准库硬件spi驱动595搞过吗 wwwheihei 发表于 2018-9-28 16:35
标准库硬件spi驱动595搞过吗
HAL库,你用标准库也可以
页:
[1]