|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 8:54 am
|
Страница 1 от 1
|
[ 13 мнения ] |
|
Скролиране на текст на led 8x8 матрица
| Автор |
Съобщение |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
 Скролиране на текст на led 8x8 матрица
Нещо не ми е ясно как става ?
вчера си направих една тестова платка по дадената схема но немога да се сетя как да накарам някой символ да се движи..
Ясно ми е , че трябва да е динамично, но как да се движи ? ако се сменят рязко буквите няма да се вижда добре...
|
| Вто Сеп 16, 2008 12:43 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Правиш си един буфер.Всяка колона ти отговаря на ред от буфера.Примерно имаш 8 колони -> буфер с 8 реда.Изписваш ги един по един 1 колона->1 ред,втора-> втори и така до 8.След което започваш да изписваш 1 колона -> 2 ред от буфера, 2 колона ->3 ти ред,... ,8 колона-> 1 ред т новата буква /цифра дето ще я изкарваш на таблото .Правиш си едно динамично шифтване 
|
| Вто Сеп 16, 2008 2:54 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
Ами... нещо като примерче ? 
|
| Вто Сеп 16, 2008 6:18 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Примерно имаш 5х8 поле и искащ да изобразиш някакви букви които се представят с масивите (ПРИМЕРНО) :
1-во число : (0x11,0x22,0x33,0x44,0x55)
2-ро число : (0x66,0x77,0x88,0x99,0xAA)
Примерно на порт А ги извеждаш и стробираш колоните от порт В
Последователноста ти е следната:
0х11;Строб;0х22;Строб;0х33;Строб;0х44;Строб;0х55;Строб; - дотука си изписал първото число и трябва част от първото да изчезне и да почне следващото,така де да тече надписа
0х22;Строб;0х33;Строб;0х44;Строб;0х55;Строб;0х66;Строб;
0х33;Строб;0х44;Строб;0х55;Строб;0х66;Строб;0х77;Строб;
0х44;Строб;0х55;Строб;0х66;Строб;0х77;Строб;0х88;Строб;
0х55;Строб;0х66;Строб;0х77;Строб;0х88;Строб;0х99;Строб;
0х66;Строб;0х77;Строб;0х88;Строб;0х99;Строб;0хАА;Строб; Тука вече си изписал следващото число нацяло и така нататъка със следващите букви/цифри.
|
| Вто Сеп 16, 2008 9:11 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
Да това го схванах
Но как ще остават буквите на дисплея ? Не трябва ли като при динамичната индикация да подавам последователно напрежение на всяка колона за около 2 мили секунди? ох... много ми е тъмно
изобщо не мога да си представя как става.
за динамичната индикация със 7 сегментни елемента си направих един масив
BYTE CONST LED_MAP[10] {0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000,0b10010000};
и си викам неговите елементи един по един и си рефрешвам сегментите:
#int_TIMER2
void TIMER2_isr(void)
{
dig_1=LED_MAP[k];
dig_2=LED_MAP[j];
dig_3=LED_MAP[i];
output_b(dig_1);
OUTPUT_low(PIN_A0);
delay_us(900);
OUTPUT_high(PIN_A0);
output_b(dig_2);
OUTPUT_low(PIN_A1);
delay_us(900);
OUTPUT_high(PIN_A1);
output_b(dig_3);
OUTPUT_low(PIN_A2);
delay_us(900);
OUTPUT_high(PIN_A2);
}
|
| Вто Сеп 16, 2008 11:39 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Ами ти си го правиш по същия начин като динамична индикация само дето ползваш тази хватка с буфера и отместването.Останалото си е 1:1 динамична индикация .
|
| Сря Сеп 17, 2008 8:30 am |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
BYTE CONST ver[9] = {0b11111110,0b11111110,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111,0b10111111,0b01111111};//refresh
BYTE CONST hor_V[9] = {0b00000000,0b11111100,0b00000010,0b00000001,0b00000010,0b11111100,0b00000000,0b00000000,0b00000000};//V
BYTE CONST hor_L[9] = {0b00000000,0b11111111,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000,0b00000000,0b00000000};//L
#define h_on OUTPUT_high(PIN_C4);
#define h_off OUTPUT_low(PIN_C4);
#define v_on OUTPUT_high(PIN_C5);
#define v_off OUTPUT_low(PIN_C5);
int i;
int j;
int k;
int t;
.........
........
.......
........
while (true)
{
for (k=0;k<8;k++)
{i++; j++;
OUTPUT_b(ver[i]);
v_on; v_off;
OUTPUT_b(hor[j]); // как да организирам тук да се сменят hor_L и hor_V?
h_on; h_off;
if (i==8){i=0;}
if (j==8){j=0;}
delay_ms(4);}
}
}
Пробвах с
int t;
t= hor_V;
OUTPUT_b(t[i]);
но не се получи....
|
| Чет Сеп 18, 2008 12:46 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
Дайте някакъв примерен код ,че се измъчих
вчера подкарах скролирането, но като стигне до края на матрицата буквата и се сбозва синхрона и става едно мазало..... до момента в който не се появи отново най-отпред
|
| Пет Сеп 19, 2008 1:02 pm |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
Заповядай, на Бейсик е но ще ориентираш в постановаката
|
| Пет Сеп 19, 2008 5:07 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
на С няма ли код ? 
|
| Пет Сеп 19, 2008 5:22 pm |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
Ами днес имам рожден ден и по принцип трябва да получавам подъръци а не обратно...  заповядай
 |  |  |  | Код: //PIC 8char dotmatrix, switchable to static-scrolling //prg lenght 1077 words, made by zuisti, 29.08.2007
