从左到右的流水灯的制作(重点)
#include <reg51.h>
#include <intrins.h> //移位函数的头文件
unsigned int j;
void Delay(unsigned int i) // 延时函数
{
while(i--) // 注意这里是i--
{
for(j = 0;j < 120;j++); // 注意这里是120
}
}
void main()
{
P1 = 0xFE;
while(1)
{
P1 = _crol_(0,1); //数据每次左移一位
// crol函数是循环左移函数,即把挪出去的那一位补在后面空的一位
//<<是左移函数,会在空的那一位补0
Delay(100);
}
}
左到右的来回流水灯的制作
#include <reg51.h>
#include <>
void Delay(unsigned int i)
{
while(i--)
{
for(j=0;j<120;j++);
}
}
unsigned int x;
unsigned int y;
void main()
{
P1 = 0xFE;
while(1)
{
for(x=0;x<8;x++)
{
P1 = _crol_(0,1);
Delay(100);
}
for(y=0;y<8;y++)
{
P1 = _cror_(0,1);
Delay(100);
}
}
}
开关量检测指示器
#include <reg51.h>
void Delay(unsigned int i)
{
while(i--)
{
for(int j=0;j<120;j++);
}
}
void main()
{
while(1)
{
if(P1_4 == 0)
{
Delay(20);
while(P1_4==0);
Delay(20);
P1_0 = 0;
}
if(P1_5 == 0)
{
Delay(20);
while(P1_5==0);
Delay(20);
P1_1 = 0;
}
if(P1_6 == 0)
{
Delay(20);
while(P1_6==0);
Delay(20);
P1_2 = 0;
}
if(P1_7 == 0)
{
Delay(20);
while(P1_7==0);
Delay(20);
P1_3 = 0;
}
}
}
单一外中断的应用
#include <reg51.h>
void Delay(unsigned int i)
{
while(i--)
{
for(j=0;j<120;j++);
}
}
void EX0_Init()
{
EA = 1;
EX0 = 1;
IT0 = 1; // 负跳沿触发IT = 1 低电平触发IT = 0
}
void do_EX0() interrupt 0
{
EX0 = 0;
while(1)
{
P1 = 0xF0;
Delay(100);
P1 = 0x0F;
Delay(100);
}
EX0 = 1;
}
void main()
{
P1 = 0x00;
EX0_Init();
while(1);
}
两个外中断的应用
#include <reg51.h>
void Delay(unsigned int i)
{
while(i--)
{
for(j=0;j<120;j++);
}
}
void EX_Init()
{
EA = 1;
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
IP1 = 1;
IP0 = 1; // 两个中断都设置为高优先级
}
void do_EX0() interrupt 0
{
while(1)
{
P1 = 0xF0;
Delay(100);
P1 = 0x0F;
Delay(100);
}
}
void do_EX1() interrupt 2
{
P1 = 0x00;
}
void main()
{
EX_Init();
while(1)
{
//流水灯代码
}
}
ps:这个代码因为设置了同级中断,所以在进入任何一个中断后,另一个中断不会被响应
中断嵌套(重点)
#include <reg51.h>
void Delay(unsigned int i)
{
while(i--)
{
for(j=0;j<120;j++);
}
}
void EX_Init()
{
EA = 1;
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1; // 设置触发方式
IP0 = 0;
IP1 = 1; //设置优先级
}
void do_EX0() interrupt 0
{
while(1)
{
P1 = 0xF0;