天天看點

3線實作2路12位數位管顯示不同值(STM32寄存器版本)

#include <stm32f10x_lib.h>

#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

3線實作2路12位數位管顯示不同值(STM32寄存器版本)