CAN现场总线.rar
源代码在线查看: 01-外部中断.c
// 01-外部中断.c
// 记录外部中断的次数(外部中断的次数),然后显示在数码管
// 29-09-09 akuei2
#include "reg52.h"
#define uchar unsigned char
sbit SJA1000_CS = P2^0;//SJA1000片选管脚. 低电平有效
//定义数码管码
uchar code Led_Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//定义位选码
//0b111011111,0b11011111,0b10111111,0b01111111
uchar code Led_Select[]={0xEF,0xDF,0xBF,0x7F};
int Click;
//50微秒延迟函数
void Delay_50us(int t)
{
uchar j;
t--;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//1毫秒延迟函数
void Delay_1ms(int t)
{
uchar j;
for(;t>0;t--)
for(j=112;j>0;j--);
}
//数码管显示函数
void Display(void)
{
int Digit[4],i;
Digit[3]=Click/1000; //第一个数码管取千位
Digit[2]=Click%1000/100; //第二个数码管取百位
Digit[1]=Click%100/10; //第三个数码管取十位
Digit[0]=Click%10; //第四个数码管取个位
for(i=0;i {
P0=Led_Code[Digit[3-i]]; //送数码管码
P2=Led_Select[i]; //送位选码
Delay_50us(20); //延迟1微秒
P0=P2=0xff; //消影
}
}
//初始化函数
void Init(void)
{
IT0 = 1; //外部中断0负边沿触发
EX0 = 1; //打开外部中断0
EA = 1; //打开总中断
SJA1000_CS = 1; //片选无效
}
//主函数
void main(void)
{
Init();
while(1)
{
Display();
}
}
//外部0中断函数
void Ir_ex0(void) interrupt 0
{
EX0=0;EA=0; //关闭外部中断0,关闭全局中断使能
Delay_1ms(10); //消抖
Click++; //记录按键次数
if(Click>=10000) Click=0; //如果案件超过一万次就回归0
EX0=1;EA=1; //开启外部中断0,开启全局中断使能
}