0
点赞
收藏
分享

微信扫一扫

STC89C52单片机 独立键盘

独立键盘

键盘介绍

键盘是电子系统中人机对话的重要组成部分,是人向机器发出指令、输入信息的必须设备

键盘在单片机应用系统中是使用最广泛的一种数据输入设备。键盘是由多个按键组成的。

按键的工作原理

按键通常是一种常开型开关,常态下按键的两个触点处于断开状态,按下按键时它们才闭合。
以下是 轻触开关和轻触按键 图
STC89C52单片机 独立键盘_#include

键盘类型

通常键盘有编码键盘和非编码键盘两种。编码键盘通过硬件电路产生被按按键的键值码,这种键盘使用方便,所需程序简单,但硬件电路复杂,
如计算机的键盘,单片机则通常不采用编码键盘。

而软件编程来识别的称为非编码键盘,非编码键盘硬件电路简单。

在单片机组成的各种系统中,最常用的是非编码键盘。

独立键盘与矩阵键盘的特点

STC89C52单片机 独立键盘_#include_02

非编码键盘分为独立键盘和矩阵键盘。
独立键盘特点:每个按键占用一个IO口,当按键数量较多时,IO口利用效率不高,但程序简单,适用于所需按键较少的场合。
矩阵键盘特点:电路连接复杂,但提高了IO口利用率,软件编程较复杂。适用于使用大量按键的场合。

相关原理图分析

STC89C52单片机 独立键盘_数据_03

按键一端与IO口连接,另外一端接地。通过控制IO口输出高电平即可检测按键是否按下,当按下时IO口会被拉低,松开后IO口回到高电平。

按键特性

机械按键在按下或松开时会存在抖动现象。
STC89C52单片机 独立键盘_数码管_04

使用独立按键 S2 控制灯 LED1 亮灭;

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选
sbit&nbsp;key_s2&nbsp;=&nbsp;P3^0;//独立按键S2
uchar&nbsp;num;//数码管显示的值
uchar&nbsp;count;

//共阴数码管段选表0-9
uchar&nbsp;&nbsp;code&nbsp;tabel[]=&nbsp;{0x3F,&nbsp;0x06,&nbsp;0x5B,&nbsp;0x4F,&nbsp;0x66,&nbsp;0x6D,&nbsp;0x7D,&nbsp;0x07,&nbsp;0x7F,&nbsp;0x6F,};

//毫秒级延时函数定义
void&nbsp;delay(uint&nbsp;z){
uint&nbsp;x,y;
for(x&nbsp;=&nbsp;z;&nbsp;x&nbsp;&gt;&nbsp;0;&nbsp;x--)
for(y&nbsp;=&nbsp;114;&nbsp;y&nbsp;&gt;&nbsp;0&nbsp;;&nbsp;y--);&nbsp;
}&nbsp;

void&nbsp;main()//main函数自身会循环
{
while(1)
{
if(key_s2&nbsp;==&nbsp;0)//判断S2是否被按下
{
delay(20);//按键消抖
if(key_s2&nbsp;==&nbsp;0)
{
if(&nbsp;count&nbsp;==&nbsp;0){&nbsp;&nbsp;// 当 count = 0 的时候 点亮LED1灯
P1&nbsp;=&nbsp;0XFE;&nbsp;// 点亮 LED1 灯
count&nbsp;=&nbsp;1;&nbsp;
}else&nbsp;if(count&nbsp;==&nbsp;1){&nbsp;&nbsp;&nbsp;// 当 count = 1 的时候 关闭LED1灯
P1&nbsp;=&nbsp;0xff;&nbsp;&nbsp;// 关闭所有的LED 灯 
count&nbsp;=&nbsp;0;&nbsp;&nbsp;
}
}
while(!key_s2);//松手检测
}
}
}

独立按键 S2 控制流水灯亮灭。

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选
sbit&nbsp;key_s2&nbsp;=&nbsp;P3^0;//独立按键S2
sbit&nbsp;key_s3&nbsp;=&nbsp;P3^1;//独立按键S3
uchar&nbsp;num;//数码管显示的值
uchar&nbsp;count;
uchar&nbsp;temp;&nbsp;// LED灯相关变量

