单片机源程序如下:
/**
*版权所有(c)2018,艁ukasz Marcin Podkalicki
*2009年12月13日
*简单定时器(启动/复位/停止),使用基于TM1637的一个按钮和7段显示模块。 *
*注意,这个ATtiny13项目使用的内部时钟并不精确
*时间可以向前或向后流动,但是嘿!
*它仍然足够做一个好的鸡蛋计时器:)
*/
//#include #include #include #include #include "tm1637.h" #define BUTTON_PIN PB2 #define TIMER_UPDATE (1 << 1) #define TIMER_STOP (1 << 2) #define TIMER_START (1 << 3) #define TIMER_RESET (1 << 4) static volatile uint8_t timer_counter; static volatile uint8_t timer_events; static volatile uint8_t timer_seconds; static volatile uint8_t timer_minutes; static volatile uint8_t timer_colon; static void timer_init(void); static void timer_handler(void); static void timer_process(void); static void timer_display(const uint8_t minutes, const uint8_t seconds, const uint8_t colon); ISR(TIM0_COMPA_vect) { timer_handler(); } int main(void) { /* setup */ timer_init(); /* loop */ while (1) { timer_process(); } } void timer_init(void) { TM1637_init(1, 4); DDRB &= ~_BV(BUTTON_PIN); //明确设置按钮针作为输入 PORTB |= _BV(BUTTON_PIN); // 设置按钮销的上拉电阻器 TCCR0A |= _BV(WGM01); // 将计时器计数器模式设置为CTC TCCR0B |= _BV(CS01)|_BV(CS00); // 将预分频器设置为64(CLK=1200000Hz/64/250=75Hz) OCR0A = 249; // 设置定时器计数器最大值(250-1) TIMSK |= _BV(OCIE0A);// 启用定时器CTC中断 timer_counter = timer_seconds = timer_minutes = 0; // 重置计数器 timer_events = TIMER_UPDATE | TIMER_RESET; // 重置计时器和更新显示 timer_colon = 1; // 显示冒号 sei(); //启用全局中断 } void timer_handler(void) { if (!(timer_events & TIMER_START)) { return; } timer_counter++; if (timer_counter == 38) { timer_colon = 1; timer_events |= TIMER_UPDATE; } else if (timer_counter == 75) { timer_colon = 0; timer_counter = 0; if (++timer_seconds == 60) { timer_seconds = 0; if (++timer_minutes == 100) { timer_minutes = 0; } } timer_events |= TIMER_UPDATE; } } void timer_process(void) { /* 过程启动/停止/重置 */ if ((PINB & _BV(BUTTON_PIN)) == 0) { _delay_ms(10); // 去噪时间 while((PINB & _BV(BUTTON_PIN)) == 0); if (timer_events & TIMER_START) { timer_colon = 1; timer_events = TIMER_UPDATE | TIMER_STOP; } else if (timer_events & TIMER_STOP) { timer_minutes = timer_seconds = 0; timer_colon = 1; timer_events = TIMER_UPDATE | TIMER_RESET; } else if (timer_events & TIMER_RESET) { timer_events = TIMER_START; } } /* 更新显示 */ if (timer_events & TIMER_UPDATE) { timer_display(timer_minutes, timer_seconds, timer_colon); timer_events &= ~TIMER_UPDATE; } } void timer_display(const uint8_t minutes, const uint8_t seconds, const uint8_t colon) { /* 显示分钟数*/ TM1637_display_digit(0, minutes / 10); TM1637_display_digit(1, minutes % 10); /* 显示秒数 */ TM1637_display_digit(2, seconds / 10); TM1637_display_digit(3, seconds % 10); /* 显示/隐藏冒号 */ TM1637_display_colon(colon); }
上一篇:MikroC写的ATmega16驱动spi接口128x64屏例子
下一篇:AT90S8515单片机SPI驱动74LS595源程序
推荐阅读
史海拾趣
随着国内市场的日益饱和,Asian Best Components Co Ltd开始将目光投向了广阔的国际市场。公司积极参加国际电子展会,与全球各地的客户建立了广泛的联系。通过深入了解不同市场的需求和特点,Asian Best不断调整产品策略,优化产品设计,成功打入多个国际市场。同时,公司还加强与国际同行的合作,共同推动电子行业的发展。
随着电子行业的快速发展和市场竞争的加剧,ETC公司面临着巨大的挑战。为了应对行业变革,公司决定进行转型升级。ETC加大了研发投入,积极探索新型晶体管技术,并成功推出了一系列高性能、低功耗的产品。同时,公司还加强了与上下游企业的合作,形成了完整的产业链。这些努力使ETC在激烈的市场竞争中保持了领先地位。
在市场竞争日益激烈的今天,Dau Semiconductor Inc公司深知只有不断创新和升级技术,才能保持市场竞争力。因此,公司不断加大对研发的投入,引进先进的设备和人才,探索新的技术方向。近年来,公司成功研发出了多款具有创新性的半导体芯片产品,如基于人工智能技术的智能芯片、基于物联网技术的低功耗传感器芯片等。这些产品的推出,不仅为公司带来了更多的商业机会,也为行业的发展注入了新的活力。
品质是Calex Mfg. Co., Inc.的生命线。公司始终坚持以品质为核心,从原材料采购到生产制造,再到产品出厂,每一个环节都严格把控。这种对品质的执着追求,使得公司的产品赢得了客户的信赖和好评。同时,公司还注重品牌建设,通过广告宣传和参展等方式,不断提升品牌知名度和影响力。
品质是Calex Mfg. Co., Inc.的生命线。公司始终坚持以品质为核心,从原材料采购到生产制造,再到产品出厂,每一个环节都严格把控。这种对品质的执着追求,使得公司的产品赢得了客户的信赖和好评。同时,公司还注重品牌建设,通过广告宣传和参展等方式,不断提升品牌知名度和影响力。
Califia Lighting公司的创立源于创始人对节能照明技术的深刻理解和前瞻视野。在电子照明行业快速发展的背景下,他们看到了LED照明技术的巨大潜力,并决定投身其中。凭借对技术的热爱和对市场的敏锐洞察,Califia Lighting成功研发出了一系列高性能的LED灯具和模块,为公司的起步奠定了坚实的基础。
每个人都有一个舒适区域,在这个区域内是很自我的,不愿意被打扰,不愿意被push,不愿意和陌生的面孔交谈,不愿意被人指责,不愿意按照规定的时限做事,不愿意主动的去关心别人,不愿意去思考别人还有什么没有想到。这在学生时代是很容易被理解的 ...… 查看全部问答∨ |
|
我用别人做好的一个板子,需要知道上面网卡的mac地址。这个地址最初是怎么决定的?由出厂芯片还是做硬件的人制定的(好像说要根据时序烧录进去)?可以根据芯片查到么?如果是做硬件的人制定,而他当时就没有烧mac地址进去,是不是网卡就不能用? ...… 查看全部问答∨ |
|
说来惭愧,小弟28了,想沉下心来作技术,想做一些unix/linux 底层驱动开发方面的学习,苦于无从下手,所以请教大家给小弟指点一下大致的学习步骤和建议,以前有一些浅薄的c语言毛皮基础,最近把《c primer plus》精读了几遍,目前正在看《unix环境 ...… 查看全部问答∨ |
在matlab FDATOOL里面设计一个15阶FIR滤波器,对系数进行量化 得到FIR滤波器系数,使用verilog进行实现 如何在modelsim里面进行仿真 O(∩_∩)O谢谢… 查看全部问答∨ |
各位大虾,本人刚刚接触STM32,有以下问题不明白,望大虾们指教! 看网上说STM32的嵌入式闪存即flash可以模拟做EEPROM,现在问题来了, 程序代码不是存在flash里面嘛,如果flash又模拟做 ...… 查看全部问答∨ |
|