本文是基于嵌入式开发板CT117E,stm32f103RBT6。
seg.c
#include "seg.h"
u8 Seg[17] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00};
//0-F ,全灭不显示
void seg_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
seg.h
#ifndef SEG_H
#define SEG_H
#include "stm32f10x.h"
#define SER_H GPIO_SetBits(GPIOA,GPIO_Pin_1);
#define SER_L GPIO_ResetBits(GPIOA,GPIO_Pin_1);
#define RCK_H GPIO_SetBits(GPIOA,GPIO_Pin_2);
#define RCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_2);
#define SCK_H GPIO_SetBits(GPIOA,GPIO_Pin_3);
#define SCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_3);
void seg_show(u8 bit1,u8 bit2,u8 bit3);
void seg_init(void);
#endif
数码管的显示
void seg_show(u8 bit1,u8 bit2,u8 bit3)
{
u8 i;
u8 temp;
temp=Seg[bit3]; //看原理图,三个芯片74ls595互连,最底的是数码管3,所以先进bit3的数据,再进bit2,bit1;
for(i=0;i<8;i++)
{
if(temp & 0x80) //取8位数据的最高位,判断是1 还是0 ,再存数据进芯片74ls595
{
SER_H; //数据线传输1到芯片74ls595
}
else
{
SER_L; //数据线传输0到芯片74ls595
}
SCK_H; //同意数据移位进入芯片74ls595
temp=temp<<1; //循环取各个数据位
SCK_L;
}
temp=Seg[bit2];
for(i=0;i<8;i++)
{
if(temp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
SCK_H;
temp=temp<<1;
SCK_L;
}
temp=Seg[bit1];
for(i=0;i<8;i++)
{
if(temp & 0x80)
{
SER_H;
}
else
{
SER_L;
}
SCK_H;
temp=temp<<1;
SCK_L;
}
RCK_H; //同意锁存的数据传到数码管
RCK_L;
}
上面的数据必须从第三个数据开始进行传输,且数据应该从最高位开始,一位一位进行传输,最后才能准确地显示我们的数字。看下面这张图,举例我们要在第三个数码管显示0,那么原理图的U3的A-H就应该是0011 1111(0x3f),高电平有效,最高位存放的是H,所以我们在程序中,最先取最高位数据temp & 0x80,输入到U1芯片74LS595,U1,U2,U3相互连接,通过移位将0x3f的最高位0,移到U3的H引脚上,同理再将其他位一次移到A-G上,最后再使能RCLK,传输到数码管上显示。
while(1)
{
seg_show(1,2,3) ;
Delay_Ms(2000);
seg_show(4,5,6) ;
Delay_Ms(2000);
}