|
- #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] = { //共阴数码管段码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[dec%10] << 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[8] = {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[i&3] & ~(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;
- }
- }
- }
复制代码
|
|