Часики
/*******************************************
Program : MT-10T7-7T
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 8 MHz
*******************************************/
// Пример программы для сегментных индикаторов MT10T7
#include <avr/io.h>
#include <util/delay.h>
/*******************************************
MT-10T7-7T --- ATtiny2313
A0 --- PD5
WR2 --- GND
WR1 --- PD4
DB3 --- PD3
DB2 --- PD2
DB1 --- PD1
DB0 --- PD0
GND --- GND
V0 --- NC
+E --- VCC
*******************************************/
#define DDR_LCD_INIT() DDRD |= 0b00111111
#define PORT_LCD_INIT() PORTD &= 0b11000000
#define A0_SET() PORTD |= 0b00100000
#define A0_CLR() PORTD &= 0b11011111
#define WR1_SET() PORTD |= 0b00010000
#define WR1_CLR() PORTD &= 0b11101111
#define DB_CLR() PORTD &= 0b11110000
#define DB_SET(x) PORTD |= (x)
/*******************************************
a
---
| |
f| |b
| g |
---
| |
e| |c
| |
--- .h
d
0b00000001 g
0b00000010 e
0b00000100 d
0b00001000 a
0b00010000 h
0b00100000 b
0b01000000 c
0b10000000 f
*******************************************/
// Данные для заполнения индикатора
const unsigned char symbol[11] = {
0b11101110, // 0
0b01100000, // 1
0b00101111, // 2
0b01101101, // 3
0b11100001, // 4
0b11001101, // 5
0b11001111, // 6
0b11101000, // 7
0b11101111, // 8
0b11101101, // 9
0b00000000 // clear
};
// Процедура установки адреса для последующих операций записи
void SetAddr(unsigned char a)
{
A0_CLR(); // Будем записывать адрес
DB_CLR();
DB_SET(a); // Выдача 4-х битов индикатору в качестве адреса
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
}
// Процедура выдачи байта в индикатор
void WriteByte(unsigned char b)
{
A0_SET(); // Будем записывать данные
DB_CLR();
DB_SET(b & 0x0F); // Выдача индикатору младших 4-х битов
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
DB_CLR();
DB_SET(b >> 4); // Выдача индикатору старших 4-х битов
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
}
unsigned char time[10];
unsigned char hour = 0;
unsigned char minute = 0;
unsigned char second = 0;
int main( void )
{
// System Clock Prescaler initialization
// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000000;
// MT-10T7-7T initialization
DDR_LCD_INIT();
PORT_LCD_INIT();
SetAddr(0x0F); // Установить адрес для разблокировки шины индикатора
WriteByte(0xFF); // Разблокировать шину индикатора
unsigned char j;
while(1)
{
if( second == 60 )
{
second = 0;
minute += 1;
}
if( minute == 60 )
{
minute = 0;
hour += 1;
}
if( hour == 24 )
{
hour = 0;
}
time[0] = symbol[10];
time[1] = symbol[( hour / 10 )];
time[2] = symbol[( hour % 10 )];
time[3] = symbol[10];
time[4] = symbol[( minute / 10 )];
time[5] = symbol[( minute % 10 )];
time[6] = symbol[10];
time[7] = symbol[( second / 10 )];
time[8] = symbol[( second % 10 )];
time[9] = symbol[10];
SetAddr(0x00); // Установить адрес для записи данных изображения
for(j=0; j<10; j++) // Цикл вывода
{
WriteByte(time[j]); // Вывод очередного байта в индикатор
}
_delay_ms(1000);
second += 1;
}
return 0;
} Прикреплено изображение
(Отредактировано автором: 26 Сентября, 2011 - 16:34:25) |