GPIO 发表于 2022-12-1 16:33:16

STC单片机 8个IO口强推挽动态扫描免消影驱动两位半188共阴数码管2354AS 显示数字0~199


#include "STC12C5A60S2.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
#define IO_2354AS        P2                //P2口与2354AS数码管连接 左下角(第1脚):P2.0 右下角:P2.3 左上角:P2.7 右上角:P2.4 (没有小数点)
//P2口模式配置寄存器
#define M0_2354AS P2M0
#define M1_2354AS P2M1

#define T0 0xFC18         //1ms@12Mhz 定时器初值
u8 code nbr = {                //共阴数码管段码16进制
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};

u16 bdata seg = 0;      //188数码管段码数据 (可位寻址)
//百位
sbit b1 = seg ^ 8;
sbit c1 = seg ^ 9;
//十位
sbit a2 = seg ^ 10;
sbit b2 = seg ^ 11;
sbit c2 = seg ^ 12;
sbit d2 = seg ^ 13;
sbit e2 = seg ^ 14;
sbit f2 = seg ^ 15;
sbit g2 = seg ^ 0;
//个位
sbit a3 = seg ^ 1;
sbit b3 = seg ^ 2;
sbit c3 = seg ^ 3;
sbit d3 = seg ^ 4;
sbit e3 = seg ^ 5;
sbit f3 = seg ^ 6;
sbit g3 = seg ^ 7;

void InitTimer0(){      //初始化定时器0中断
    TMOD = 0x01;
    TH0 = T0>>8;
    TL0 = T0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

u16 dec2seg(u8 dec){    //将10进制数字0~199转换到188数码管专用段码
    u16 ret = 0;
    if(dec > 199) dec = 199;
    if(dec >= 100) ret |= 3;                  //百位:大于等于100显示
    if(dec >= 10) ret |= nbr[(dec/10)%10] << 2; //十位:大于等于10显示
    return ret | (nbr << 9);            //个位:始终显示
}

void main(){
    //强推挽输出
    M0_2354AS = 0xFF;
    M1_2354AS = 0x00;
    WDT_CONTR = 0x27;   //开看门狗
    InitTimer0();       //初始化定时器0中断
        while(1){
      _nop_();
      _nop_();
      WDT_CONTR |= 0x10;      //看门狗喂狗
      _nop_();
      _nop_();
    }
}
u8 code m = {0x7F,0xFE,0xDF,0xFB,0x1A,0x4A,0x52,0x58};       //严禁修改

void Timer0Interrupt() interrupt 1{   //1ms定时器0中断
    static u8 i=0;
    u8 k,l;
    static u8 ms=249;
    TH0 = T0>>8;
    TL0 = T0;
    switch(i){
      //一次只点亮一位段码,使亮度均匀
      case 0x0:k = a2?0:64;break;
      case 0x1:k = f2?0:64;break;
      case 0x2:k = a3?0:64;break;
      case 0x3:k = f3?0:64;break;
      case 0x4:k = b2?0:16;break;
      case 0x5:k = g2?0:16;break;
      case 0x6:k = b3?0:16;break;
      case 0x7:k = g3?0:16;break;
      case 0x8:k = c2?0:8;break;
      case 0x9:k = e2?0:8;break;
      case 0xA:k = c3?0:8;break;
      case 0xB:k = e3?0:8;break;
      case 0xC:k = d2?0:2;break;
      case 0xD:k = c1?0:2;break;
      case 0xE:k = d3?0:2;break;
      case 0xF:k = b1?0:2;break;
    }
    IO_2354AS = m & ~(k | m[(i>>2)+4]);   //此数码相当于8个IO口驱动4*4个LED,不需要消影!
    if(++i >= 16) {
      i = 0;
    }
    if(++ms >= 250){
      ms=0;
      seg = dec2seg(l);
      if(++l >199){
            l=0;
      }
    }
}

页: [1]
查看完整版本: STC单片机 8个IO口强推挽动态扫描免消影驱动两位半188共阴数码管2354AS 显示数字0~199