Цитата:
Сообщение от ДмитрийТ
Эту микросхему я и использую. Данные этой микросхемы берутся в двух переменных hour и minut. Как их прикрутить к этой функции?
|
как-то так:
PHP код:
#include <spi.h>
#define SS PORTB.2
typedef unsigned char byte;
typedef unsigned long ulong;
byte led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
ulong dig_data=0;
byte dig_num=0; //Отображаемый разряд
//----------------------------------------------------//
char Hours = 0x00;
char DesHours =0x00;
char Minutes = 0x00;
char DesMinutes =0x00;
// тут забираем данные из часов DS1307
void GetTime (void){
Hours = DsReadHours();
Minutes = DsReadMinutes();
DesHours = Hours & (~((1<<7)|(1<<6)));
DesHours >>=4; // значения десятков часов
Hours &= (~((1<<7)|(1<<6)|(1<<5)|(1<<4))); // значения часов
DesMinutes = Minutes >>4; // Десятки минут
Minutes &= (~((1<<7)|(1<<6)|(1<<5)|(1<<4))); // Единицы минут
}
void show_dig() {
SS=0; //Ни чего не кажем
if (dig_num==16) { // пятый разряд
dig_num++;
}
spi(dig_num); //Отправляем байт для отображения разряда
if (dig_num == 1){
spi(led_table[DesHours]); //Получаем разряд из dig_data и отправляем
}
if (dig_num == 2){
spi(led_table[Hours]); //Получаем разряд из dig_data и отправляем
}
if (dig_num == 4){
spi(led_table[DesMinutes]); //Получаем разряд из dig_data и отправляем
}
if (dig_num == 8){
spi(led_table[Minutes]); //Получаем разряд из dig_data и отправляем байт с цифрой
dig_num<<=1; //Смещаем бит для отображения следующего разряда
SS=1; //Показываем разряд
}
void main(void) {
PORTB=0;
DDRB=0x2C; //Настраиваем порт для SPI
ACSR=0x80; //Отключаем компаратор
//Включаем SPI
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим
SPCR=0x70;
SPSR=0;
while (1) {
GetTime ();
show_dig(); //Показываем разряды
}
}
Ты только массив byte led_table подкорректируй под индикатор...ибо не понятно что там за какие знакоместа отвечает
хотя можно и без ДСки обойтись, повешать часовой кварц как тактирование таймера, поставить пред делитель, и по переполнению таймера в прерывание делать все черные дела