3线实现2路12位数码管显示不同值(STM32寄存器版本)

#include
#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   
#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;    //先将存储寄存器引脚置为低

剪切 (Ctrl+X)复制 (Ctrl+C)粘贴 (Ctrl+V)粘贴文本段落标签字体字体大小加粗 (Ctrl+B)斜体 (Ctrl+I)下划线 (Ctrl+U)删除线字体颜色背景颜色删除文字格式对齐列表减少缩进增加缩进超链接 (Ctrl+L)取消超链接图片表情表格插入代码源代码全屏编辑 (Esc)关于 xhEditor



  SCL2 = 1;     //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
  for(m=0;m<2;m++){};
  SCL2 = 0;

}






/*---------------------------------------------*/

#ifndef __DIS_H
#define __DIS_H  
#include "sys.h"


//SHUMA驱动代码  




//LED端口定义
#define SDA1 PAout(5)// PA5
#define SCL1 PAout(6)// PA6
#define SCL2 PAout(7)// PA7


void DIS_Init(void);//初始化
void DIS_IN( unsigned char Data);
void DIS_OUT(void);
   
#endif



#ifndef __DIS_H
#define __DIS_H  
#include "sys.h"

//SHUMA驱动代码
//LED端口定义


#define SDA1 PAout(5)// PA5
#define SCL1 PAout(6)// PA6
#define SCL2 PAout(7)// PA7


void DIS_Init(void);//初始化
void DIS_IN( unsigned char Data);
void DIS_OUT(void);
   
#endif




你可能感兴趣的:(项目设计)