目录

1.前言

1.1实验现象

1.2 项目资源

2.主要程序及解释

2.1中断中进行按键扫描

2.2 中断中进行数码管扫描

2.3中断中进行秒表的驱动

2.4主函数


1.前言

1.1实验现象

实验现象:按下K1并松开按键秒表开始计时,按下K2并松开按键秒表停止计时,按下K3并松开数据存储到AT24C02中,按下K4并松开读取AT24C02中存储的数据显示在数码管上;

1.2 项目资源

https://download.csdn.net/download/YLG_lin/86544425

2.主要程序及解释

本次实验用到数码管扫描;按键扫描;AT24C02;还有就是定时器;秒表在运行中按键与数码管都要用到定时器进行不断的定时扫描,但1个定时器只能有1个中断;为了解决这个问题,我们只需要在中断里不断调用按键扫描与数码管扫描这两个模块就ok了;

2.1中断中进行按键扫描

void Timer0_Routine() interrupt 1
{static unsigned int T0Count1,T0Count2,T0Count3;TL0 = 0x18;        //设置定时初值TH0 = 0xFC;        //设置定时初值(1ms)T0Count1++;if(T0Count1>=20){T0Count1=0;Key_Loop();    //20ms调用一次按键驱动函数}T0Count2++;if(T0Count2>=2){T0Count2=0;xianshi_Loop();//2ms调用一次数码管驱动函数}T0Count3++;if(T0Count3>=10){T0Count3=0;Sec_Loop(); //10ms调用一次数秒表驱动函数}
}
unsigned char Key_KeyNumber;/*** @brief  获取按键键码* @param  无* @retval 按下按键的键码,范围:0,1~4,0表示无按键按下*/
unsigned char Key(void)
{unsigned char Temp=0;Temp=Key_KeyNumber;Key_KeyNumber=0;return Temp;
}/*** @brief  获取当前按键的状态,无消抖及松手检测* @param  无* @retval 按下按键的键码,范围:0,1~4,0表示无按键按下*/
unsigned char Key_GetState()
{unsigned char KeyNumber=0;if(P3_1==0){KeyNumber=1;}if(P3_0==0){KeyNumber=2;}if(P3_2==0){KeyNumber=3;}if(P3_3==0){KeyNumber=4;}return KeyNumber;
}/*** @brief  按键驱动函数,在中断中调用* @param  无* @retval 无*/
void Key_Loop(void)
{static unsigned char NowState,LastState;LastState=NowState;               //按键状态更新NowState=Key_GetState();       //获取当前按键状态//如果上个时间点按键按下,这个时间点未按下,则是松手瞬间,以此避免消抖和松手检测if(LastState==1 && NowState==0){Key_KeyNumber=1;}if(LastState==2 && NowState==0){Key_KeyNumber=2;}if(LastState==3 && NowState==0){Key_KeyNumber=3;}if(LastState==4 && NowState==0){Key_KeyNumber=4;}
}

2.2 中断中进行数码管扫描

void Timer0_Routine() interrupt 1
{static unsigned int T0Count1,T0Count2,T0Count3;TL0 = 0x18;        //设置定时初值(1ms)TH0 = 0xFC;     //设置定时初值T0Count1++;if(T0Count1>=20){T0Count1=0;Key_Loop();   //20ms调用一次按键驱动函数}T0Count2++;if(T0Count2>=2){T0Count2=0;xianshi_Loop();//2ms调用一次数码管驱动函数}T0Count3++;if(T0Count3>=10){T0Count3=0;Sec_Loop(); //10ms调用一次数秒表驱动函数}
}
//数码管显示缓存区
unsigned char xianshi_Buf[9]={0,10,10,10,10,10,10,10,10};//数码管段码表
unsigned char xianshi_Table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};/*** @brief  设置显示缓存区* @param  Location 要设置的位置,范围:1~8* @param  Number 要设置的数字,范围:段码表索引范围* @retval 无*/
void xianshi_SetBuf(unsigned char Location,Number)
{xianshi_Buf[Location]=Number;
}/*** @brief  数码管扫描显示* @param  Location 要显示的位置,范围:1~8* @param  Number 要显示的数字,范围:段码表索引范围* @retval 无*/
void xianshi_Scan(unsigned char Location,Number)
{P0=0x00;              //段码清0,消影switch(Location)        //位码输出{case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=xianshi_Table[Number];  //段码输出
}/*** @brief  数码管驱动函数,在中断中调用* @param  无* @retval 无*/
void xianshi_Loop(void)
{static unsigned char i=1;xianshi_Scan(i,xianshi_Buf[i]);i++;if(i>=9){i=1;}
}

