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 <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;    //先將存儲寄存器引腳置爲低

剪切 (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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章