Форум закрыт для публикаций и работает только для чтения.
Отзывы о работе магазина и товарах просим оставлять на сайте интернет-магазина https://ekits.ru

SHD0028 - примеры

Обсуждение модулей. Любые вопросы по работе/сборке/стыковке модулей.
Ответить
ekits_sales
Администратор
Сообщения: 265
Зарегистрирован: 10 май 2009, 13:11
Контактная информация:

SHD0028 - примеры

Сообщение ekits_sales » 26 мар 2013, 14:32

Предлагаем ознакомиться с простым примером кода для использования дисплеев со сдвиговым регистром SHD0028
Пример показывает бегущую строку из всех возможных символов справа налево (от последнего к первому разряду).
Яркость циклически меняется от минимального к максимальному и обратно


/*****************************************************
Chip type : ATmega16
AVR Core Clock frequency: 8,000000 MHz
*****************************************************/

#include <mega16.h>
#include <delay.h>


#define IN PORTD.7 //Определение бита IN
#define CLOCK PORTD.6 //Определение бита CLOCK
#define LATCH PORTD.5 //Определение бита LATCH
#define ENABLE PORTD.4 //Определение бита ENABLE
#define BYTES 6 //Количество разрядов
unsigned char chars[BYTES] ={0,0,0,0,0,0}; //Массив разрядов

#define SYMBOLS_ARRAY_LENGTH 12 //Длина массива символов
unsigned char symbols[SYMBOLS_ARRAY_LENGTH]={ // Массив символов индикатора
252, // 0
96, // 1
218, // 2
242, // 3
102, // 4
182, // 5
190, // 6
224, // 7
254, // 8
246, // 9
1, // .
2 // -
};

#define MAX_BRIGHTNESS 32 //Максимальное значение яркости (0..MAX_BRIGHTNESS)
unsigned char brightness = MAX_BRIGHTNESS; //Яркость
unsigned char br_counter = 0; //Счетчик вызова прерывания для управления яркостью

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (br_counter <= brightness) ENABLE = 0;
else ENABLE = 1;
if (++br_counter > MAX_BRIGHTNESS) br_counter = 1;
}

void push_byte(unsigned char _byte){ //Отправить 1 байт в SERIAL_IN
unsigned char j;
for(j=0;j<8;j++){
CLOCK = 0;
IN = 1 & _byte;
_byte = _byte>>1;
CLOCK = 1;
}
}

void show(void) { //Показать текущие значения в массиве разрядов
unsigned char i;
for (i=0;i<BYTES;i++) {
push_byte(chars[ i ]);
}
LATCH = 1;
LATCH = 0;
}
void main(void)
{
unsigned char i,j;
unsigned char up=0;
PORTA=0x00;DDRA=0x00;
PORTB=0x00;DDRB=0x00;
PORTC=0x00;DDRC=0x00;
PORTD=0x00;DDRD=0xF0;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

brightness=1;
show();

// Global enable interrupts
#asm("sei")

// Пример показывает бегущую строку из всех возможных символов справа налево (от последнего к первому разряду).
// Яркость циклически меняется от минимального к максимальному и обратно
while(1) {
for (i=0; i<SYMBOLS_ARRAY_LENGTH; i++){
for (j=BYTES-1; j>0; j--){
chars[ j ]=chars[j-1];
}
chars[ 0 ] = symbols[ i ];
show();
if (brightness >= MAX_BRIGHTNESS) up=0;
if (brightness <= 1) up=1;
if (up) brightness++;
else brightness--;
delay_ms(25);
}
}
}

ekits_sales
Администратор
Сообщения: 265
Зарегистрирован: 10 май 2009, 13:11
Контактная информация:

Re: SHD0028 - примеры

Сообщение ekits_sales » 30 окт 2017, 09:44

В примеры исправлены ошибки с отображением [ i ].
Спасибо Александру за наблюдательность.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость