题目
4×4键盘中(中断),当按键按下时,蜂鸣器响一声,然后8个led完成3种花式(每种亮三次)
代码
#include"reg51.h"
#include"intrins.h"
#define led P0
#define key P1
typedef unsigned int u16;
typedef unsigned char u8;
sbit key1=P3^2; //位定义
sbit buzzer=P2^0; //位定义
u16 keyvalue; //键值
void delay (u16 i) //延时函数(约10微秒)
{
while(i--);
}
void int0_init() //中断初始化函数
{
EA=1; //中断总允许位
EX0=1; //外部中断0允许位
IT0=1; //下降沿触发
EX1=1; //外部中断1允许位
IT1=1; //下降沿触发
}
u16 key_scan() //键盘扫描函数
{
key=0xf0; //列扫描
if(key!=0xf0)
{
delay(1000); //消抖
if(key!=0xf0)
{
switch(keyvalue) //判断几列
{
case(0xe0):keyvalue=1; break;
case(0xd0):keyvalue=2; break;
case(0xb0):keyvalue=3; break;
case(0x70):keyvalue=4; break;
}
}
}
key=0x0f; //行扫描
if(key!=0x0f)
{
delay(1000); //消抖
if(key!=1000)
{
switch(key) //判断第几行
{
case(0x0e):keyvalue=keyvalue;break;
case(0x0d):keyvalue=keyvalue+4;break;
case(0x0b):keyvalue=keyvalue+8;break;
case(0x07):keyvalue=keyvalue+12;break;
}
}
}
return keyvalue;
}
void main() //主函数
{
int0_init();
key_scan();
while(1);
}
void int0() interrupt 0 //中断服务函数 分组是0
{
u16 i;
if(key1==0)
{
delay(1000); //消抖
if(key1==0)
{
buzzer=0; //打开蜂鸣器
delay(100000);
buzzer=1;
for(i=0;i<3;i++) //三种led模式
{
led=0xa5;
delay(100000);
led=~led;
delay(100000);
led=0xf0;
delay(100000);
led=~led;
delay(100000);
led=0xee;
delay(100000);
led=~led;
delay(100000);
}
}
}
}
仿真图
元器件
AT89C51 (AT89C52)
LED
BUZZER (蜂鸣器)
BUTTON (按键)
AND (与门)
POWER (电源)