|
- #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[hc595_num]; //595数据容器
- void hc595(bit open) { //使用硬件SPI操作74HC595 请将数据写入 hc595_data 数组 然后发送 参数:1打开输出 0高阻输出
- u8 k = hc595_num - 1;
- do {
- SPDAT = hc595_data[k];
- 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] = { //共阴数码管段码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]; //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[0] = 0x40; //负号
- i[1] = nbr[(val2/100)%10];
- i[2] = nbr[(val2/10)%10];
- } else { //正数
- i[0] = nbr[(val2/100)%10];
- i[1] = nbr[(val2/10)%10];
- i[2] = nbr[val2%10];
- }
- if(dot){
- i[dot-1] |= 0x80;
- }
- return (u32)(i[0]) | ((u32)(i[1]) << 8) | ((u32)(i[2]) << 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[0]= j & 255; //74HC595:U1
- hc595_data[1]= j >> 8; //74HC595:U2
- hc595_data[2]= j >> 16; //74HC595:U3
-
- hc595(1);
-
- if(_testbit_(TF0)){
- hc595(0);
- while(1);
- }
- }
复制代码 |
|