当前位置:文档之家› 51单片机外部中断实例

51单片机外部中断实例

/*数码管显示一个2位数00,使用外部中断0和外部中断1,要求中断0中断一次,
数码管显示+1,一直加到99,再加又循环成00,中断1中断一次则减1,
当减到00时再减则变为99 */

#include


sbit DS =P1^5; //定义74HC595 I/O口
sbit SHCP =P1^6;
sbit STCP =P1^7;

char num=0; //定义一个有符号的字符型数据,后面要用到负数

unsigned char code LED_DATE [] = //定义数码管段数组
{
0XC0, // 0
0XF9, // 1
0XA4, // 2
0XB0, // 3
0X99, // 4
0X92, // 5
0X82, // 6
0XF8, // 7
0X80, // 8
0X90, // 9
0XFF // 关
};

unsigned char code LED_W [] = //定义数码管位数组
{
0X80, //第一个数码管位
0X40, //第二个数码管位
0X20, //第三个数码管位
0X10, //第四个数码管位
0X08, //第五个数码管位
0X04, //第六个数码管位
0X02, //第七个数码管位
0X01 //第八个数码管位
};

void ZD_INTI(); //子函数声名
void HC595(unsigned char Vluar);
void Delay(unsigned int xms);

void main()
{
ZD_INTI(); //开中断
while(1)
{
P0=LED_DATE[num%10]; //求余得出个位
HC595(LED_W[1]); //开个位数码管位数据
Delay(10);
P0=0XFF; //消余晖
P0=LED_DATE[num/10]; //求模得出十位
HC595(LED_W[0]); //开十位数码管位数据
Delay(10);
P0=0XFF; //消余晖
}
}

void INT_0() interrupt 0 using 0 //外部中断0函数
{
num++; //中断一次变量加1
if(num==100)
{
num=0; //重新给变量赋值
}
}


void INT_1() interrupt 2 using 2 //外部中断1函数
{
num--; //中断一次变量减1
if(num==(-1)) //判断变量是否小于0,此处设为-1是为了防止变量为00是出现乱码。所以为char型数据
{
num=99; //重新给变量赋值
}
}


void ZD_INTI()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
}

void HC595(unsigned char Vluar)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DS=Vluar&0X01;
SHCP=0;
SHCP=1;
Vluar>>=1;
}
STCP=0;
STCP=1;
}

void Delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}



相关主题
文本预览
相关文档 最新文档