cuber18
Advanced Member level 4
Code:
//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;
char data1;
#include "bitmap.h"
//pos/speed switch inputs: PORTB<6:3> ;RB2 = SW_1 , sum value *8 !!
#define SPEEDMAX 10
//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() {
if ( RCREG < 0x20 ) {
if ( RCREG == 0x0D )
DisplayClear();
}
else if ( ++CharCnt < NextPos && CharCnt >= Firstpos ) {
if ( RCREG > 0x7f )
RCREG = '?';
*((char *)(buffer + (short)(CharCnt-FirstPos))) = RCREG - 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(400);
}
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();
TRISD = 0x00;
if ( !( mode = (char) STATICMODE ) ) { // 0 = scrolling mode
FirstPos = 0; //FirstPos
NextPos = BUFFERSIZE; //NextPos
scrollcnt = 0;
ScrollTime = SPEEDMAX;
}
else { //static mode
NextPos = FirstPos + 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 = 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();
//++charnum;
if (++ptr == endptr )
ptr = buffer;
} while (--charnum);
DisplayLine();
} while ( linenum );
} // end loop
}
here is the code i want to revised.. i want this code to scroll up and down and also scroll to right... im newbie to this code.. can someone help me with this.. thanks..
btw im using cathode rows and anode columns.. im using 74ls154 in my rows and 74hc595 in my columns.. my pixels is 10x40..