当前位置:网站首页>单片机之led、数码管与按键
单片机之led、数码管与按键
2022-07-27 21:59:00 【*黑心萝卜三条杠*】
key.h文件
#include "intrins.h"
#include "STC15F2K60S2.H"
#ifndef _KEY_H
#define _KEY_H
#define kbd_io P3
#define state_0 0 //是否按下
#define state_1 1 //是否是抖动
#define state_2 2 //判断是否弹起
#define kbd_maskrow 0x0f //屏蔽不需要的IO
#define u8 unsigned char
#define u16 unsigned int
sbit relay=P0^4;//
sbit buzzer=P0^6;//蜂鸣器的引脚
//以下三个变量虽然是全局变量,但是实际上定义的地方不在此处,编译时需要查找定义的地方
extern unsigned int key_num;//按键的数值
extern unsigned int segbuff[];//可以控制数码管显示的位置
extern unsigned int segtab[];//数码管显示的数字
extern unsigned int ledtab[];//led的位置
void Delay1us0();
void delay_us0(unsigned int us);
void scanbtn();//独立按键函数
void scankbd();//矩阵按键函数
void segs(void);//数码管新时函数
void SysInit(unsigned char x);//初始化,关闭LED,数码管段选位选,蜂鸣器,还可以控制蜂鸣器是否工作
void LED_Select(unsigned char n);//LED选择函数
#endifkey.c文件
//包括矩阵按键函数、独立按键函数、数码管显示函数、LED显示函数、初始化函数
#include "key.h"
//以下定义全部都是全局变量
unsigned int key_num=16;//有按键的位置得到的数值
//数码管显示位置 管1 管2 管3 管4 管5 管6 管7 管8
unsigned int segbuff[]={10, 10, 10, 10, 10, 10, 10, 10};//可以相当于数码管的位选
// 显示数值 0 1 2 3 4 5 6 7 8 9 - 熄灭
unsigned int segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0xFF,//共阳数码管段选带数值显示
//显示 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. - 熄灭
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xBF,0xFF};//带小数点显示
//led显示位置 全灭 L1 L2 L3 L4 L5 L6 L7 L8 全亮
unsigned int ledtab[] = {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00};
//初始化关闭LED、蜂鸣器、数码管
void SysInit(unsigned char x)
{
//关闭LED
P2=P2&0x1f|0x80;P0=0xff;P2&=0x1f;//先将P2口高三位强制置0,再或上值,强制选择Y4C输出,后关闭所有的LED,再去除P2高三位的值
//关闭蜂鸣器
P2=P2&0x1f|0xa0;relay=0;buzzer=x;P2&=0x1f;//先将P2口高三位强制置0,再或上值,强制选择Y5C输出,
//后使P0^4有效,关闭蜂鸣器,再去除P2高三位的值
//关闭数码管的段选
P2=P2&0x1f|0xe0;P0=0xff;P2&=0x1f; //先将P2口高三位强制置0,再或上值,强制选择Y7C输出,
//后使P0口都有效,关闭共阳数码管段选,再去除P2高三位的值
//关闭数码管的位选
P2=P2&0x1f|0xc0;P0=0x00;P2&=0x1f;//先将P2口高三位强制置0,再或上值,强制选择Y6C输出,
//后使P0口都无效,关闭共阳数码管位选,再去除P2高三位的值
}
//延时
void Delay1us0() //@12.000MHz
{
_nop_();
_nop_();
_nop_();
_nop_();
}
//延时
void delay_us0(unsigned int us)
{
while(us--)
{
Delay1us0();
}
}
//LED选择闪烁
void LED_Select(unsigned char n)
{
P2 = ( P2& 0x1f ) | 0x80;//先将P2的高三位强制置0,后或上一个数强制选择Y4C口
P0 = n;//输入想要点亮的LED
P2 = P2 & 0x8e;
delay_us0(50000);//延时5毫秒
P2 = ( P2& 0x1f ) | 0x80;//先将P2的高三位强制置0,后或上一个数强制选择Y4C口
P0 = 0xff;//关闭所有LED灯
P2 = P2 & 0x8e;
delay_us0(50000);//延时
}
//矩阵按键
void scankbd()
{
static char kbd_state = 0;//定义的三个状态
unsigned char kbd_press;
char row;//判断按键的行
switch(kbd_state)
{
case state_0: //是否按下
kbd_io=0x0f; P42=0; P44=0;
kbd_press = kbd_io;
if(kbd_press != kbd_maskrow)
kbd_state = state_1;//说明key_press不等于0x0f,跳转到1状态
break;
case state_1: //是否是抖动 kbd_io-P3
kbd_press = kbd_io;
if(kbd_press != kbd_maskrow)
{//按键不是需要屏蔽的状态
//判断按键属于哪一行
if((kbd_io&0x08)==0) row=0;
if((kbd_io&0x04)==0) row=1;
if((kbd_io&0x02)==0) row=2;
if((kbd_io&0x01)==0) row=3;
kbd_io=0xf0; P42=1;P44=1; //将四列强制无效,再判断按键的列数
//判断按键属于哪一列
if(P44==0) key_num=row;
if(P42==0) key_num=row+4;
if((kbd_io&0x20)==0) key_num=row+8;
if((kbd_io&0x10)==0) key_num=row+12;
kbd_state = state_2;//跳转到2状态
}else{//按键被屏蔽,跳转0状态
kbd_state = state_0;
}
break;
case state_2: //判断是否弹起
kbd_io=0x0f; P42=0; P44=0;//将按键强制有效
kbd_press =kbd_io;//再获取端口的数值
if(kbd_press == 0x0f) kbd_state = state_0;//是需要被屏蔽的状态,需要跳转到0状态
break;
default: //屏蔽不需要的IO
break;
}
}
//数码管显示
void segs(void)
{
static unsigned char segaddr=0;
//首先全灭是为了消影
P2=(0x1f&P2)|0xe0;//先将P2口高三位置零,再强制选择Y7C,段选控制
P0=0xff;//将所有段选强制无效
P2=0x1f&P2;//消除P2口高三位的影响
P2=(0x1f&P2)|0xc0;//先将P2口高三位置零,再强制选择Y6C,位选控制
P0=1<<segaddr; //改变数码管现实的位置
P2=0x1f&P2;//消除P2口高三位的影响
P2=(0x1f&P2)|0xe0;//先将P2口高三位置零,再强制选择Y7C,段选控制
P0=segtab[segbuff[segaddr]];//显示需要显示的数值
P2=0x1f&P2;//消除数码管高三位的影响
if(++segaddr==8)
segaddr=0;//让数码管每次只显示在八个数码管上
}
//独立按键
void scanbtn(){
static char kbd_state = 0;//定义的三个状态
unsigned char kbd_press;//判断按键的行
switch(kbd_state)
{
case state_0: //是否按下
kbd_io=0x0f;
kbd_press =kbd_io;
if(kbd_press != kbd_maskrow)
kbd_state = state_1;//说明key_press不等于0x0f,跳转到1状态
break;
case state_1: //是否是抖动 kbd_io-P3
kbd_press =kbd_io;
if(kbd_press != kbd_maskrow)
{//按键不是需要屏蔽的状态
//判断按键属于哪一行
if((kbd_io&0x08)==0) key_num=0;
if((kbd_io&0x04)==0) key_num=1;
if((kbd_io&0x02)==0) key_num=2;
if((kbd_io&0x01)==0) key_num=3;
kbd_state = state_2;//跳转到2状态
}
else//按键被屏蔽,跳转0状态
kbd_state = state_0;
break;
case state_2: //判断是否弹起
kbd_io=0x0f;//将按键强制有效
kbd_press =kbd_io;//再获取端口的数值
if(kbd_press == 0x0f) kbd_state = state_0;//是需要被屏蔽的状态,需要跳转到0状态
break;
default: //屏蔽不需要的IO
break;
}
}main函数
#include "key.h"
void Timer0Init(void);
void main()
{
SysInit(0);//关闭LED灯,数码管,蜂鸣器
Timer0Init();//开启定时器
while(1)
{
segbuff[0]=key_num/10;
segbuff[1]=key_num%10;
if(key_num%8 == 0) LED_Select(ledtab[1]);
if(key_num%8 == 1) LED_Select(ledtab[2]);
if(key_num%8 == 2) LED_Select(ledtab[3]);
if(key_num%8 == 3) LED_Select(ledtab[4]);
if(key_num%8 == 4) LED_Select(ledtab[5]);
if(key_num%8 == 5) LED_Select(ledtab[6]);
if(key_num%8 == 6) LED_Select(ledtab[7]);
if(key_num%8 == 7) LED_Select(ledtab[8]);
}
}
//中断1
void time0() interrupt 1
{
scankbd();
segs();
}
//定时器0
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
边栏推荐
- Overview of construction site selection of Yongzhou analytical laboratory
- 几行代码轻松实现对于PaddleOCR的实时推理,快来get!
- 英特尔发布开源AI参考套件
- LeetCode 415. 字符串相加 和 43. 字符串相乘
- 49 times faster, NVIDIA releases quantum hybrid programming platform qoda
- 每次读取一行字符串输入(有待补充)
- 永州植物细胞实验室建设布局方案
- Implement Gobang game with C language
- 元宇宙办公,打工人的终极梦想
- C# 事件相关的练习代码。
猜你喜欢

