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]