51单片机蓝桥杯学习记录
独立按键这一块是比较简单的,就是读一下io口的高低电平,用普通函数写和用中断写还是有些不一样的,要注意的还是消抖和重复触发的问题。
不说了,上码:
/****************
author: 风行天
time:2020.01.16
****************/
#include <stc15f2k60s2.h>
#define uint unsigned int
#define uchar unsigned char
void init()//初始化
{
P2=0xa0;//1010 0000
P0=0x00;
P2=0x80;//1000 0000
P0=0xff;
P0=0xfe;//点亮第一盏灯
}
void delay_ms(uint sec)//调试得的延时
{
uint x,y;
for (;sec>0;sec--)
{
for (x=0;x<5;x++)
{
for (y=0;y<157;y++)
{}
}
}
}
/******
左右流水
******/
void crol()//左流
{
uchar y;
y=P0;
// x=P0&0x01;
if (P0&0x01)
{
y=y>>1;
P0=y|0x80;
}
else
{
y=y>>1;
P0=y;
}
}
void cror()//右流
{
uchar y;
y=P0;
// x=P0&0x01;
if (P0&0x80)
{
y=y<<1;
P0=y|0x01;
}
else
{
y=y<<1;
P0=y;
}
}
void stop()//停止
{
P0=P0;
}
uchar flow=0;
uchar a=0;
void breathe()//这里用延时写呼吸灯
{
uchar breath,dead;
if (a==0)
{
flow++;
if (flow==250)
{
a=1;
}
}
else
{
flow--;
if (flow==0)
{
a=0;
}
}
for (breath=0;breath<200;breath++)
{
for (dead=0;dead<60;dead++)
{
}
if ((breath<flow))
{
P0=0;
}
else
{
P0=0xff;
}
}
}
void scan()//扫描按键松开才算
{
while(1)
{
P3=P3|0xff;//置一
switch(P3)
{
case 0xfe :
{
delay_ms(5);//消抖
if (P3&0x01)//防误触
{
break;
}
while(P3==0xfe);//只触发一次
while(P3==0xff)
{
crol();
delay_ms(100);
}
break;
}
case 0xfd :
{
delay_ms(5);//消抖
if (P3&0x02)
{
break;
}
while(P3==0xfd);
while(P3==0xff)
{
cror();
delay_ms(100);
}
break;
}
case 0xfb :
{
delay_ms(5);//消抖
if (P3&0x04)
{
break;
}
while(P3==0xfb);
while(P3==0xff)
{
stop();
}
break;
}
case 0xf7 :
{
delay_ms(5);//消抖
if (P3&0x08)
{
break;
}
while(P3==0xf7);
while(P3==0xff)
{
breathe();
}
P0=0xfe;
break;
}
default:return;
}
}
}
void main ()//主函数
{
init();
while (1)
{
scan();
}
}
怎么程序放上来变得这么难看。。。
弄个下载包吧https://download.csdn.net/download/qq_44488422/12107156