当前位置:网站首页>单片机之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;
}
边栏推荐
- startUMl
- Leetcode 452. minimum number of arrows to burst balloons (medium)
- 「图神经网络:基础、前沿与应用」最新IJCAI2022教程
- ҈ straight ҈ Broadcast ҈ Pre ҈ Report ҈ |҈ In hot summer, let's cross the high temperature and "bake" with nono!
- Precautions for site selection of Yongzhou clean animal laboratory
- See how well-known enterprises use Web3 to reshape their industries
- 小程序助力智能家居生态平台
- Prepare for the interview and stick to the third sentence of the question - Branch sentences!
- Analysis and solution of errors in symbols uploading when baget manages packages
- Build Release Blogs
猜你喜欢

Harmonyos 3 pure mode can limit the access to personal data of risk applications detected in Huawei's application market

JS ATM output

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

code review 工具

startUMl

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

Strong collaboration and common development! Intel and Taiyi IOT held a seminar on AI computing box aggregation services

MATLAB如何将k线图设置为经典红绿配色?

点分治解析
![[leetcode] 547. Number of provinces (medium)](/img/15/d49d18151c47e318fe7acabdd616e6.png)
[leetcode] 547. Number of provinces (medium)
随机推荐
细数国产接口协作平台的六把武器!
《数字经济 科技向善》大咖对谈干货来啦
[book club issue 13] packaging format of audio and video files
迷惑的单片机矩阵按键
冲量在线出席2022数据要素安全流通论坛—政务领域专场,助力行业政务大数据建设创新发展
Annual comprehensive analysis of China's online video market in 2022
Cache与MMU管理
MATLAB 文件夹前面的+和@是干啥的 命名空间与函数的重载
OpenVINO整合TensorFlow实现推理加速
Understand the parental delegation model
相应通道无电压但ADC的值却在大幅变化且不等于0的可能原因
Microsoft Amazon layoffs, the economic crisis is getting closer...
强强协同,共拓发展!英特尔与太一物联举办 AI 计算盒聚合服务研讨会
每次读取一行字符串输入(有待补充)
startUMl
永州水质检测实验室建设:家具说明
Shell(3)
MySQL limit使用及超大分页问题解决
[meetup preview] openmldb + ONEFLOW: link feature engineering to model training to accelerate machine learning model development
LeetCode_位运算_中等_137.只出现一次的数字 II