蓝桥杯STC15单片机复习——IO口的使用

STC15F2K60S2之IO口使用

前言

马上就要蓝桥杯决赛了,趁着还剩两天临时抱抱佛脚。。。

引脚图
在这里插入图片描述
点灯测试
由引脚图可以看出,STC15的外设资源与51单片机基本一致,常用的也是三组四组IO口(P0、P1、P2、P3),由于板子的电路设计,通过74LS138译码器进行P0的外挂模块的选择。
在这里插入图片描述
其中当P25 = 0、P26=0、P27=1;即选通Y4时,外挂的模块为LED灯,下面就开始点几个灯玩玩吧。

/*
	彭某的蓝桥杯复习——LED
	1、点亮一盏LED并闪烁

*/

#include <STC15F2K60S2.h>
#define uint unsigned int
#define uchar unsigned char

void ALL_Init();
void delay_ms(uint ms);

void main()
{
	ALL_Init();
	while(1)
	{
		P25=0;P26=0;P27=1;
		P00=!P00;
		delay_ms(1000);
	}
}

/*
	函数功能:初始化函数,关闭所有外设
	函数参数:无
	函数返回值:void
*/
void ALL_Init()
{
	P25=0;P26=0;P27=1;
	P0=0xff;
	P25=1;P26=0;P27=1;
	P0=0x00;
	P25=0;P26=1;P27=1;
	P0=0xff;
}
/*
	函数功能:毫秒级延时函数
	函数参数:时间(单位为ms)
	函数返回值:void
*/
void delay_ms(uint ms)
{
	int i;
	for(;ms>0;ms--)
		for(i = 864;i>0;i--);
}

流水灯测试:(添加头文件 intrins.h)

/*
	函数功能:LED循环右移
	函数参数:无
	函数返回值:void
*/
void liushui()
{
	static char flag = 0;
	if(!flag)
	{
		flag = 1;
		P25=0;P26=0;P27=1;
		P00=0;
	}
	P0 = _cror_(P0,1);
	delay_ms(1000);
}

按键测试
在这里插入图片描述
由原理图可知,该板子的按键分为矩阵按键与独立按键,这是由CON3决定的,在此测试独立按键的使用。
1、按键控制LED开关

/*
	彭某的蓝桥杯复习——IO口i输入按键
	1、按键控制LED亮灭
	2、多个按键控制流水灯并使用标志位
*/

#include <STC15F2K60S2.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

void ALL_Init();

void main()
{
	ALL_Init();
	while(1)
	{
		
		if(!P30)
		{
			P00 = !P00;
			while(!P30);
		}
	}
}


void ALL_Init()
{
	P25 = 0;P26 = 1;P27 = 1;
	P0 = 0xff;
	P25 = 1;P26 = 0;P27 = 1;
	P0 = 0x00;
	P25 = 0;P26 = 0;P27 = 1;
	P0 = 0xff;
}

2、通过标志位解决按键长按问题,通过按键控制流水灯,需添加头文件intrins.h

char flag = 0;

void ALL_Init();
void delay_ms(uint ms);
void liushui();

char K1_flag = 0,K2_flag = 0;
void main()
{
	ALL_Init();
	P00 = 0;
	while(1)
	{
		liushui();
		if(!P30&&!K1_flag)
		{
			K1_flag = 1;
			flag = 1;
		}
		if(!P31&&!K2_flag)
		{
			K2_flag = 1;
			flag = 0;
		}
		if(P30&&K1_flag)
			K1_flag = 0;
		if(P31&&K2_flag)
			K2_flag = 0;
//		if(!P30)
//		{
//			P00 = !P00;
//			while(!P30);
//		}
	}
}

/*
	函数功能:流水灯,通过flag的值判断流水方向
	函数参数:无
	函数返回值:void
*/
void liushui()
{
	if(flag)
		P0 = _cror_(P0,1);
	else
		P0 = _crol_(P0,1);
	delay_ms(1000);
}

结语

至此,IO口的基本输入输出已经实现,但是仍存在一些问题,比如在按键控制流水灯的时,只能在延时函数外才能进行按键检测,因为延时函数会一直在计算for循环阻塞其他函数的运行,后面复习到外部中断再搞一手。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值