洪嵐峰 發表於 2023-4-2 09:20:33

ATTiny13A製作4位數字時鐘

製作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 = {0, 0, 0, 0};
volatile uint8_t digit_count = 0;

ISR(TIM0_COMPA_vect)
{
  PORTD &= ~(0x3C);
  PORTB = display_buffer;
  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 = (hour / 10) | 0x80;
    display_buffer = (hour % 10);
    display_buffer = (time.minute / 10);
    display_buffer = (time.minute % 10);

    if (bit_is_clear(PINB, 7))
    {
      ds1302_set_time(&time);
      while (bit_is_clear(PINB, 7));
    }

    _delay_ms(100);
  }

  return 0;
}
頁: [1]
查看完整版本: ATTiny13A製作4位數字時鐘