| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Динамическая индикация 9 разрядного индикатора по SPI-шине. https://radiokot.ru/forum/viewtopic.php?f=25&t=173166 |
Страница 1 из 1 |
| Автор: | iStarCom [ Ср окт 07, 2020 13:11:13 ] | ||
| Заголовок сообщения: | Динамическая индикация 9 разрядного индикатора по SPI-шине. | ||
Обсуждение к статье: Динамическая индикация 9 разрядного индикатора по последовательной шине. Немного поправил код для ATMEGA 328p (Arduino nano) и ост совместимые. А так же исправил принципиальную эл. схему, во вложении! СпойлерКод: // 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++; } } }
|
|||
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


