标签:void 中断 sign 扫描 模式 c++ sig 转换 long
#include<reg52.h>
/**声明使能IO口
*/
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
/*声明数组存放数码管真值表
*/
unsigned char code LedChar[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
/**数码管缓冲区
*/
unsigned char LedBuff[6]={
0xff,0xff,0xff,0xff,0xff,0xff
};
unsigned char i=0; //动态扫描的索引
unsigned int cnt=0;
void main(){
unsigned long sec=0; //记录经过秒书
EA=1; //使能总开关
ENLED=0; //使能U3,选择数码管
ADDR3=1; //使能38译码器的真值表
TMOD=0x01; //设置T0为模式1
TH0=0xfc; //味T0赋初值0xfc67,定时1ms
TL0=0x67;
ET0=1; // 使能T0中断
TR0=1; // 启动T0
while(1){
if(cnt >= 1000){ //判断T0是否溢出1000次(1000ms=1s)
cnt=0;
sec++;
//以下代码将sec按十进制从低到高一次提取并转换为数码管显示的字符
LedBuff[0]=LedChar[sec%10];
LedBuff[1]=LedChar[sec/10%10];
LedBuff[2]=LedChar[sec/100%10];
LedBuff[3]=LedChar[sec/1000%10];
LedBuff[4]=LedChar[sec/10000%10];
LedBuff[5]=LedChar[sec/100000%10];
}
}
}
/**定时器中断服务函数
*/
void interRuptTimer0()interrupt 1 {
//重新加载赋值
TH0= 0xfc;
TL0= 0x67;
cnt++; //中断次数加1
P0=0xFF; //显示消隐
switch(i){//调用相应数码管IO口显示
case 0: ADDR0=0; ADDR1=0; ADDR2=0; i++; P0=LedBuff[0];break;
case 1: ADDR0=1; ADDR1=0; ADDR2=0; i++; P0=LedBuff[1];break;
case 2: ADDR0=0; ADDR1=1; ADDR2=0; i++; P0=LedBuff[2];break;
case 3: ADDR0=1; ADDR1=1; ADDR2=0; i++; P0=LedBuff[3];break;
case 4: ADDR0=0; ADDR1=0; ADDR2=1; i++; P0=LedBuff[4];break;
case 5: ADDR0=1; ADDR1=0; ADDR2=1; i=0; P0=LedBuff[5];break;
default: break;
}
}
标签:void 中断 sign 扫描 模式 c++ sig 转换 long
原文地址:http://www.cnblogs.com/robotes/p/7532888.html