- UID
- 373967
- 帖子
- 9048
- 主題
- 2609
- 精華
- 0
- 積分
- 1009
- 楓幣
- 64
- 威望
- 986
- 存款
- 36064
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 461 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-28
|
製作4位數字時鐘所需材料:
ATTiny13A微控制器
4個共陽極七段顯示器
4個220歐姆電阻
1個DS1302時鐘模塊
1個10K歐姆電阻
整合電路板
面包板
杜邦線
時刻校正按鈕
電源(通常使用5V USB電源)
ATTiny13A與七段顯示器的連接腳位:
七段顯示器腳位 ATTiny13A腳位
a PB0
b PB1
c PB2
d PB3
e PB4
f PB5
g PB6
dp PB7
com1 PD2
com2 PD3
com3 PD4
com4 PD5
時鐘模塊的連接腳位:
DS1302腳位 ATTiny13A腳位
VCC VCC
GND GND
CLK PB2
DAT PB1
RST PB0
時刻校正按鈕的連接腳位:
按鈕腳位 ATTiny13A腳位
接觸1 PB7
接觸2 GND
完整程式碼:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "ds1302.h"
#define F_CPU 1200000UL
volatile uint8_t display_buffer[4] = {0, 0, 0, 0};
volatile uint8_t digit_count = 0;
ISR(TIM0_COMPA_vect)
{
PORTD &= ~(0x3C);
PORTB = display_buffer[digit_count];
PORTD |= (1 << (digit_count + 2));
digit_count = (digit_count + 1) % 4;
}
void init_timer(void)
{
TCCR0A = (1 << WGM01);
OCR0A = 29;
TIMSK0 |= (1 << OCIE0A);
TCCR0B = (1 << CS02);
}
int main(void)
{
init_timer();
init_ds1302();
sei();
DDRB = 0xFF;
DDRD |= 0x3C;
while (1)
{
struct ds1302_time time;
ds1302_get_time(&time);
uint8_t hour = time.hour;
if (hour > 12)
hour -= 12;
display_buffer[0] = (hour / 10) | 0x80;
display_buffer[1] = (hour % 10);
display_buffer[2] = (time.minute / 10);
display_buffer[3] = (time.minute % 10);
if (bit_is_clear(PINB, 7))
{
ds1302_set_time(&time);
while (bit_is_clear(PINB, 7));
}
_delay_ms(100);
}
return 0;
} |
|