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

该篇博客介绍了如何使用STM32通过寄存器配置初始化GPIO,实现两个12位数码管分别显示不同数值的功能。涉及到的函数包括数码管初始化DIS_Init()、串行数据输入DIS_IN()以及并行数据输出DIS_OUT()。代码中定义了SDA1、SCL1和SCL2用于控制数码管的显示。
摘要由CSDN通过智能技术生成
#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;    //先将存储寄存器引脚置为低

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一款广泛使用的微控制器系列,它具有丰富的外设和强大的处理能力,可以用来驱动各种外部设备,包括8数码管。 要驱动8数码管,首先需要了解数码管的工作原理。8数码管通常由8个LED组成,每个LED代表一个数字或字符的一部分。通过控制每个LED的亮灭状态,可以显示不同的数字或字符。 在STM32中,可以使用GPIO(通用输入输出)外设来控制数码管。以下是一种常见的驱动方法: 1. 连接硬件:将数码管的8个引脚分别连接到STM32的8个GPIO引脚上。确保连接正确,并根据数码管的规格确定合适的电源电压和电流。 2. 配置GPIO:在STM32的代码中,需要配置相应的GPIO引脚为输出模式。可以使用寄存器设置或者使用STM32提供的库函数进行配置。 3. 控制数码管:通过设置GPIO引脚的电平状态来控制数码管的亮灭状态。根据需要显示的数字或字符,设置对应的GPIO引脚为高电平(亮)或低电平(灭)。 4. 刷新显示:由于数码管是静态显示设备,需要定时刷新显示内容。可以使用定时器中断或者延时函数来控制刷新频率,不断更新GPIO引脚的状态,以实现动态显示效果。 需要注意的是,具体的驱动方法可能会因不同数码管型号和STM32系列而有所差异。在实际应用中,可以参考数码管STM32的相关文档和示例代码,以确保正确地驱动8数码管
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值