数码管型号四位共阳,采用2片595驱动数码管,五个管脚分别如下:
VCC------------------------------------------------------------------------------------------>3.3V~5V DIO------------------------------------------------------------------------------------------->PE5 RCLK---------------------------------------------------------------------------------------->PE3 SCLK---------------------------------------------------------------------------------------->PE1 GND ---------------------------------------------------------------------------------------->接地
我采用的STM32芯片可以采用STM32f103zet6,实现的功能是四位数码管可以任意显示想要的四位数,主要代码部分如下:
(1)主函数部分:
int main(void)
{
DIGITAL_Init();//使能管脚不能少
while(1)
{
display(5430) ;//显示的是五千四百三十,可以根据需求自己改动
}
}
(2)引脚初始化部分:
void DIGITAL_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE, GPIO_Pin_1 );
GPIO_ResetBits(GPIOE, GPIO_Pin_3 );
GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
}
(3)display()?部分:
void display(unsigned int n)
{
static unsigned int thousand_bit, hundred_bit, ten_bit, single_bit;
const unsigned char *led_table; // 查表指针,指针使用
unsigned char i; //定义需要放在LED赋值前
thousand_bit = n / 1000;
hundred_bit = (n % 1000) / 100;
ten_bit = n % 1000 % 100 / 10;
single_bit = n % 10; //显示千位数
//显示第1位
led_table = LED_0F + single_bit; //LED_OF是首地址,LED[0]移动
i = *led_table;
DIGITAL_out(i);
DIGITAL_out(0x01); //位选
GPIO_ResetBits(GPIOE, GPIO_Pin_3); // RCLK = 0;
GPIO_SetBits(GPIOE, GPIO_Pin_3); // RCLK = 1;
//显示第2位
led_table = LED_0F + ten_bit;
i = *led_table;
DIGITAL_out(i);
DIGITAL_out(0x02);
GPIO_ResetBits(GPIOE, GPIO_Pin_3); // RCLK = 0;
GPIO_SetBits(GPIOE, GPIO_Pin_3); // RCLK = 1;
//显示第3位
led_table = LED_0F + hundred_bit;
i = *led_table;
DIGITAL_out(i);
DIGITAL_out(0x04);
GPIO_ResetBits(GPIOE, GPIO_Pin_3); // RCLK = 0;
GPIO_SetBits(GPIOE, GPIO_Pin_3); // RCLK = 1;
//显示第4位
led_table = LED_0F + thousand_bit;
i = *led_table;
DIGITAL_out(i);
DIGITAL_out(0x08);
GPIO_ResetBits(GPIOE, GPIO_Pin_3); // RCLK = 0;
GPIO_SetBits(GPIOE, GPIO_Pin_3); // RCLK = 1;
}
(4)DIGITAL_out()部分:
void DIGITAL_out(unsigned char X) //写程序时此函数需要放在display()前面
{
unsigned char i;
for(i=8;i>=1;i--)
{
if (X&0x80) GPIO_SetBits(GPIOE, GPIO_Pin_5 );
else GPIO_ResetBits(GPIOE, GPIO_Pin_5 );
X<<=1;
GPIO_ResetBits(GPIOE, GPIO_Pin_1);
GPIO_SetBits(GPIOE, GPIO_Pin_1);
}
}
|