//共阴数码管段选表0-9
uchar&nbsp;&nbsp;code&nbsp;tabel[]=&nbsp;{0x3F,&nbsp;0x06,&nbsp;0x5B,&nbsp;0x4F,&nbsp;0x66,&nbsp;0x6D,&nbsp;0x7D,&nbsp;0x07,&nbsp;0x7F,&nbsp;0x6F,};


//毫秒级延时函数定义
void&nbsp;delay(uint&nbsp;z)
{
uint&nbsp;x,y;
for(x&nbsp;=&nbsp;z;&nbsp;x&nbsp;&gt;&nbsp;0;&nbsp;x--)
for(y&nbsp;=&nbsp;114;&nbsp;y&nbsp;&gt;&nbsp;0&nbsp;;&nbsp;y--);&nbsp;
}&nbsp;

void&nbsp;main()&nbsp;{//main函数自身会循环


if(count&nbsp;==&nbsp;0){
temp&nbsp;=&nbsp;0xfe;
P1&nbsp;=&nbsp;temp;&nbsp;&nbsp;// 1111 1110
delay(100);
}&nbsp;else&nbsp;if(count&nbsp;==&nbsp;1)&nbsp;{
P1&nbsp;=&nbsp;0xff;
}


while(1){

if(count&nbsp;==&nbsp;0){
&nbsp;&nbsp; temp&nbsp;=&nbsp;_crol_(temp,&nbsp;1);&nbsp;&nbsp;&nbsp;// 循环左移
P1&nbsp;=&nbsp;temp;
delay(100);
}&nbsp;else&nbsp;if(count&nbsp;==&nbsp;1)&nbsp;{
P1&nbsp;=&nbsp;0xff;
}

if(key_s2&nbsp;==&nbsp;0){//判断S2是否被按下

delay(20);//按键消抖
if(key_s2&nbsp;==&nbsp;0){
if(&nbsp;count&nbsp;==&nbsp;0){
delay(100); &nbsp;// 延时 100毫秒  通过增加延时的时间或减少延时的时间,来控制流水灯的速度
count&nbsp;=&nbsp;1;
}else&nbsp;if(count&nbsp;==&nbsp;1){
P1&nbsp;=&nbsp;0xff;&nbsp;&nbsp;// 关闭所有的LED 灯 
count&nbsp;=&nbsp;0;&nbsp;&nbsp;
}
}

}
while(!key_s2);//松手检测
}
}

每次按动按键 S3,控制数码管显示数字加 1,当数码管数字变为 10 时, 按动按键 S3,会让数码管重新变为 00。

方法一:

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选
sbit&nbsp;key_s2&nbsp;=&nbsp;P3^0;//独立按键S2
sbit&nbsp;key_s3&nbsp;=&nbsp;P3^1;//独立按键S3
sbit&nbsp;key_s4&nbsp;=&nbsp;P3^2;//独立按键S2
uchar&nbsp;num1&nbsp;=&nbsp;0,&nbsp;num2&nbsp;=&nbsp;0;//数码管显示的值
uchar&nbsp;count&nbsp;=&nbsp;0;

//共阴数码管段选表0-9
uchar&nbsp;&nbsp;code&nbsp;tabel[]=&nbsp;{0x3F,&nbsp;0x06,&nbsp;0x5B,&nbsp;0x4F,&nbsp;0x66,&nbsp;0x6D,&nbsp;0x7D,&nbsp;0x07,&nbsp;0x7F,&nbsp;0x6F,};


//毫秒级延时函数定义
void&nbsp;delay(uint&nbsp;z)
{
uint&nbsp;x,y;
for(x&nbsp;=&nbsp;z;&nbsp;x&nbsp;&gt;&nbsp;0;&nbsp;x--)
for(y&nbsp;=&nbsp;114;&nbsp;y&nbsp;&gt;&nbsp;0&nbsp;;&nbsp;y--);&nbsp;
}&nbsp;


