目录
这里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