要求:通过按键按下改变流水灯的方向,按下时从左到右闪烁,抬起时从右到左闪烁,任意取一个按键即可。
P2.5、P2.6、P2.7分别控制LED3、LED2、LED1,所以需要一个函数来控制灯的亮灭
void open_led(unsigned int num)
{
P2 = 0xFF & ~(1 << num);//控制P2口特定的LED灯亮起
}
同时还要对LED以进行引脚定义
sbit LED1 = P2^7
sbit LED2 = P2^6
sbit LED3 = P2^5
需要设计一个时延(ms)
void delay_ms(unsigned int xms) //@12MHz
{
unsigned int i, j;
for(i = xms; i > 0; i--)
{
for(j = 124; j > 0; j--)
{}
}
}
接下来给按键进行引脚定义,按键所对应的引脚为P4.3,由于配置的芯片是AT89C52,<reg52.h>的头文件中没有P4引脚,于是在烧录软件中寻找额外的寄存器,此时定义引脚不会报错
sfr P4 = 0xe8; //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0E8H
//sfr P4 = 0xc0; //for 90C5xAD series, location at 0C0H
sbit INT2 = P4^3;
sbit INT3 = P4^2;
sfr XICON = 0xc0; //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0C0H
//sfr XICON = 0xe8; //for 90C5xAD series, location at 0E8H
sbit PX3 = XICON^7;
sbit EX3 = XICON^6;
sbit IE3 = XICON^5;
sbit IT3 = XICON^4;
sbit PX2 = XICON^3;
sbit EX2 = XICON^2;
sbit IE2 = XICON^1;
sbit IT2 = XICON^0;
sbit key = P4^3;
接下来是中断,由于接的是P4.3所以使用外部中断2,如果接的是P3.3则用外部中断1,如果接的是P3.2则用外部中断0
void exit2() interrupt 6
{
if(key == 0){
led_flag = LEFT;
delay_ms(10);
}
}
主程序
#include <reg52.h>
#include <intrins.h>
#define RIGHT -1
#define LEFT 1
unsigned int led_num = 5;
int led_flag = RIGHT;
void main()
{
IT2 = 1;
EX2 = 1;
EA = 1;
while(1){
//先使小灯亮起并从右往左闪烁
open_led(led_num);
delay_ms(1000);
//在按下时灯是从右往左闪烁的状态
if(key == 1 && led_flag == LEFT){
//改变闪烁方向为从左往右
led_flag = RIGHT;
}
//使小灯轮流闪烁
led_num += led_flag;
//限制led_num在5~7之间
if(led_num < 5)
led_num = 7;
else if(led_num > 7)
led_num = 5;
}
}
新手学习单片机,记录自己成长过程。