#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "dis.h"
unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};
//0 1 2 3 4 5 6 7 8 9 负号
unsigned char wei[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF};
int main(void)
{
unsigned char point,d[6];
unsigned char d1[6];
u16 p=999999;
u32 temp_1;
u8 x,y,n,i,j;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);
DIS_Init();
while(1)
{
d[0]=2;
d[1]=10;
d[2]=temp_1%10;
d[3]=(temp_1/10)%10;
d[4]=(temp_1/100)%10;
d[5]=(temp_1/1000)%10;
d[4]=(temp_1/10000)%10;
d[5]=(temp_1/100000)%10;
p--;
d1[0]=p%10;
d1[1]=(p/10)%10;
d1[2]=(p/100)%10;
d1[3]=(p/1000)%10;
d1[4]=(p/10000)%10;
d1[5]=(p/100000)%10;
for(i=0;i<10;i++)
{
//每组2个关闭语句 显示第一组0个关闭语句 第二组2个 三组4个
for(n=0;n<6;n++) //位循环 第n位
{
x=d[n]; // 第一路 第n段码
DIS_IN(wei[n]); //先传位码
if(n==5) //小数点所在位 实现添加小数点位置
{ point= (duan[x]&0x7F);
DIS_IN(point);
}
else DIS_IN(duan[x]); //再传段码
y=d1[n]; //第二路 第n段码
DIS_IN(wei[n]); //先传位码
if(n==2) //小数点所在位 实现添加小数点位置
{ point= (duan[y]&0x7F);
DIS_IN(point);
}
else DIS_IN(duan[y]); //再传段码
DIS_OUT();
delay_us(500);
}
if(i==999999)
i=0;
if(p==0)
p=999999;
}
}
}
#include <stm32f10x_lib.h>
#include "dis.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
//数码管输出端口初始化
//初始化PA8和PD2为输出口.并使能这两个口的时钟
// IO初始化
void DIS_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFF0FFFFF;
GPIOA->CRL|=0X00300000;//PA.5 推挽输出
GPIOA->ODR|=1<<5; //PA.5输出高
GPIOA->CRL&=0XF0FFFFFF;
GPIOA->CRL|=0X03000000;//PA.6推挽输出
GPIOA->ODR|=1<<6; //PA.6输出高
GPIOA->CRL&=0X0FFFFFFF;
GPIOA->CRL|=0X30000000;//PA.7推挽输出
GPIOA->ODR|=1<<7; //PA.7输出高
}
/*---------------串行数据输入-----------------------------*/
void DIS_IN(unsigned char Data)
{
u8 j,m;
for(j = 0;j < 8; j++) //循环8次,刚好移完8位
{
SCL1 = 0; //先将移位寄存器控制引脚置为低
if((Data & 0x80)==0x80) SDA1=1;
else SDA1=0;
Data<<=1; //将数据的次高位移到最高位
SCL1 = 1; //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位
for(m=0;m<2;m++){};//短延时,去掉后会出错
SCL1 = 0;
}
}
/*----------------并行数据输出----------------------------*/
void DIS_OUT(void)
{
u8 m;
SCL2 = 0; //先将存储寄存器引脚置为低