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循环阻塞其他函数的运行,后面复习到外部中断再搞一手。