GPIO 发表于 2022-8-17 09:45:54

STC12C5A单片机 硬件SPI驱动3个74HC595级联静态共阴数码管显示范围:-99~999的浮点小数


#include "STC12C5A60S2.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define T1ms 0xF830                        //24Mhz 1ms定时器初值

sbit hc595_oe = P1 ^ 3;                //高电平关闭595输出 (低电平打开输出,防止上电瞬间乱码)
sbit hc595_stcp = P1 ^ 4;         //上升沿输出595内部数据                PIN12      (SPI片选,任意IO)
sbit hc595_ds = P1 ^ 5;               //595被锁存的数据                PIN14      (SPI_MOSI)      P1.5
                                                                //      (SPI_MISO)      P1.6      (不使用)
sbit hc595_shcp = P1 ^ 7;         //上升沿锁存数据到595内部      PIN11      (SPI_SCL)      P1.7

#define hc595_num 3                        //595级联数量
u8 hc595_data;                //595数据容器

void hc595(bit open) {                //使用硬件SPI操作74HC595 请将数据写入 hc595_data 数组 然后发送 参数:1打开输出 0高阻输出
      u8 k = hc595_num - 1;
      do {
                        SPDAT = hc595_data;
                        while(!(SPSTAT & 0x80));
                        SPSTAT = 0xC0;
      } while (k--);
      hc595_oe = !open;
      hc595_stcp=0;
      hc595_stcp=1;
}

void InitTimer0(){
    TMOD = 0x01;
    TH0 = T1ms >> 8;
    TL0 = T1ms;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

u8 code nbr = {                //共阴数码管段码16进制
      0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};

void main() {
      SPCTL = 0xDC;      //开硬件SPI
      WDT_CONTR = 0x27;      //开看门狗
      InitTimer0();                //开1ms定时器中断
      while (1){
                _nop_();_nop_();
                WDT_CONTR |= 0x10;                //看门狗喂狗
                _nop_();_nop_();
      }
}

/*
浮点小数转3位共阴数码管段码数据 小数范围:-99~999
正数:
0.00~9.99         2位小数
10.0~99.9         1位小数
100~999         无小数
负数:
-9.9~-0.1      1位小数
-99~-10                无小数
*/
u32 float2seg3(float val){
      u8 i;                //3位数码管段码数据
      bit neg = (val < 0);                //是否为负数
      u16 val2;                //小数化整用
      u8 dot = 0;                //小数点位置 0:无 1:百位 2:十位 3:个位
      if(val >= 999){
                val = 999;
      } else if(val <= -99){
                val = -99;
      }
      if(neg) val = 0 - val;
      if(val >= 0 && val < 10){
                val2 = val * 100;
                dot = 1;
      } else if(val >= 10 && val < 100){
                val2 = val * 10;
                dot = 2;
      } else if(val >= 100 && val < 1000){
                val2 = val;
                dot = 0;
      }

      if(neg){                //负数
                if(++dot == 3){
                        dot = 0;
                }
                i = 0x40;                //负号
                i = nbr[(val2/100)%10];
                i = nbr[(val2/10)%10];

      } else {      //正数
                i = nbr[(val2/100)%10];
                i = nbr[(val2/10)%10];
                i = nbr;
      }

      if(dot){
                i |= 0x80;
      }
      return (u32)(i) | ((u32)(i) << 8) | ((u32)(i) << 16);
}

void Timer0Interrupt() interrupt 1{                //24Mhz 1ms定时器中断
      u32 j;

      static float f = -99.99;
      static bit b = 1;
    TH0 = T1ms >> 8;
    TL0 = T1ms;

      j = float2seg3(f);
      if(b){
                f += 0.01;
      } else {
                f -= 0.01;
      }

      if(f >= 999.99 || f <= -99.99){
                b = !b;
      }

      hc595_data= j & 255;                //74HC595:U1
      hc595_data= j >> 8;                //74HC595:U2
      hc595_data= j >> 16;                //74HC595:U3
      
      hc595(1);               
      
      if(_testbit_(TF0)){
                hc595(0);
                while(1);
      }
}
页: [1]
查看完整版本: STC12C5A单片机 硬件SPI驱动3个74HC595级联静态共阴数码管显示范围:-99~999的浮点小数