蓝桥杯之单片机设计与开发(9)——独立按键实现计时器
功能:
1.按下S6,清零并停止计时
2.按下S5,暂停计时
3.按下S4,开始计时
计时时,LED为流水灯状态,计时显示格式为 分-秒-毫秒
main.c
/*******************************************************************************
* 文件名:main.c
* 描 述:1.按下S6,停止计时并清零2.按下S5,暂停计时3.按下S4,开始/继续计时
* 作 者:小默haa
* 版本号:v1.0.0
* 日 期: 2019年1月30日
* 备 注:独立按键控制LED流水灯
*
*******************************************************************************/
#include <STC15F2K60S2.H>
#include "sys.h"u8 sec = 0, min = 0; //分 秒
u16 point = 0; //毫秒
u8 Led_dat; //led显示状态
u8 KeySta[4] = {1,1,1,1}; //当前按键状态
u8 Key_backup[4] = {1,1,1,1}; //按键状态备份,保存前一次的按键值
u8 flag = 0;void main(void)
{u8 i;All_Init();Time0_Init();Time1_Init();Led_dat = 0x7f;EA = 1;while(1){for(i = 0;i < 4;i++){if(Key_backup[i] != KeySta[i]){if(Key_backup[i] == 0) //说明按键时弹起状态Key_Drive(i);Key_backup[i] = KeySta[i];}}Show_Num();}
}
sys.c
#include "sys.h"/*******************************************************************************
* 函数名 :All_Init
* 输入值 :无
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月15日
* 功能描述:外设初始化
* 备注 :关闭所有外设
*******************************************************************************/
void All_Init(void)
{P2 = (P2 & 0x1f) | 0x80; //打开Y4C(LED)P0 = 0xff; //关闭LEDP2 = (P2 & 0x1f) | 0xe0; //打开Y7C(数码管)P0 = 0xff; //关闭数码管P2 = (P2 & 0x1f) | 0xa0; //打开Y5CP0 = 0x00; //关闭蜂鸣器、继电器P2 = P2 & 0x1f; //关闭Y4C,Y5C,Y6C,Y7C
}//定时器0初始化
void Time0_Init(void)
{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x9a; //设置定时初值2msTH0 = 0xa9; //设置定时初值2msTF0 = 0; //清除TF0标志ET0 = 1; //允许定时器0中断TR0 = 1; //定时器0开始计时
}/*******************************************************************************
* 函数名 :Timer0
* 输入值 :无
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月30日
* 功能描述:定时器0中断服务程序
* 备注 :2ms执行一次按键扫描和数码管显示
*******************************************************************************/
void Timer0(void) interrupt 1
{Key_Scan();if (flag == 1)TR1 = 1;else if (flag == 2)TR1 = 0;else if (flag == 3){TR1 = 0;min = 0;sec = 0;point = 0;}Nixie_Scan();
}//定时器1初始化
void Time1_Init(void)
{AUXR |= 0x40; //定时器时钟1T模式TMOD &= 0x0F; //设置定时器模式TL1 = 0x9a; //设置定时初值2msTH1 = 0xa9; //设置定时初值2msTF1 = 0; //清除TF0标志ET1 = 1; //允许定时器0中断
}/*******************************************************************************
* 函数名 :Timer1
* 输入值 :无
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月30日
* 功能描述:定时器1中断服务程序
* 备注 :实现计时功能
*******************************************************************************/
void Timer1(void) interrupt 3
{static u16 t0 = 0;t0 ++;if(t0 % 5 == 0) //10ms{point ++;if(point == 100){sec ++;if(sec == 60){min ++;if(min == 60)min = 0;sec = 0;}point = 0;}if(t0 == 50) //100ms{Led_dat = _crol_(Led_dat, 1);Led_illume(Led_dat); //点亮LEDt0 = 0;}Show_Num();}
}
sys.h
#ifndef _SYS_H_
#define _SYS_H_typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;#include <stc15f2k60s2.h>
#include <intrins.h>//全局变量定义
#define FOSC 11059200L //系统时钟//外部变量
extern u8 sec, min;
extern u8 Led_dat, flag;
extern u8 KeySta[4],Key_backup[4];
extern u16 point;//sys.c
void All_Init(void);
void Time0_Init(void);
void Time1_Init(void);//led.c
void Led_illume(u8 dat);//key.c
sbit s4 = P3^3;
sbit s5 = P3^2;
sbit s6 = P3^1;
sbit s7 = P3^0;
void Key_Scan(void);
void Key_Drive(u8 key);//drive.c
sbit Relay = P0^4;
sbit Beep = P0^6;
void Drive_ON(void);
void Drive_OFF(void);//Nixie_tube.c
void Nixie_Scan(void);
void Nixie_Show(void);
void Show_Num(void);#endif
key.c
#include "sys.h"/*******************************************************************************
* 函数名 :Key_Scan
* 输入值 :无
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月20日
* 功能描述:独立按键扫描
* 备注 :检测按键状态(按下/松开)
*******************************************************************************/
void Key_Scan(void)
{u16 i;static u8 keybuff[] = {0xff,0xff,0xff,0xff};keybuff[0] = (keybuff[0] << 1) | s4;keybuff[1] = (keybuff[1] << 1) | s5;keybuff[2] = (keybuff[2] << 1) | s6;keybuff[3] = (keybuff[3] << 1) | s7;for(i = 0;i < 4;i ++){if(keybuff[i] == 0xff) //连续扫描8次都是1,16ms内都是弹起状态,按键已松开{KeySta[i] = 1;}else if(keybuff[i] == 0x00) //连续扫描8次都是0,16ms内都是按下状态,按键已按下{KeySta[i] = 0;}else //其他状态键值不稳定,不作处理{}}
}/*******************************************************************************
* 函数名 :Key_Drive
* 输入值 :有活动的按键 key
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月30日
* 功能描述:独立按键驱动
* 备注 :根据独立按键转态,执行相应操作
*******************************************************************************/
void Key_Drive(u8 key)
{switch(key){case 0: flag = 1; break;case 1: flag = 2; break;case 2: flag = 3; break;
// case 3: flag = 3; break;}
}
led.c
#include "sys.h"/*******************************************************************************
* 函数名 :Led_illume
* 输入值 :led数据
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月20日
* 功能描述:LED点亮程序
* 备注 :根据传输进来的数据值,点亮相应LED
*******************************************************************************/
void Led_illume(u8 dat)
{P2 = (P2 & 0x1f) | 0x80; //打开Y4C(LED)P0 = dat; //关闭LEDP2 = P2 & 0x1f;
}
Nixie_tube.c
/*******************************************************************************
* 文件名:Nixie_tube.c
* 描 述:数码管相关程序
* 作 者:小默haa
* 版本号:v1.0
* 日 期: 2019年1月28日
* 备 注:与数码管相关的所有函数
*
*******************************************************************************/
#include "sys.h"u8 code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管码字
u8 NixieBuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //数码管显示缓冲区,初值0xff确保启动时都不亮
u8 code Symbol[] = {0xff,0xbf}; //全灭,-u8 smg1 = 0, smg2 = 0, smg3 = 0, smg4 = 0, smg5 = 0, smg6 = 0, smg7 = 0, smg8 = 0;/*******************************************************************************
* 函数名 :Nixie_Scan
* 输入值 :无
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月29日
* 功能描述:数码管扫描函数
* 备注 :根据数码管显示数组,点亮数码管
*******************************************************************************/
void Nixie_Scan(void)
{static u8 index = 0;P2 = (P2 & 0x1f) | 0xe0; //数码管消隐P0 =0xff;P2 = (P2 & 0x1f) | 0xc0; //数码管片选P0 = 0x01 << index;P2 = (P2 & 0x1f) | 0xe0; //数码管段选P0 = NixieBuff[index];P2 &= 0x1f;index ++;index &= 0x07;
}/*******************************************************************************
* 函数名 :Nixie_Show
* 输入值 :无
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月29日
* 功能描述:数码管显示函数
* 备注 :根据每一位的数码管需要显示内容,选择相应码子存放进数码管显示数组
*******************************************************************************/
void Nixie_Show(void)
{NixieBuff[3] = Nixie[smg1];NixieBuff[2] = Nixie[smg2];NixieBuff[1] = Symbol[smg3];NixieBuff[0] = Nixie[smg4];NixieBuff[7] = Nixie[smg5];NixieBuff[6] = Symbol[smg6];NixieBuff[5] = Nixie[smg7];NixieBuff[4] = Nixie[smg8];
}/*******************************************************************************
* 函数名 :Show_Num
* 输入值 :无
* 返回值 :无
* 作者 :小默haa
* 时间 :2019年1月29日
* 功能描述:数值显示处理
* 备注 :将数值每一位分离,存放进每一位数码管显示指示变量smg中
*******************************************************************************/
void Show_Num(void)
{smg8 = point % 10;smg7 = point / 10;smg6 = 1;smg5 = sec % 10;smg4 = sec / 10;smg3 = 1;smg2 = min % 10;smg1 = min / 10;Nixie_Show();
}
蓝桥杯之单片机设计与开发(9)——独立按键实现计时器相关推荐
- 蓝桥杯之单片机设计与开发
目录 1.关于开发板 2.关于各个模块 3.历年省赛真题 4.省赛代码资源下载 5.历年国赛真题 6.国赛代码资源下载 7.第十届省赛前最后的总结与程序封装 8.第十届省赛再现 2021年1月26更新 ...
- 2020蓝桥杯之单片机设计与开发(1)——CT107D开发板了解与准备
在快放假期间开始准备蓝桥杯,也感谢我的好朋友带我一起去了解这个比赛. 首先从单片机开始,比赛的时候使用的开发板是官方指定的CT107D单片机竞赛板V20. 先看上面的官方指定开发版原理图,包含了开发板 ...
- 蓝桥杯之单片机设计与开发——第八届省赛_基于单片机的电子钟程序设计与调试
目前在准备蓝桥杯,自己写了往届的赛题,调试以后觉得没什么问题.希望大家能给出一些建议,指出其中的错误和不足,也真挚地希望能给大家提供一些方法和思路.共勉! 赛题 main.c #include < ...
- 蓝桥杯之单片机设计与开发(34)——第十届省赛前最后总结与程序封装
目录 上电全部初始化 LED 数码管显示 蜂鸣器buzzer 继电器relay 独立按键BTN 矩阵键盘KBD E2PROM和AD DS18B20 DS1302 超声波 明天就是省赛了,今天最后一天. ...
- 《蓝桥杯CT107D单片机竞赛板》:独立按键模块
独立按键模块 实验简介 实验原理图 实验原理 实验程序 按下独立键盘上每一个键,对应LED状态取反 按键值在数码管上显示 S4长按显示4,短按显示0,其他显示原来的键值 实验简介 CT107D单片机开 ...
- 蓝桥杯之单片机设计与开发(18)——模数转换A/D与数模转换D/A
A/D的主要指标 1.ADC的位数 一个n位的ADC表示这个ADC共有2的n次方个刻度.8位的ADC输出的是从0~255一共256个数字值,也就是个数据刻度.. 2.基准源 基准源也叫基准电压,是AD ...
- 蓝桥杯之单片机设计与开发(20)——DS1302
DS1302硬件信息 DS1302引脚图 DS1302典型电路 DS1302寄存器介绍 DS1302的一条指令一个字节共8位. 其中第7位(最高位)固定为1.这一位如果是0的话,那写进去也是无效的. ...
- 第十三届蓝桥杯《EDA设计与开发》赛后总结
目录 一,赛前准备 1.立创培训第一题 2.立创培训第二题 3.立创培训第三题 4.自选训练第一题 5.自选训练第二题 二,省赛 1.第12届蓝桥杯湖北省赛试题 2.第13届蓝桥杯山东省赛试题 3.第 ...
- 【蓝桥杯嵌入式】【STM32】12_2020_第十一届_蓝桥杯_嵌入式设计与开发项目_省赛
工程下载地址 这是比赛时写的工程,个人感觉写的不怎么样(仅供参考)但是功能算是实现的七七八八: https://gitee.com/Joseph_Cooper/blue-bridge-embedd ...
最新文章
- 一步一步学Silverlight 2系列(3):界面布局
- 推荐10个windows软件,让你的办公更高效
- Blueprint简介-Android10.0编译系统(六)
- Unidesk, Citrix 桌面虚拟化方案之新神器
- sql: TRIGGER
- 10 个让你笑的合不拢嘴的 GitHub 项目!
- Vue.js 技术揭秘学习 (1) new Vue 发生了什么
- 【转】利用matlab生成随机数函数
- 深入浅出数据库设计三范式
- 如何快速理解递归——看这个就可以了
- js 手机端触发事事件、javascript手机端/移动端触发事件
- python 打包成exe 程序的方法. 转
- spring mvc学习(1):spring jar包
- C/C++中static的用法全局变量与局部变量
- mysql hibernate 延迟_在mysql数据库中,hibernate一对多的集合的延迟加载无效
- 极客大学架构师训练营 加密技术 高可用系统的度量 高可用系统的架构 高可用系统的运维 第22课 听课总结
- git生成key以及小乌龟git不需要密码
- 用Python怎样实现Excel中的公式向下填充?
- java使用qq群发邮件_java群发发送qq邮件
- 计算机科学论文写作5-写硕士论文