/*====================================
描述 :两位共阴数码管动态显示
====================================*/
void&nbsp;display(uchar&nbsp;num1,&nbsp;uchar&nbsp;num2)
{

/*第一位显示*/&nbsp;
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFE;&nbsp;//1111 1110
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num1];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

/*第二位显示*/
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFD;&nbsp;//1111 1101
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num2];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

}

void&nbsp;main()//main函数自身会循环
{
display(num1,&nbsp;num2);&nbsp;//数码管显示函数

while(1)
{
if(key_s3&nbsp;==&nbsp;0)//判断S2是否被按下
{
delay(20);//按键消抖
if(key_s3&nbsp;==&nbsp;0)
{
num2++;&nbsp;
if(num2&nbsp;==&nbsp;10){
num1&nbsp;=&nbsp;1;
num2&nbsp;=&nbsp;0;
count++;
}&nbsp;else&nbsp;if(count&nbsp;==&nbsp;1){
num1&nbsp;=&nbsp;0;
num2&nbsp;=&nbsp;0;
count&nbsp;=&nbsp;0;
display(num1,&nbsp;num2);
}
while(!key_s3);//松手检测 
}
}
&nbsp;&nbsp;&nbsp;display(num1,&nbsp;num2);&nbsp;
}
}

方法二:

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选

sbit&nbsp;key_s3&nbsp;=&nbsp;P3^1;//独立按键S3

uchar&nbsp;display_num&nbsp;=&nbsp;0;&nbsp;// 对数码管显示的数值初始化
uchar&nbsp;num1&nbsp;=&nbsp;0,&nbsp;num2&nbsp;=&nbsp;0;//数码管显示的值

//共阴数码管段选表0-9
uchar&nbsp;&nbsp;code&nbsp;tabel[]=&nbsp;{0x3F,&nbsp;0x06,&nbsp;0x5B,&nbsp;0x4F,&nbsp;0x66,&nbsp;0x6D,&nbsp;0x7D,&nbsp;0x07,&nbsp;0x7F,&nbsp;0x6F,};


//毫秒级延时函数定义
void&nbsp;delay(uint&nbsp;z)
{
uint&nbsp;x,y;
for(x&nbsp;=&nbsp;z;&nbsp;x&nbsp;&gt;&nbsp;0;&nbsp;x--)
for(y&nbsp;=&nbsp;114;&nbsp;y&nbsp;&gt;&nbsp;0&nbsp;;&nbsp;y--);&nbsp;
}&nbsp;


/*====================================
描述 :两位共阴数码管动态显示
====================================*/
void&nbsp;display(uchar&nbsp;num1,&nbsp;uchar&nbsp;num2)
{

/*第一位显示*/&nbsp;
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFE;&nbsp;//1111 1110
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num1];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

/*第二位显示*/
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFD;&nbsp;//1111 1101
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num2];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

}

void&nbsp;main()//main函数自身会循环
{
display(num1,&nbsp;num2);&nbsp;//数码管显示函数

while(1)
{
if(key_s3&nbsp;==&nbsp;0)//判断S2是否被按下
{
display_num++; &nbsp;// 每按一次独立按键,数码管显示的值加 1
delay(20);//按键消抖
if(key_s3&nbsp;==&nbsp;0)
{
switch(display_num){ // 通过 switch case 语句对 数码管的数值进行精准的管理
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;2&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;3&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;4&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;5&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;5;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;6&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;
case&nbsp;7&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;7;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
case&nbsp;8&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;9&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;10&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
default&nbsp;:&nbsp;// 当display_num数值大于10的时候,display_num 重新赋值0,不能使 display_num 大于 10
display_num&nbsp;=&nbsp;0;
num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp; num2&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}
while(!key_s3);//松手检测 
}
}

&nbsp;&nbsp;&nbsp;display(num1,&nbsp;num2);&nbsp;
}
}

每次按动按键 S4,控制数码管显示数字减 1,当数码管数字变为 00 时, 按动按键 S4,会让数码管重新变为 10。