//for a simple and fast PROTEUS simulation I am not using line drivers ! #define COMMON_CATHODE
#define BUFFERSIZE 56 //max. 54 chars (and 2 gap space) for scrolling message
char buffer[BUFFERSIZE]; //display buffer: 8 chars + 2 spaces(gap for scrolling)
char FirstPos, NextPos, CharCnt, ScrollTime;
char mode, scrollcnt, charnum, linenum, pattern;
char *ptr, *startptr, *endptr;
#include "bitmap.h"
//pos/speed switch inputs: PORTB<6:3> ;RB2 = SW_1 , sum value *8 !! #define SWITCHVALUE8 PORTB & 0b01111000 // in STATIC mode (cascadable): position in the received string // in SCROLLING mode: scrolling speed (smaller value is faster) #define SPEEDMAX 5
//Mode switch input: PORTA.4 ;RA4 (0: scrolling, 1: static) #define STATICMODE Porta.F4 //checked at start only
//Line decoder outputs: PORTA<2:0> ;RA0 = LSB #define DisableLines PORTA = 0b0111 //all 1, decoder outputs are active low
//Clock output: PORTB.0 ;RB0 //Data output: PORTB.7 ;RB7
//Store output: PORTA.3 (RA3), positive clock for shiftregs output storage #define StorePulse PORTA.F3 = 1; PORTA.F3 = 0 //setup for positive pulses #define PinInits PORTA.F3 = 0; PORTB.F0 = 0; PORTB.F7 = 0
/* ClockoutPatternBit(X): Data = pattern.FX followed by an positive clock pulse I am using here (too) a little asm, this is much shorter as the pure C */ #define ClockoutPatternBit(X) asm { btfsc _pattern, X }; \ asm { bsf PORTB, 7 }; \ PORTB.F0 = 1; PORTB.F0 = 0; \ PORTB.F7 = 0
//RX input: PORTB.1 ;RB1
//this is used in IT void DisplayClear(void) { DisableLines; CharCnt = BUFFERSIZE; //init the display buffer with zeroes do buffer[--CharCnt] = 0; while ( CharCnt ); --CharCnt; //= 255, the first received char increments it to zero ptr = startptr = buffer; }
void interrupt() { char ch = RCREG;
if ( ch < 0x20 ) { if ( ch == 0x0D ) DisplayClear(); } else if ( ++CharCnt < NextPos && CharCnt >= Firstpos ) { if ( ch > 0x7F ) ch = '?'; *((char *)(buffer + (short)(CharCnt-FirstPos))) = ch - 0x20; } }
void GetPatternAndOut() { #ifdef COMMON_CATHODE pattern = ~(bitmap[ (*ptr << 3)+ linenum ]); #else pattern = bitmap[ (*ptr << 3)+ linenum ]; #endif
ClockoutPatternBit(4); ClockoutPatternBit(3); ClockoutPatternBit(2); ClockoutPatternBit(1); ClockoutPatternBit(0); }
void DisplayLine(void) { DisableLines; StorePulse; PORTA = linenum; Delay_us(300); }
void HW_Init(void) {
CMCON = 0b00000111; // switch off comparators TRISA = 0b10110000; // 7, 5 and 4 PORTA pins are inputs
// Initialize USART module for receive (rx) only: TXSTA.BRGH = 1; SPBRG = 25; //9600 Bd at 4 M clock RCSTA = 0b10010000; // 8 bit, no parity asm {MOVF RCREG, 0}; asm {MOVF RCREG, 0}; //empty rx fifo in asm (short)
TRISB = 0b01111110; // only PORTB.0 and PORTB.7 are outputs }
void main(void) {
HW_Init(); PinInits; DisplayClear();
if ( !( mode = (char) STATICMODE ) ) { // 0 = scrolling mode FirstPos = 0; NextPos = BUFFERSIZE; scrollcnt = 0; ScrollTime = ( SWITCHVALUE8 ) + SPEEDMAX; } else { //static mode NextPos = ( FirstPos = SWITCHVALUE8 ) + 8; }
startptr = buffer; endptr = buffer + BUFFERSIZE; INTCON = 0xC0; PIE1 = 0x20; //enable global ITs and RX it
for ( ; ; ) { // main loop forever
//scrolling mode (mode = 0) ? if ( !mode && ++scrollcnt == ScrollTime ) { scrollcnt = 0; ScrollTime = ( SWITCHVALUE8 ) + SPEEDMAX; //check the speed sw again
//for a gap INTCON = 0; //disable IT if ( CharCnt < (BUFFERSIZE - 3) && startptr < ( buffer + CharCnt + 2 ) ) endptr = buffer + CharCnt + 3; INTCON = 0xC0; //enable IT
if ( ++startptr == endptr ) startptr = buffer; DisableLines; }
linenum = 7; do { --linenum; ptr = startptr; charnum = 8; do { GetPatternAndOut(); if (++ptr == endptr ) ptr = buffer; } while ( --charnum ); DisplayLine(); } while ( linenum );
} // end loop }
|  |  |  |  |
|
| Пет Сеп 19, 2008 7:28 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
мерси много и.....Честит Рожден Ден 
|
| Съб Сеп 20, 2008 12:54 pm |
|
 |
|
milenjs
Ранг: Форумен бог
Регистриран на: Сря Мар 08, 2006 2:12 pm Мнения: 2017 Местоположение: Котел
|
|
| Съб Сеп 20, 2008 1:19 pm |
|
|
|
Страница 1 от 1
|
[ 13 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 5 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|