2.3中断中进行秒表的驱动

static 修饰的是静态变量;把值放到静态区,直到程序全部运行完毕才会销毁;

void Timer0_Routine() interrupt 1
{static unsigned int T0Count1,T0Count2,T0Count3;TL0 = 0x18;        //设置定时初值TH0 = 0xFC;        //设置定时初值(1ms)T0Count1++;if(T0Count1>=20){T0Count1=0;Key_Loop();    //20ms调用一次按键驱动函数}T0Count2++;if(T0Count2>=2){T0Count2=0;xianshi_Loop();//2ms调用一次数码管驱动函数}T0Count3++;if(T0Count3>=10){T0Count3=0;Sec_Loop(); //10ms调用一次数秒表驱动函数}
}
/*** @brief  秒表驱动函数,在中断中调用* @param  无* @retval 无*/
void Sec_Loop(void)
{if(RunFlag){MiniSec++;if(MiniSec>=100){MiniSec=0;Sec++;if(Sec>=60){Sec=0;Min++;if(Min>=60){Min=0;}}}}
}

2.4主函数

首先定时器进行初始化(设置初值,定时器工作模式等),在while循环中不断进行着按键扫描与数码管扫描;其中RunFlag 为启动标志位;AT24C02写周期需要延迟5ms,具体可以查看芯片手册;把分写进0地址,把秒写进1地址;Min/10取十位,Min%10取个位. . .

