Ср окт 07, 2020 13:11:13
// WinAvr
// Fix by iStarCom 2020 for ATMEGA328P.
#include <avr/io.h>
#include <avr/interrupt.h>
#define DATA 5
#define SHIFT 6
#define STORAGE 7
#define PORTSERIAL PORTD
#define DDRSERIAL DDRD
#define BUT 0
#define BIT(bit) (1<<(bit))
unsigned char lcd_buffer[9] = {0xEB, 0x48, 0x73, 0x7A, 0xD8, 0xBA, 0xBB, 0x68, 0xFB}; // РУСЬ 27 (ОК)
//unsigned char lcd_buffer[9] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F}; // СТАНДАРТ (ОК)
//*************************************************************
void data_shift(unsigned char data)
{
// выводим бит данных, сдвигаем и так 8 раз.
unsigned char i = 0;
for (i = 8; i ; i--) {
if (data & BIT(i - 1) ) PORTSERIAL |= BIT(DATA); // выводим бит данных
else PORTSERIAL &= ~BIT(DATA);
PORTSERIAL |= BIT(SHIFT); // сдвиг данных
PORTSERIAL &= ~BIT(SHIFT);
}
}
//*************************************************************
void num_out(unsigned char znmesto)
{
unsigned char i = 0;
PORTSERIAL |= BIT(STORAGE); // выводы микросхем в Z состояние
data_shift(lcd_buffer[znmesto]);// загружаем символ в первый регистр
if (znmesto == 7) i = 1; //7 знакоместо
if (znmesto == 8) i = 2; //8 знакоместо
znmesto = ~(1 << (znmesto)); // число в бит места (пример 0х3->0b11110111)
data_shift(znmesto);// вывод знакоместа, символ сдвигается в второй регистр
if ( i == 0 )
{
PORTSERIAL &= ~BIT(STORAGE);
PORTSERIAL |= BIT(STORAGE); // сохранили
PORTSERIAL &= ~BIT(STORAGE); // и вывели
}
else if (i >= 1) { // 7 знакоместо
PORTSERIAL &= ~BIT(STORAGE);
PORTSERIAL |= BIT(SHIFT) | BIT(STORAGE); // сохранили и вывели
PORTSERIAL &= ~(BIT(SHIFT) | BIT(STORAGE));
//shift нужен потому что 0 переместился из Q6 в -Q7
}
if (i == 2) data_shift(0x0); //9 разряд.
//Сейчас все выходы первого регистра уст в 1,
//загружаем регистр нулями в итоге -Q7 = 0, но не сохроняем.
PORTSERIAL &= ~(BIT(DATA) | BIT(SHIFT) | BIT(STORAGE));
}
//*************************************************************
int main( void )
{
unsigned char i = 0;
PORTSERIAL = BIT(BUT) | BIT(STORAGE);
DDRSERIAL = 0xf0;
TCCR0B = 3;
while (1) {
TCNT0 = 127;
while (!(TIFR0 & BIT(0))); // Задержка такая :-) по идеи 2ms
TIFR0 |= 1;
// if ( !bitRead(PIND, BUT) ) //если включить то вывод цифры
{
// while ( !bitRead(PIND, BUT) ); // будет только по нажатию
if (i > 8) i = 0;
num_out(i);
i++;
}
}
}