单片机独立式按键
一、所用开发板原理图
![]()
![]()
二、自动清零方式
1、Keil程序
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dis_code[]={0x06,0x5B,0X4F,0X66}; //共阴极数码段1,2,3,4
//按键对应端口
sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
//声明延时函数
void delay10ms (void);
void delay(uint t);
//主函数
void main(void)
{
//因为按键是低电平有效,所以独立键盘的P3.4~P3.7端口置1,(低四位P3.0~P3.3置为1)
P3=0xff;
//P2.4~P2.7是数码管片选信号,这里选择P2.4号端口显示数字,即0001 1111
P2=0x1f;
//扫描按键
if((P3&0xf0)!=0xf0)
{
delay10ms();
if(K1==0)
{
//去抖动
delay10ms();
if(K1==0)
{
//数码管显示1
P0=dis_code[0];
//显示数字时长
delay(180);
}
}
if(K2==0)
{
//去抖动
delay10ms();
if(K2==0)
{
//数码管显示2
P0=dis_code[1];
delay(180);
}
}
if(K3==0)
{
//去抖动
delay10ms();
if(K3==0)
{
//数码管显示3
P0=dis_code[2];
delay(180);
}
}
if(K4==0)
{
//去抖动
delay10ms();
if(K4==0)
{
//数码管显示4
P0=dis_code[3];
delay(180);
}
}
}
}
void delay10ms (void)
{
unsigned char i,j;
for(i=0;i<100;++i)
{
for(j=0;j<100;j++);
}
}
void delay(uint t)
{
uchar i;
while(t--)
for(i=0;i<200;++i);
}
2、效果展示:
![]()
二、持续显示方式
1、Keil程序
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code dis_code[]={0x06,0x5B,0X4F,0X66};
sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
void delay10ms (void);
void delay(uint t);
void main(void)
{
P3=0xff;
P2=0x1f;
//相对于第一种方法,多增了一个while(1)死循环,按下某个键后,数码管持续显示,P0没有改变
while(1)
{
if((P3&0xf0)!=0xf0)
{
delay10ms();
if(K1==0)
{
delay10ms();
if(K1==0)
{
P0=dis_code[0];
delay(180);
}
}
if(K2==0)
{
delay10ms();
if(K2==0)
{
P0=dis_code[1];
delay(180);
}
}
if(K3==0)
{
delay10ms();
if(K3==0)
{
P0=dis_code[2];
delay(180);
}
}
if(K4==0)
{
delay10ms();
if(K4==0)
{
P0=dis_code[3];
delay(180);
}
}
}
}
}
void delay10ms (void)
{
unsigned char i,j;
for(i=0;i<100;++i)
{
for(j=0;j<100;j++);
}
}
void delay(uint t)
{
uchar i;
while(t--)
for(i=0;i<200;++i);
}
2、效果展示
![]()