Здесь я просто расскажу, как я решил проблему вывода 8 и 9 цифры. Работать с этими микросхемами просто. Для того чтобы загрузить данные, устанавливаем, бит данных на выводе DS serial data input, и сдвигаем (загружаем) положительным импульсом SHcp shift register clock input. Для сохранения и вывода данных в регистре подаем положительный импульс на STcp storage register clock input. Неувязка получается при выводе 8 и 9 цифры. Индикатор здесь с общим катодом, чтобы включить, например 4 цифру, нужно загрузить число 0b11110111, при этом на выходе Q7′ будет сдвинутое значение из Q6, в данном случае 1, то, что нужно. Значение Q6 по положительному импульсу SHcp сдвигается в Q7′. При выводе восьмой цифры ноль сдвигается в Q7 и Q7′ (Q7’=1 0b10111111 Q7’=0 0b01111111), в итоге у нас включены 8 и 9 разряд, импульсом STcp сохраняем и выводим это значение, теперь если дать импульс SHcp копейка из Q6 переместится в Q7′, 9 разряд потушен. Для включения 9 разряда нужно загрузить число 0b11111111, вывести его импульсом STcp, затем загружаем в регистр нули до тех пор, пока ноль из Q6 не переместится в Q7′.
// WinAvr
#include <avr/io.h>
#include <avr/interrupt.h>
#define DATA PD5
#define SHIFT PD6
#define STORAGE PD7
#define PORTSERIAL PORTD
#define PORTBUT PORTD
#define PINBUT PIND
#define DDRSERIAL DDRD
#define button BIT(0)
#define BIT(bit) (1<<(bit))
unsigned char lcd_buffer[9]={0xEB, 0x48, 0x73, 0x7A, 0xD8, 0xBA, 0xBB, 0x73, 0x68};
//*************************************************************
void data_shift(unsigned char data)
{
// выводим бит данных, сдвигаем и так 8 раз.
unsigned char i=0;
for(i=8; i ; i--){
if (data & BIT(7) ) PORTSERIAL|=BIT(DATA); // выводим бит данных
else PORTSERIAL&=~BIT(DATA);
data<<=1;
PORTSERIAL|=BIT(SHIFT); // сдвиг данных
PORTSERIAL&=~BIT(SHIFT);
}
}
//*************************************************************
void num_out(unsigned char znmesto)
{
PORTSERIAL|=BIT(STORAGE);// выводы микросхем в Z состояние
data_shift(lcd_buffer[znmesto]);// загружаем символ в первый регистр
data_shift(~(1<<(znmesto)));// вывод знакоместа, символ сдвигается в второй регистр
// ~(1<<(znmesto)) - число в бит места (пример 0х3->0b11110111)
PORTSERIAL&=~BIT(STORAGE);
PORTSERIAL|=BIT(STORAGE); // сохранили
PORTSERIAL&=~BIT(STORAGE); // и вывели
if (znmesto==7){// 7 знакоместо
PORTSERIAL|=BIT(SHIFT);
PORTSERIAL&=~BIT(SHIFT);
//shift нужен потому что 0 переместился из Q6 в -Q7`
}
if (znmesto==8) data_shift(0x0);//9 разряд.
//Сейчас все выходы первого регистра уст в 1,
//загружаем регистр нулями в итоге -Q7 = 0, но не сохраняем.
PORTSERIAL&=~(BIT(DATA)|BIT(SHIFT)|BIT(STORAGE));
}
//*************************************************************
int main( void )
{
unsigned char i=0;
PORTSERIAL|=BIT(STORAGE);
DDRSERIAL=0xf0;
PORTBUT|=button;
TCCR0=3;
while(1){
TCNT0=127;
while( !(TIFR & BIT(TOIE0)) );// Задержка ~2ms
TIFR|=1;
//if ( !(PINBUT & button) ) //если включить то вывод цифры
{
//while ( !(PINBUT & button) );// будет только по нажатию
num_out(i);
if (++i>8) i=0;
}
}
}