Отговори на тема  [ 13 мнения ] 
Скролиране на текст на led 8x8 матрица 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 27, 2006 6:23 pm
Мнения: 162
Местоположение: Севлиево
Мнение Скролиране на текст на led 8x8 матрица
Нещо не ми е ясно как става ?
вчера си направих една тестова платка по дадената схема но немога да се сетя как да накарам някой символ да се движи..
Ясно ми е , че трябва да е динамично, но как да се движи ? ако се сменят рязко буквите няма да се вижда добре...


Прикачени файлове:
picxie2schem.gif
picxie2schem.gif [ 15.54 KiB | Прегледано 1446 пъти ]
Вто Сеп 16, 2008 12:43 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Правиш си един буфер.Всяка колона ти отговаря на ред от буфера.Примерно имаш 8 колони -> буфер с 8 реда.Изписваш ги един по един 1 колона->1 ред,втора-> втори и така до 8.След което започваш да изписваш 1 колона -> 2 ред от буфера, 2 колона ->3 ти ред,... ,8 колона-> 1 ред т новата буква /цифра дето ще я изкарваш на таблото .Правиш си едно динамично шифтване :)


Вто Сеп 16, 2008 2:54 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 27, 2006 6:23 pm
Мнения: 162
Местоположение: Севлиево
Мнение 
Ки4о написа:
Правиш си един буфер.Всяка колона ти отговаря на ред от буфера.Примерно имаш 8 колони -> буфер с 8 реда.Изписваш ги един по един 1 колона->1 ред,втора-> втори и така до 8.След което започваш да изписваш 1 колона -> 2 ред от буфера, 2 колона ->3 ти ред,... ,8 колона-> 1 ред т новата буква /цифра дето ще я изкарваш на таблото .Правиш си едно динамично шифтване :)

Ами... нещо като примерче ? :)


Вто Сеп 16, 2008 6:18 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 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
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Ами ти си го правиш по същия начин като динамична индикация само дето ползваш тази хватка с буфера и отместването.Останалото си е 1:1 динамична индикация .


Сря Сеп 17, 2008 8:30 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 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
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 27, 2006 6:23 pm
Мнения: 162
Местоположение: Севлиево
Мнение 
Дайте някакъв примерен код ,че се измъчих :)
вчера подкарах скролирането, но като стигне до края на матрицата буквата и се сбозва синхрона и става едно мазало..... до момента в който не се появи отново най-отпред


Пет Сеп 19, 2008 1:02 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 08, 2006 2:12 pm
Мнения: 2017
Местоположение: Котел
Мнение 
Заповядай, на Бейсик е но ще ориентираш в постановаката ;)
Код:
'****************************************************************
'*  Name    : scroll8ch.BAS                                      *
'*  Author  : zuisti                                            *
'*  Date    : 2007.09.04.                                       *
'*  Version : 1.0  (1044 words)                                             *
'****************************************************************

        Device = 16F628A
        XTAL = 4

        OPTIMISER_LEVEL = 3

        ' max. 54 chars (and 2 spaces for gap) buffer for scrolling message
        Symbol BUFFERSIZE 56
        Dim buffer[BUFFERSIZE] As Byte

        Dim bitmap_index As Word

        Dim FirstPos As Byte
        Dim NextPos  As Byte
        Dim CharCnt  As Byte

        Dim ScrollTime As Byte
        Dim scrollcnt  As Byte

        Dim mode    As Byte
        Dim charnum As Byte
        Dim linenum As Byte
        Dim pattern As Byte

        Dim idx      As Byte
        Dim startidx As Byte
        Dim endidx   As Byte

        Dim ch As Byte  'used only under interrupt: received char

        Symbol LINEPORT PORTA ' outputs for Line decoder: PORTA<2:0> ;RA0 = LSB
        Symbol LINES_OFF 7    ' decoder IC output 7 is "free", 0...6 are use

        ' Mode switch input: PORTA.4 ;RA4   (0: scrolling, 1: static)
        Symbol MODESWITCH PORTA.4

        Symbol CLOCK_PIN PORTB.0   ' for shift regs clocking in
        Symbol DATA_PIN  PORTB.7   ' the data itself
        Symbol STORE_PIN PORTA.3   ' clock the shift reg's output storage

        Symbol PORT_POS_SWITCH PORTB      ' pos/speed switch inputs: PORTB<6:3>
        Symbol MASK_POS_SWITCH %01111000  ' RB3 = SW_1 , sum value *8 !!
        Symbol SPEEDMAX 5                 ' fastest scroll if the speed switch 0

    Declare FSR_CONTEXT_SAVE = On ' indirect addressing is used under IT too

    ON_HARDWARE_INTERRUPT GoTo SerialIT ' receive only !

' ***************** Program starts here

    GoSub HW_Init

    ' setup for positive pulses:
    STORE_PIN = 0 : CLOCK_PIN = 0 : DATA_PIN = 0
    GoSub DisplayClear
    mode = MODESWITCH
    FirstPos = PORT_POS_SWITCH & MASK_POS_SWITCH ' value * 8
    If mode = 0 Then        ' scroll
        scrollcnt = 0
        ScrollTime = FirstPos + SPEEDMAX
        FirstPos = 0
        NextPos = BUFFERSIZE
    Else                    ' static               
        NextPos = FirstPos + 8
    EndIf
    startidx = 0
    endidx = BUFFERSIZE
    INTCON = $C0 : PIE1 = $20 'enable global ITs and RX it

    While 1=1  ' main loop (forever)

        If mode = 0 Then ' in scrolling mode only
            Inc scrollcnt
            If scrollcnt = ScrollTime Then
                scrollcnt = 0
                ScrollTime = (PORT_POS_SWITCH & MASK_POS_SWITCH) + SPEEDMAX
                Disable ' IT
                ' for a scrolling gap
                If CharCnt < (BUFFERSIZE - 3) Then
                    If startidx < ( CharCnt + 2 ) Then
                        endidx = CharCnt + 3                       
                    End If
                End If
                Enable ' IT   
                Inc startidx
                If startidx = endidx Then startidx = 0
                LINEPORT = LINES_OFF ' disable lines               
            End If
        End If

        linenum = 7 ' line loop
        Repeat
            Dec linenum
            idx = startidx
           
            charnum = 8 ' character loop
            Repeat
                GoSub GetPatternAndOut       
                Inc idx
                If idx = endidx Then idx = 0
                Dec charnum
            Until charnum = 0 ' end of character loop               

            LINEPORT = LINES_OFF           ' disable lines
            STORE_PIN = 1 : STORE_PIN = 0  ' store  pulse
            LINEPORT = linenum             ' switch on the actual line
            DelayUS 250
        Until linenum = 0 ' end of line loop               
   
    Wend  ' end of main loop

' ************ subroutines

SerialIT:

        ch = RCREG ' read the received char
        If ch < 32 Then
            If ch = 13 Then GoSub DisplayClear
        Else
            Inc CharCnt
            If ch > $7F Then ch = "?"
            ch = ch - 32
            If  CharCnt < NextPos Then If CharCnt >= FirstPos Then buffer[CharCnt - FirstPos] = ch
        EndIf                                 

    Context Restore ' return from interrupt with restore regs

HW_Init:

        CMCON = %00000111 ' switch off comparators
        TRISA = %10110000 ' 7, 5 and 4 PORTA pins are inputs

        ' Initialize USART module for receive (RX) only:
       TXSTA.2 = 1 'BRGH 
        SPBRG = 25 '9600 Bd at 4 M clock
        RCSTA = %10010000           ' 8 bit, no parity
        ch = RCREG : ch = RCREG     ' empty rx fifo

        TRISB = %01111110           ' only PORTB.0 and PORTB.7 are outputs

    Return ' Hw_init

DisplayClear:

        LINEPORT = LINES_OFF 'disable lines
        CharCnt = BUFFERSIZE
        Repeat
            Dec CharCnt
            buffer[CharCnt] = 0
        Until CharCnt = 0
        Dec CharCnt
        idx = 0
        startidx = 0

    Return ' DisplayClear

GetPatternAndOut:

        bitmap_index = buffer[idx] * 8 ' 8 byte/char in bitmap table (for easier computing)
        pattern = LRead8 bitmap[bitmap_index + linenum] ' 7 bite as line pattern (first the 0)
        pattern = ~pattern ' only if we are using common cathode displays in Proteus

        'out the low 5 bits of pattern       
        If pattern.4 = 1 Then DATA_PIN = 1
        CLOCK_PIN = 1 : CLOCK_PIN = 0: DATA_PIN = 0 ' out a clock pulse and restore data pin to 0
        If pattern.3 = 1 Then DATA_PIN = 1
        CLOCK_PIN = 1 : CLOCK_PIN = 0: DATA_PIN = 0
        If pattern.2 = 1 Then DATA_PIN = 1
        CLOCK_PIN = 1 : CLOCK_PIN = 0: DATA_PIN = 0
        If pattern.1 = 1 Then DATA_PIN = 1
        CLOCK_PIN = 1 : CLOCK_PIN = 0: DATA_PIN = 0
        If pattern.0 = 1 Then DATA_PIN = 1
        CLOCK_PIN = 1 : CLOCK_PIN = 0: DATA_PIN = 0

    Return ' GetPatternAndOut

    Include "bitmap.inc"    ' LDATA table, lenght = 300H

' ********************
    'Stop ' end of program



Пет Сеп 19, 2008 5:07 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 27, 2006 6:23 pm
Мнения: 162
Местоположение: Севлиево
Мнение 
на С няма ли код ? :)


Пет Сеп 19, 2008 5:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 08, 2006 2:12 pm
Мнения: 2017
Местоположение: Котел
Мнение 
Ами днес имам рожден ден и по принцип трябва да получавам подъръци а не обратно... :D :D :D заповядай
Код:
//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
}


Прикачени файлове:
PIC_Scroll_C.rar [19.73 KiB]
141 пъти
Пет Сеп 19, 2008 7:28 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 27, 2006 6:23 pm
Мнения: 162
Местоположение: Севлиево
Мнение 
мерси много и.....Честит Рожден Ден :)


Съб Сеп 20, 2008 12:54 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 08, 2006 2:12 pm
Мнения: 2017
Местоположение: Котел
Мнение 
Благодаря, ето още нещо на С но за AVR - http://www.ee.oulu.fi/~zyc/LedDisp/#hardware


Съб Сеп 20, 2008 1:19 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни