一、心形灯单片机
二、心形灯原理图
三、需要实现的功能
四、源码
#include <reg52.h>
#define DELAY_LED 200 //每个灯亮的时间间隔为300ms
#define DELAY_BUTTON 5 //消除抖动 5ms
#define PWM_Module_Num 16 //P0 P1位置的共计灯数量
#define LED1 P0 //LED1代表P0
#define LED2 P2 //LED2代表P2
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
sbit KEY4 = P3^5;
sbit led17=P3^6;
unsigned int LED_Temp[PWM_Module_Num]={
0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000,0x0080,0x0040,0x0020,0x0010,0x0008,0x0004,0x0002,0x0001};
//依次对应D8 7 6 5 4 3 2 1 16 15 14 13 12 11 10 9
unsigned char i=0; //游标i
unsigned char Flow_Mode; //按键选择
unsigned char Old_Mode; //保存中断前的状态(用于确定顺时针转还是逆时针转)
//延迟函数
void Delay(unsigned int Num)
{
unsigned int i,j;
for(i=0;i<Num;i++)
for(j=0;j<110;j++)
;
}
//按键选择
void KEY_Scan(void)
{
if(KEY1 == 0)
{
Delay(DELAY_BUTTON);
if(KEY1 ==0)
{
Flow_Mode = 1;
while(!KEY1);
}
}
if(KEY2 == 0)
{
Delay(DELAY_BUTTON);
if(KEY2 ==0)
{
Flow_Mode = 2;
while(!KEY2);
}
}
if(KEY3 == 0)
{
Delay(DELAY_BUTTON);
if(KEY3 ==0)
{
Flow_Mode = 3;
while(!KEY3);
}
}
if(KEY4 == 0)
{
Delay(DELAY_BUTTON);
if(KEY4 ==0)
{
Flow_Mode = 4;
while(!KEY4);
}
}
}
//每种按键下的处理方式
void Timer0()
{
Delay(DELAY_LED);
switch(Flow_Mode)
{
//顺时针心形
case 1:
Old_Mode = Flow_Mode;
if(i == PWM_Module_Num)
{
//将所有灯关闭
LED1 = 0xFFFF;
LED2 = 0xFFFF;
//打开D17
led17 = 0;
Delay(DELAY_LED);
//关闭D17
led17 = 1;
//复位i
i=0;
}
LED1 = ~LED_Temp[i]/256;
LED2 = ~LED_Temp[i]%256;
i++;
break;
//逆时针心形
case 2:
Old_Mode = Flow_Mode;
//LED1 = ~LED_Temp[i]/256;
//LED2 = ~LED_Temp[i]%256;
if(i == -1)
{
//将所有灯关闭
LED1 = 0xFFFF;
LED2 = 0xFFFF;
//打开D17
led17 = 0;
Delay(DELAY_LED);
//关闭D17
led17 = 1;
//复位i
i=PWM_Module_Num-1;
}
LED1 = ~LED_Temp[i]/256;
LED2 = ~LED_Temp[i]%256;
//i递减
i--;
break;
case 3:
//将所有灯关闭
LED1 = 0xFFFF;
LED2 = 0xFFFF;
if(i <= PWM_Module_Num)
{
//中断发生在P0 P1位置
LED1 = ~LED_Temp[i]/256;
LED2 = ~LED_Temp[i]%256;
}
else
{
//中断发生在P3(D17)位置
//常亮灯D17
led17 = 0;
}
break;
case 4:
//继续(还原上次状态)
Flow_Mode = Old_Mode;
break;
default:
//默认为状态1 顺时针的心
Flow_Mode = 1;
break;
}
}
void main()
{
while(1)
{
Timer0();
KEY_Scan();
}
}