源文件74HC595.c
// 用于HC595实现的4Bit-LED Digit Tube Module
// 注意:该4位数码管是共阳的!
#include "74HC595.h"
// 码表
const u8 digitTable[] =
{
// 0 1 2 3 4 5 6 7 8 9
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,
// A b C d E F -
0x8C, 0xBF, 0xC6, 0xA1, 0x86, 0xFF, 0xbf
};
/*******************************************************************************
* Function Name : HC595_Init
* Description : 初始化HC595
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void HC595_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
RCC_APB2PeriphClockCmd(HC595_RCC | HC595_RCLK_RCC, ENABLE);
//使能HC595的时钟
//74HC595, SCLK RCLK DIO 推挽输出
GPIO_InitStructure.GPIO_Pin = HC595_SCLK_PIN| HC595_DIO_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出
GPIO_Init(HC595_GPIO, &GPIO_InitStructure); //初始化寄存器
GPIO_InitStructure.GPIO_Pin = HC595_RCLK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出
GPIO_Init(HC595_RCLK_GPIO, &GPIO_InitStructure); //初始化寄存器
}
/*******************************************************************************
* Function Name : HC595_SendByte
* Description : 发送一个字节
* Input : data
* Output : None
* Return : None
*******************************************************************************/
void HC595_SendByte(u8 data)
{
u8 i;
for (i=8; i>=1; i--)
{
// 高位在前
if (data&0x80)
GPIO_SetBits(HC595_GPIO, HC595_DIO_PIN);
else
GPIO_ResetBits(HC595_GPIO, HC595_DIO_PIN);
data <<= 1;
// SCLK上升沿
GPIO_ResetBits(HC595_GPIO, HC595_SCLK_PIN);
GPIO_SetBits(HC595_GPIO, HC595_SCLK_PIN);
}
}
/*******************************************************************************
* Function Name : HC595_Display
* Description : 显示4位数字(包括小数点)
* Input : num: 0000 - 9999
* dp: 小数点的位置1-4
* Output : None
* Return : 正常返回0,错误返回1
*******************************************************************************/
u8 HC595_Display(u16 num, u8 dp)
{
u8 qian = 0, bai = 0, shi = 0, ge = 0;
// 对显示的参数范围进行检查
if (num > 9999 || dp > 4)
//报错
return 1;
// 对num进行分解
qian = num / 1000;
bai = num % 1000 / 100;
shi = num % 100 / 10;
ge = num % 10;
// 千位
if(dp == 1)
HC595_SendByte(digitTable[qian] & 0x7F);
else
HC595_SendByte(digitTable[qian]);
HC595_SendByte(0x08);
GPIO_ResetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
GPIO_SetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
// 百位
if(dp == 2)
HC595_SendByte(digitTable[bai] & 0x7F);
else
HC595_SendByte(digitTable[bai]);
HC595_SendByte(0x04);
GPIO_ResetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
GPIO_SetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
// 十位
if(dp == 3)
HC595_SendByte(digitTable[shi] & 0x7F);
else
HC595_SendByte(digitTable[shi]);
HC595_SendByte(0x02);
GPIO_ResetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
GPIO_SetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
// 个位
if(dp == 4)
HC595_SendByte(digitTable[ge] & 0x7F);
else
HC595_SendByte(digitTable[ge]);
HC595_SendByte(0x01);
GPIO_ResetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
GPIO_SetBits(HC595_RCLK_GPIO, HC595_RCLK_PIN);
return 0;
}
复制代码
|