方法一:

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选
sbit&nbsp;key_s2&nbsp;=&nbsp;P3^0;//独立按键S2
sbit&nbsp;key_s3&nbsp;=&nbsp;P3^1;//独立按键S3
sbit&nbsp;key_s4&nbsp;=&nbsp;P3^2;//独立按键S2
uchar&nbsp;num1&nbsp;=&nbsp;0,&nbsp;num2&nbsp;=&nbsp;0;//数码管显示的值
uchar&nbsp;count&nbsp;=&nbsp;0;

//共阴数码管段选表0-9
uchar&nbsp;&nbsp;code&nbsp;tabel[]=&nbsp;{0x3F,&nbsp;0x06,&nbsp;0x5B,&nbsp;0x4F,&nbsp;0x66,&nbsp;0x6D,&nbsp;0x7D,&nbsp;0x07,&nbsp;0x7F,&nbsp;0x6F,};


//毫秒级延时函数定义
void&nbsp;delay(uint&nbsp;z)
{
uint&nbsp;x,y;
for(x&nbsp;=&nbsp;z;&nbsp;x&nbsp;&gt;&nbsp;0;&nbsp;x--)
for(y&nbsp;=&nbsp;114;&nbsp;y&nbsp;&gt;&nbsp;0&nbsp;;&nbsp;y--);&nbsp;
}&nbsp;


/*====================================
描述 :两位共阴数码管动态显示
====================================*/
void&nbsp;display(uchar&nbsp;num1,&nbsp;uchar&nbsp;num2)
{

/*第一位显示*/&nbsp;
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFE;&nbsp;//1111 1110
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num1];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

/*第二位显示*/
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFD;&nbsp;//1111 1101
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num2];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

}

void&nbsp;main()//main函数自身会循环
{
display(num1,&nbsp;num2);&nbsp;//数码管显示函数

while(1)
{
if(key_s4&nbsp;==&nbsp;0)//判断S2是否被按下
{
delay(20);//按键消抖
if(key_s4&nbsp;==&nbsp;0)
{
if(count&nbsp;==&nbsp;0){
num1&nbsp;=&nbsp;1;
num2&nbsp;=&nbsp;0;
count++;
}&nbsp;else&nbsp;if(count&nbsp;==&nbsp;1){
num1&nbsp;=&nbsp;0;
num2&nbsp;=&nbsp;9;
count++;
}&nbsp;else&nbsp;if(count&nbsp;&lt;&nbsp;11){
num2--;
count++;
}&nbsp;else&nbsp;{
count&nbsp;=&nbsp;0;
}

if(count&nbsp;==&nbsp;0){
num1&nbsp;=&nbsp;1;
num2&nbsp;=&nbsp;0;
count++;
}&nbsp;
while(!key_s4);//松手检测 
}
}
&nbsp;&nbsp;&nbsp;display(num1,&nbsp;num2);&nbsp;
}
}

方法二:

/*********************************************************************************
* 【作    者】: vvcat
* 【版    本】: V1.0
* 【外部晶振】:  11.0592mhz
* 【主控芯片】:  STC89C52
* 【编译环境】:  Keil μVisio4
* 【程序功能】:  独立按键识别                      
* 【使用说明】:  每次按动按键 S4,控制数码管显示数字减 1,当数码管数字变为 00 时, 按动按键 S4,会让数码管重新变为 10。
**********************************************************************************/
#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选
sbit&nbsp;key_s4&nbsp;=&nbsp;P3^2;//独立按键S4
uchar&nbsp;display_num&nbsp;=&nbsp;0;&nbsp;// 对数码管显示的数值初始化
uchar&nbsp;num1&nbsp;=&nbsp;0,&nbsp;num2&nbsp;=&nbsp;0;//数码管显示的值

//共阴数码管段选表0-9
uchar&nbsp;&nbsp;code&nbsp;tabel[]=&nbsp;{0x3F,&nbsp;0x06,&nbsp;0x5B,&nbsp;0x4F,&nbsp;0x66,&nbsp;0x6D,&nbsp;0x7D,&nbsp;0x07,&nbsp;0x7F,&nbsp;0x6F,};