unsigned char KeyNum;
unsigned char Min,Sec,MiniSec;
unsigned char RunFlag;void main()
{Timer0_Init();while(1){KeyNum=Key();if(KeyNum==1)           //K1按键按下{RunFlag=!RunFlag; }if(KeyNum==2)            //K2按键按下{Min=0;                //分秒清0Sec=0;MiniSec=0;}if(KeyNum==3)            //K3按键按下{AT24C02_WriteByte(0,Min);  //将分秒写入AT24C02Delay(5);AT24C02_WriteByte(1,Sec);Delay(5);AT24C02_WriteByte(2,MiniSec);Delay(5);}if(KeyNum==4)         //K4按键按下{Min=AT24C02_ReadByte(0);  //读出AT24C02数据Sec=AT24C02_ReadByte(1);MiniSec=AT24C02_ReadByte(2);}xianshi_SetBuf(1,Min/10);   //设置显示缓存,显示数据xianshi_SetBuf(2,Min%10);xianshi_SetBuf(3,11);      //显示——xianshi_SetBuf(4,Sec/10);xianshi_SetBuf(5,Sec%10);xianshi_SetBuf(6,11);      //显示——xianshi_SetBuf(7,MiniSec/10);xianshi_SetBuf(8,MiniSec%10);}
}

使用定时器按键扫描数码管制作一个可存储数据的秒表相关推荐

  1. 51单片机c语言按键扫描程序,单片机按键扫描数码管显示C语言程序

    电子科学与技术 单片机按键扫描数码管显示C语言程序 按键扫描数码管显示程序共定义了6个键的功能:K1.K2.K3.K4以及K5.K8组成的一对复合键,其中K2,K3为连击键,K5为上档键.在正常工作模 ...

  2. C语言 按键抬起有效 代码,最好的按键扫描和消抖方法,适用于复合、长按、按下或抬起响应按键...

    刚参加工作的时候,看了一些同事采用的按键扫描和消抖方法,对比学校里和网上查到的按键处理,发现觉得不尽善尽美,有以下几点: 1. 消抖复杂,效率低.有人直接在电平判断后使用delay()函数,进行消抖, ...

  3. 51单片机按键扫描程序汇编程序(独立按键与矩阵按键)(使用定时器)(可移植的汇编程序)矩阵键盘控制两个led数码管(汇编语言)与UART通信总结(上)

    一,按键控制数码管 1四按键控制程序(汇编) (您的关注点赞是作者创作的最大动力哦) //******************************************************* ...

  4. 《ESP8266学习笔记》之 采用定时器内的按键扫描方法,摒弃传统的延时按键消抖

    简介:传统的按键扫描程序,大部分都是采用 delay_ms(5); 这样的语句来进行按键消抖,但当你把它放在你高速运行的程序中时,这5ms可能会拖慢你的成语运行,导致体验感受下降,因此,我便找到了新的 ...

  5. Proteus VSM Studio汇编 + 8位数码管+按键扫描

    Proteus VSM Studio汇编 + 8位数码管+按键扫描 Proteus构建演示 基于Proteus VSM Studio汇编代码(.asm) ;********************** ...

  6. LED数显低功耗驱动芯片VK16K33,低功耗数码管LED驱动IC-SOP28/24/20,多封装选择,带按键扫描功能,兼容市面16K33

    品牌:永嘉微电/VINKA 型号:VK16K33 封装:SOP28/24/20 年份:新年份 概述: VK16K33是一个内存映射和多功能LED控制器驱动程序.VK16K33有28SOP.24SOP和 ...

  7. 一个按键控制数码管的开和关_按键控制数码管

    按键控制数码管 1. 实验目标 拓展 FPGA 的应用,加强对 FPGA 设计原理的认识,提高 Quartus II 使用能力. 熟悉元件参数设置,学会仿真和下载到开发板调试,培养差错和排错的能力. ...

  8. 用四位led数码管作显示器的篮球比赛24秒计时器求c语言代码,单片机编程控制LED七段数码管作显示的篮球赛计时计分系统...

    本次设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统.系统应具有赛程定时设置,赛程时间暂停,及时刷新甲.乙双方的成绩以及赛后成绩暂存等功能. 内容包括:显示.键盘.时钟等内容设计 ...

  9. 51单片机按键控制数码管0~9_51单片机外部中断

    前面为大家介绍的点亮LED灯.数码管.按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯.操作数码管,那可真是大才小用了.这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将 ...

最新文章

  1. 火出圈!河南大学教授毕业典礼金句频现:躺平得了初一,躺平不到十五!
  2. app微信支付的集成步骤
  3. Mysql(1)——服务端与客户端建立连接
  4. base标签在ie6下的恶心问题
  5. Maven deploy部署jar到远程私服仓库
  6. python求三个数中最小(大)的元素
  7. oracle导出有分区表的用户,分区表导出导入
  8. java 类一定要声明成public_java测试题(四)--答案
  9. RN:Android 开发记录
  10. redis 下载安装 python 操作redis django 连接redis
  11. 软件构造过程与配置管理
  12. GameCenter接入
  13. 聚苯硫醚的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. html 百度天气,百度天气预报api
  15. 前端小案例--android机器人
  16. 嵌入式设计与开发项目-ADC键盘扫描程序设计
  17. 【安卓逆向】360加固-脱壳修复
  18. erp5开源制造业erp服装行业解决方案
  19. bios uefi_什么是UEFI,它与BIOS有何不同?
  20. python开发酷q插件gui_基于python和酷Q的QQ机器人开发实践(1)

热门文章

  1. 准确率98%的深度学习交通标志识别是如何做到的?
  2. ActionBar的简单使用
  3. 【mysql】- 初始化
  4. 千姬变服务器维护,《千姬变》新手攻略 让新手少走弯路
  5. 在多普达586手机设置彩信的接收
  6. 经典JsonPath表达式
  7. 腾讯天幕:荣获首届“IPv6技术应用创新大赛”全国总决赛优秀奖
  8. android手机ssh连接linux好用工具 JuiceSSH
  9. IE Canvas的颜色问题
  10. 【深度学习实验】第二次:Python财政收入影响因素分析及预测