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]