//毫秒级延时函数定义
void&nbsp;delay(uint&nbsp;z)
{
uint&nbsp;x,y;
for(x&nbsp;=&nbsp;z;&nbsp;x&nbsp;&gt;&nbsp;0;&nbsp;x--)
for(y&nbsp;=&nbsp;114;&nbsp;y&nbsp;&gt;&nbsp;0&nbsp;;&nbsp;y--);&nbsp;
}&nbsp;


/*====================================
描述 :两位共阴数码管动态显示
====================================*/
void&nbsp;display(uchar&nbsp;num1,&nbsp;uchar&nbsp;num2)
{

/*第一位显示*/&nbsp;
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFE;&nbsp;//1111 1110
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num1];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

/*第二位显示*/
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFD;&nbsp;//1111 1101
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num2];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(1);

}

void&nbsp;main()//main函数自身会循环
{
display(num1,&nbsp;num2);&nbsp;//数码管显示函数

while(1)
{
if(key_s4&nbsp;==&nbsp;0)//判断S4是否被按下
{
display_num--;&nbsp;// 每按一次独立按键,数码管显示的值减去1
delay(20);//按键消抖
if(key_s4&nbsp;==&nbsp;0)
{
switch(display_num){&nbsp;&nbsp;&nbsp;// 通过 switch case 语句对 数码管的数值进行精准的管理
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;2&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;3&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;4&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;5&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;5;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;6&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;
case&nbsp;7&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;7;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
case&nbsp;8&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;9&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;10&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
default&nbsp;:&nbsp;// 当display_num数值小于0的时候,display_num 重新赋值10,不能使 display_num 变为负数
display_num&nbsp;=&nbsp;10;
num1&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp; num2&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}
while(!key_s4);//松手检测 
}
}

&nbsp;&nbsp;&nbsp;display(num1,&nbsp;num2);&nbsp;
}
}

每次按动按键 S5,可以让数码管复位为 0.0.。

/*********************************************************************************
* 【作    者】: vvcat
* 【版    本】: V1.0
* 【外部晶振】:  11.0592mhz
* 【主控芯片】:  STC89C52
* 【编译环境】:  Keil μVisio4
* 【程序功能】:  独立按键识别                      
* 【使用说明】:  按下开发板左下角S3按键数码管值+1,最大到10
按下S4按下,值减一,最小减到0
按下s5复位
**********************************************************************************/
#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit&nbsp;DU&nbsp;=&nbsp;P2^6;//数码管段选
sbit&nbsp;WE&nbsp;=&nbsp;P2^7;//数码管段选

sbit&nbsp;key_s3&nbsp;=&nbsp;P3^1;//独立按键S3
sbit&nbsp;key_s4&nbsp;=&nbsp;P3^2;//独立按键S4
sbit&nbsp;key_s5&nbsp;=&nbsp;P3^3;//独立按键S5
uchar&nbsp;num1&nbsp;=&nbsp;0,&nbsp;num2&nbsp;=&nbsp;0;//数码管显示的值
uchar&nbsp;count&nbsp;=&nbsp;0;
uchar&nbsp;count2&nbsp;=&nbsp;0;

//共阴数码管段选表0-9
uchar&nbsp;&nbsp;code&nbsp;tabel[]=&nbsp;{0x3F,&nbsp;0x06,&nbsp;0x5B,&nbsp;0x4F,&nbsp;0x66,&nbsp;0x6D,&nbsp;0x7D,&nbsp;0x07,&nbsp;0x7F,&nbsp;0x6F,};


//毫秒级延时函数定义
void&nbsp;delay(uint&nbsp;z)
{
uint&nbsp;x,y;
for(x&nbsp;=&nbsp;z;&nbsp;x&nbsp;&gt;&nbsp;0;&nbsp;x--)
for(y&nbsp;=&nbsp;114;&nbsp;y&nbsp;&gt;&nbsp;0&nbsp;;&nbsp;y--);&nbsp;
}&nbsp;


