外部中断

外部中断的程序和time0、time1的程序差不多:
一、打开外部中断

EA = 1;

二、设置外部中断触发方式

IT0 = 1;    //INT0中断请求触发,1为负边沿触发

三、打开外部中断函数

EX0 = 1;  //enable int0

四、编写外部中断函数

void ISR_Exit0(void) interrupt 0
{
    EX0 = 0;
    /*
    task
    */
    EX0 = 1;
}

中断的嵌套

两个中断一个在运行时,另一个突然中断,判断优先级后,由优先级高的先运行。

用外部中断和一个中断实现闹钟

#include <reg52.h>
#include "./delay/delay.h"

#define SEGPORT P0
sbit key1 = P3^2;
sbit bit_sel = P2^0;
sbit seg_sel = P2^1;

unsigned char segdata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char coode[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char outdata[2] = {0x3f,0x3f};

void timer0(void)
{
    EA = 1;
    TMOD |= 0x01;
    TH0 = (65536-20000)/256;
    TL0 = (65536-20000)%256;
    ET0 = 1;
    TR0 = 1;
}
void display(void)
{
     static unsigned char i = 0;

     SEGPORT = 0xff;        
     bit_sel = 1;
     bit_sel = 0;

     SEGPORT = 0x0;
     seg_sel = 1;
     seg_sel = 0;

     SEGPORT = coode[i];
     bit_sel = 1;
     bit_sel = 0;

     SEGPORT = outdata[i];
     seg_sel = 1;
     seg_sel = 0;

     i++;
     if(2 == i)
     {
        i = 0;
      }
}
void timer0_isr(void) interrupt 1
{
    TH0 = (65536-2000) / 256;
    TL0 = (65536-2000) % 256;

    display();

}
void int0_init(void)
{
    EA = 1;
    IT0 = 1;
    EX0 = 1;
}

void main(void)
{
     int0_init();
     timer0();

     while(1);
}
void int0_isr(void) interrupt 0
{
    static unsigned char disdata = 0;

    delay_ms(10);
    if(0 == key1)
    {
         while(!key1);

         delay_ms(10);
         while(!key1);
         disdata++;

         if(100 == disdata)
         {
             disdata = 0;
          }
     }                      

    outdata[0] = segdata[disdata / 10];
    outdata[1] = segdata[disdata % 10];

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值