基于AT89S51单片机制作的00-99计数器

版权申诉
5星 · 超过95%的资源 1 下载量 85 浏览量 更新于2024-10-04 1 收藏 22KB RAR 举报
资源摘要信息:"多功能按键_计数器_00-99多键_AT89开发一个_" 知识点: 1. AT89S51单片机:AT89S51是Atmel公司生产的一款基于8051内核的8位微控制器,具有4KB的内部程序存储空间、128字节的内部RAM、32个I/O口线、2个定时器/计数器、5个中断源、一个全双工串行口以及一个片上振荡器和时钟电路。它广泛应用于嵌入式系统的开发。 2. 轻触开关:轻触开关是一种小型的开关,具有按压式操作的特点,通常用于用户输入设备,如按钮、键盘等。 3. 计数器:计数器是一种能够记录输入脉冲数量的电子设备,常见于数字电路中,用于记录事件发生次数或测量时间长度。 4. 数码管:数码管是一种电子显示设备,能够显示数字和某些字符。共阴数码管是其中的一种类型,它的各个段接负极,共用一个阴极,通过控制各个段的阳极来显示不同的数字。 5. 多键控制:多键控制是指在设备中可以同时接入多个按键输入,通过程序控制可以实现多个功能。 6. P3.7管脚和P3.0管脚:在AT89S51单片机中,P3.7和P3.0是端口3的第7位和第0位,它们可以被配置为输入或输出,用于连接外部设备。 7. SP1和SP2:这两个轻触开关分别连接在AT89S51单片机的P3.7管脚和P3.0管脚,分别作为控制个位数和十位数的手动计数按钮。 8. P2.0-P2.7和P0.0-P0.7:这两个端口分别是AT89S51单片机的第二端口和零端口,它们被配置为输出,用于分别连接显示个位数和十位数的共阴数码管。 9. 00-99计数范围:该计数器设计用于计数0到99的数值。 10. 嵌入式系统开发:嵌入式系统开发通常涉及到硬件和软件的设计和集成,硬件部分包括单片机的外设接口和外围电路设计,软件部分涉及编写控制硬件行为的代码,通常使用C语言和汇编语言。 11. STARTUP.A51:这个文件是用于初始化AT89系列单片机的汇编语言文件,通常包含了一些启动代码和中断向量的定义。 12. UVGui.Administrator:UVGui.Administrator可能是用于管理项目和进行程序编译的IDE(集成开发环境)的管理员程序。 13. 实验八.c、实验八.uvopt、实验八.uvproj、Listings、Objects:这些文件是典型的项目文件,其中实验八.c包含了用于该计数器项目的C语言源代码,实验八.uvopt和实验八.uvproj文件可能包含了项目构建和优化相关的配置信息,Listings可能包含了编译后的源代码列表文件,而Objects则包含了编译后生成的目标文件和中间文件。 通过以上知识点的介绍,可以对该多功能按键计数器项目的设计思路、所需组件、以及如何与AT89S51单片机配合使用有较全面的理解。同时,对涉及的软件工程工具和资源文件有了更深入的认识。

void button_handler(struct Button* handle) { uint8_t read_gpio_level = handle->hal_button_Level(handle->button_id); //ticks counter working.. if((handle->state) > 0) handle->ticks++; /*------------button debounce handle---------------*/ if(read_gpio_level != handle->button_level) { //not equal to prev one //continue read 3 times same new level change if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) { handle->button_level = read_gpio_level; handle->debounce_cnt = 0; } } else { //leved not change ,counter reset. handle->debounce_cnt = 0; } /*-----------------State machine-------------------*/ switch (handle->state) { case 0: if(handle->button_level == handle->active_level) { //start press down handle->event = (uint8_t)PRESS_DOWN; EVENT_CB(PRESS_DOWN); handle->ticks = 0; handle->repeat = 1; handle->state = 1; } else { handle->event = (uint8_t)NONE_PRESS; } break; case 1: if(handle->button_level != handle->active_level) { //released press up handle->event = (uint8_t)PRESS_UP; EVENT_CB(PRESS_UP); handle->ticks = 0; handle->state = 2; } else if(handle->ticks > LONG_TICKS) { handle->event = (uint8_t)LONG_PRESS_START; EVENT_CB(LONG_PRESS_START); handle->state = 5; } break; case 2: if(handle->button_level == handle->active_level) { //press down again handle->event = (uint8_t)PRESS_DOWN; EVENT_CB(PRESS_DOWN); handle->repeat++; EVENT_CB(PRESS_REPEAT); // repeat hit handle->ticks = 0; handle->state = 3; } else if(handle->ticks > SHORT_TICKS) { //released timeout if(handle->repeat == 1) { handle->event = (uint8_t)SINGLE_CLICK; EVENT_CB(SINGLE_CLICK); } else if(handle->repeat == 2) { handle->event = (uint8_t)DOUBLe_CLICK; EVENT_CB(DOUBLe_CLICK); // repeat hit } handle->state = 0; } break; case 3: if(handle->button_level != handle->active_level) { //released press up handle->event = (uint8_t)PRESS_UP; EVENT_CB(PRESS_UP); if(handle->ticks < SHORT_TICKS) { handle->ticks = 0; handle->state = 2; //repeat press } else { handle->state = 0; } }else if(handle->ticks > SHORT_TICKS){ // long press up handle->state = 0; } break; case 5: if(handle->button_level == handle->active_level) { //continue hold trigger handle->event = (uint8_t)LONG_PRESS_HOLD; EVENT_CB(LONG_PRESS_HOLD); } else { //releasd handle->event = (uint8_t)PRESS_UP; EVENT_CB(PRESS_UP); handle->state = 0; //reset } break; default: handle->state = 0; //reset break; } }帮我详细注释这段代码

2023-06-09 上传