/*====================================
描述 :两位共阴数码管动态显示
====================================*/
void&nbsp;display(uchar&nbsp;num1,&nbsp;uchar&nbsp;num2){

/*第一位显示*/&nbsp;
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFE;&nbsp;//1111 1110
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num1];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(2);

/*第二位显示*/
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFD;&nbsp;//1111 1101
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;tabel[num2];//
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(2);

}

/*====================================
描述 :两位共阴数码管复位函数显示 0.0.
====================================*/
void&nbsp;restoration(){
/*第一位显示*/&nbsp;
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFE;&nbsp;//1111 1110
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;0XBF;// 1011 1111
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(2);

/*第二位显示*/
P0&nbsp;=&nbsp;0XFF;//清除断码
WE&nbsp;=&nbsp;1;//打开位选锁存器
P0&nbsp;=&nbsp;0XFD;&nbsp;//1111 1101
WE&nbsp;=&nbsp;0;//锁存位选数据

DU&nbsp;=&nbsp;1;//打开段选锁存器
P0&nbsp;=&nbsp;0XBF;// 1011 1111
DU&nbsp;=&nbsp;0;//锁存段选数据
delay(2);

}


void&nbsp;main()//main函数自身会循环
{

while(1){
if(count2&nbsp;==&nbsp;1){
restoration();
}else&nbsp;if(count2&nbsp;==&nbsp;0){
&nbsp;&nbsp;display(num1,&nbsp;num2);&nbsp;//数码管显示函数
}

if(key_s3&nbsp;==&nbsp;0)//判断S2是否被按下
{
count2&nbsp;=&nbsp;0;&nbsp;// 目的是为了调用  display(num1, num2); 数码管显示函数
count++; &nbsp;
delay(20);//按键消抖
switch(count){ // 通过 switch case 语句对 数码管的数值进行精准的管理
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;2&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;3&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;4&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;5&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;5;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;6&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;
case&nbsp;7&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;7;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
case&nbsp;8&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;9&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;10&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
default&nbsp;:&nbsp;// 当count数值大于10的时候,count 重新赋值0,不能使count 大于 10
count&nbsp;=&nbsp;0;
num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp; num2&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}
while(!key_s3);//松手检测 
display(num1,&nbsp;num2);&nbsp;// 调用函数显示数值
&nbsp;
&nbsp;&nbsp;}

if(key_s4&nbsp;==&nbsp;0)//判断S4是否被按下
{
count2&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;// 目的是为了调用  display(num1, num2); 数码管显示函数
count--;&nbsp;&nbsp;// 每次按下 独立按键S4 数码管数值减一 
delay(20);//按键消抖
if(key_s4&nbsp;==&nbsp;0)
{
switch(count){
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;2&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;3&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;4&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;4;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;5&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;5;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;6&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;
case&nbsp;7&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;7;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;
case&nbsp;8&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;8;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;9&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
case&nbsp;10&nbsp;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num1&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp;num2&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
default&nbsp;:&nbsp;// 当count数值小于0的时候,count 重新赋值10,不能使count 变为负数
count&nbsp;=&nbsp;10;
num1&nbsp;=&nbsp;1;
&nbsp;&nbsp;&nbsp; num2&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}

while(!key_s4);//松手检测
display(num1,&nbsp;num2);&nbsp;
}
}

if(key_s5&nbsp;==&nbsp;0)//判断S3是否被按下
{
delay(20);//按键消抖
if(key_s5&nbsp;==&nbsp;0)
{
count&nbsp;=&nbsp;0; // 按下后count 初始化为0,数码管的值会从0开始重新计数
count2&nbsp;=&nbsp;1; &nbsp;// 目的是为了调用  restoration 数码管显示函数 显示0.0.
num1&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;// 将数码管第一位的值初始化为0
num2&nbsp;=&nbsp;0;&nbsp;&nbsp;// 将数码管第二位的值初始化为0

while(!key_s5);&nbsp;&nbsp;// s5松手检测
restoration(); // 目的是为了调用  restoration 数码管显示函数 
}
}
}
}


举报

相关推荐

0 条评论