蓝桥杯系列之按键点灯大师

目录

一.补充知识点

二.任务

        这里采用按键消抖,读取按键状态改变次数

三.按键

        这里oled_key_scan(),key_read(unsigned char which)函数可以直接读取按键状态


一.补充知识点

        1.#include <INTRINS.H>//这个是使用延时函数的相关头文件,里面包含_nop_();函数

        2.typedef unsigned char u8;//以后使用类型缩写,格式typedef 类型名 新命名

        3.1字节等于8比特(1Byte=8Bit),位(一个Bit)

        4.51单片机数据类型及范围

        5.Delayxms(u8 x) //自定义毫秒延时函数//@11.0592MHz

{
	u8 i,j,k;

	_nop_();
	for(k=0;k<x;k++)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

二.任务

        这里采用按键消抖,读取按键状态改变次数

if(S7==0)
{
    delayms(50);
    if(S7==0)
    {    
        while(S7==0);
        //按键功能
    }
}

        ①按键控制led亮灭状态        

#include <REGX52.H>
#include <INTRINS.H>

typedef unsigned char u8;

sbit S7=P3^0;
sbit led1=P0^0;

void Delayxms(u8 x)	//@11.0592MHz
{
	u8 i,j,k;

	_nop_();
	for(k=0;k<x;k++)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{	
	P2=0x80;
	while(1)
	{
	    if(S7==0)
        {
            Delayxms(15);
            if(S7==0)
            {
                while(S7==0);
                led1=~led1;
            }
        }
	}
}

        ②按键控制led进行二进制亮灭

#include <REGX52.H>
#include <INTRINS.H>

typedef unsigned char u8;

sbit S7=P3^0;
sbit led1=P0^0;

void Delayxms(u8 x)	//@11.0592MHz
{
	u8 i,j,k;

	_nop_();
	for(k=0;k<x;k++)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{	
    u8 x=0;
	P2=0x80;
    P0=0xFF;
	while(1)
	{
	    if(S7==0)
        {
            Delayxms(15);
            if(S7==0)
            {
                while(S7==0);
                x++;
                P0=~x;
            }
        }
	}
}

        ③按键控制流水灯的进行

#include <REGX52.H>
#include <INTRINS.H>

typedef unsigned char u8;

sbit S7=P3^0;
sbit led1=P0^0;

void Delayxms(u8 x)	//@11.0592MHz
{
	u8 i,j,k;

	_nop_();
	for(k=0;k<x;k++)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{	
    u8 x=0x01,n=0;
	P2=0x80;
	while(1)
	{
	    if(S7==0)
        {
            Delayxms(15);
            if(S7==0)
            {
                while(S7==0);
                P0=~x;
                x=x<<1;
                n++;
            }
        }

		if(n==8)
		{
			x=0x01;
			n=0;
		}
	}
}


三.按键

        这里oled_key_scan(),key_read(unsigned char which)函数可以直接读取按键状态

#include <REGX52.H>
#include <INTRINS.H>

typedef unsigned char u8;

sbit S7=P3^0;
sbit led1=P0^0;

void Delayxms(u8 x)	//@11.0592MHz
{
	u8 i,j,k;

	_nop_();
	for(k=0;k<x;k++)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

unsigned char oled_key_scan()
{
		
	 if(S7==0)		
		return 7;
//   if
//		return 2;
//如果有多个按键可以参照S7进行条件赋值,返回按键值
		return 0;
}

unsigned char key_read(unsigned char which)
{
	unsigned char key_old=0,key_val=0,key_up=0,key_down=0;
		key_val=oled_key_scan();
		key_down=	key_val&(key_old^key_val);
		key_up=	~key_val&(key_old^key_val);	
		key_old=key_val;
	
	if(which==1)	
	return key_down;
	
	else if(which==2)	
	return key_up;	
	
	return 0;
}

void main()
{	
	u8 x=0x01,n=0;
	P2=0x80;
	while(1)
	{
		if(key_read(1)==7)
		{
			Delayxms(1000);
			P0=~x;
			x=x<<1;
			n++;
		}
		if(n==8)
		{
			x=0x01;
			n=0;
		}
	}
}

关于蓝桥杯按键相关知识可以跳转至http://t.csdnimg.cn/wHXsv

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值