【打新必读】魅视科技估值分析,分布式视听产品及解决方案

Matlab | those matlab tips you have to know (3)

Camera and lidar calibration: gazebo simulation livox_ camera_ lidar_ Calibration ---- external parameter calibration calculation and result verification

智能便利店带你解锁未来科技购物体验

递归求解迷宫问题

英特尔发布开源AI参考套件

What are the namespaces and function overloads of + and @ in front of MATLAB folder

Mqtt---mqtt.fx client software

A few lines of code can easily realize the real-time reasoning of paddleocr. Come and get!
![[21 day learning challenge] classmate K invites you to participate in the in-depth learning seminar](/img/88/b8d5e2a8609fbef57a1291b7c4225e.png)
[21 day learning challenge] classmate K invites you to participate in the in-depth learning seminar
随机推荐
Harmonyos 3 pure mode can limit the access to personal data of risk applications detected in Huawei's application market
点分治解析
y79.第四章 Prometheus大厂监控体系及实战 -- prometheus的服务发现机制(十)
Description and analysis of main parameters of R language r native plot function and lines function (type, PCH, CEX, lty, LWD, col, xlab, ylab)
Have you ever seen this kind of dynamic programming -- the stock problem of state machine dynamic programming (Part 2)
【Leetcode】547.省份数量(中等)
require、loadfile、dofile、load、loadstring
[21 day learning challenge] classmate K invites you to participate in the in-depth learning seminar
MFC prompts that this application has requested the runtime to terminate it in an unused way editbox box has been deleted and is still in use
Is it amazing to extract text from pictures? Try three steps to realize OCR!
[must read for new products] valuation analysis of Meishi technology, distributed audio-visual products and Solutions
Camera and lidar calibration: gazebo simulation livox_ camera_ lidar_ Calibration ---- external parameter calibration calculation and result verification
[sel object of Objective-C language]
二舅治好我的精神内耗,也让我火出了B站
code review 工具
mysql数据库的基本操作(一)-——基于数据库
2022年中国网络视频市场年度综合分析
看知名企业们如何利用 Web3进行产业重塑
每次读取一行字符串输入(有待补充)
592. 分数加减运算 : 表达式计算入门题