#include <REG1210.H>
#include <stdio.h>
//#include "rom1210.h"
sbit LEDflag=P1^0;
sbit order_on=P1^6;
sbit p14=P1^4;
void main()
{
P1DDRH=0xcf; //设置I/O口的输入输出方式,外部中断2为输入
TMOD=0x2f; //设置定时器1为工作方式2
CKCON&=0x2f; //定时器1使用时钟频率的12分频,T1M=0;
PCON|=0x80; //SMOD0=0串口波特率加倍
TH1=256-(((2*Fosc/32)/12)/BUAD); //装入初值0xF4
TL1=256-(((2*Fosc/32)/12)/BUAD);
TR1=1; //启动定时器
SCON0=0x50; //设置串口工作在工作方式1,允许接收
EA=1; //开总中断
ES0=1; //开串口0中断
EX2=1; //开外部中断2
while(1)
{
LEDflag=1;
switch(flag)
{
case 1:
{
ES0=0; //关闭串口中断
EX2=0; //关闭外部中断2
LED1=0; //二极管点亮
flag=0;
ES0=1; //开串口中断
EX2=1; //开外部中断2
}break;
case 2:
{
LED2=~LED2;
ES0=0; //关闭串口中断
EX2=0; //关闭外部中断2
LED1=0; //二极管点亮
flag=0;
ES0=1; //开串口中断
EX2=1; //开外部中断2
}break;
default:{}break;
}
if(button_flag==1)
{
EX2=0; //关外部中断2
button_flag=0;
flag=2;
EX2=1; //打开外部中断2
}
if(uart0RI==1)
{
ES0=0; //关串口中断
flag=SBUF0; //接收一个字节
SBUF0=flag; //将接收到的字节发送出去
uart0RI=0;//将接收标志清零
ES0=1; //开串口中断
}
}
}
void UART0_int() interrupt 4 //串口中断函数
{
if(RI_0==1)
{
uart0RI=1;
RI_0=0;
}
else
{}
}
void INT2_int() interrupt 8 //外部中断2函数
{
//if(EXIF & 0x10==0x10) //如果加上这句判断就不能进入中断,外部中断触发后EXIF的第四位为1;
// {
button_flag=1;
EXIF &=0xef; //清除外部中断2标志位
// }
}
上面的程序有两个中断,一个串口0中断一个外部中断2,当上电以后如果不给串口发东西,也就是不触发串口中断的时候,
外部中断2可以自由的触发,当给串口发过一次东西后,就是 串口中断触发过一次后,外部中断2函数就不能再执行了。 |