NerdKits - electronics education for a digital generation

You are not logged in. [log in]

NEW: Learning electronics? Ask your questions on the new Electronics Questions & Answers site hosted by CircuitLab.

Project Help and Ideas » String manipulation

October 12, 2011
by claesz
claesz's Avatar

This is really embarrassing, but C is not my strong side and I just got my NK the other day and though I'd test it out by making a scrolling text through string manipulation. I know there are many examples of LCD scrollers on this forum that are all much better and more efficient, and this was just meant as a bit of practice for me. The thing works (though I must be overwriting some null str termination somewhere as it from time to time it will mess itself up).

Now, my though was take a text string. Start by adding screen width number of spaces + text string. Only spaces will show. Next step add width-1 number of spaces + text. One letter will show, etc, etc. When number of spaces = 0, just write text+1, text+2 etc. If strlen less than screen width add spaces to fill up.

The principle works of course, all though it is a silly way of making a scroller. However, and finally I get to my question. The line //printline[21] = 'x'; has been commented out. In my mind that should actually add an x just off the screen every time (or next line if you don't cut off the string), since the print function will print from start of array until end. Here I must have misunderstood something in how C works, because in reality it will add an "x" as the first letter of the text-to-show string (the first 20 chrs are spaces) and move it along the whole screen as it scrolls. Originally I wanted to add a "0" to avoid writing a string so long that it continued on to the next line. For testing purposes I have put X there now. What am I misunderstanding?

I know this is not a NK question and I should have found a C forum to post this question in, but you guys seem friendly so I though I'd give it a shot.

/ initialload.c
// for NerdKits with ATmega168

#define F_CPU 14745600

#include <stdio.h>
#include <string.h>

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <inttypes.h>

#include "../libnerdkits/delay.h"
#include "../libnerdkits/lcd.h"

// PC2 -- RED LCD
// PC4 -- Switch to start stop scrolling

int main() {
    // LED as output
    FILE lcd_stream = FDEV_SETUP_STREAM(lcd_putchar, 0, _FDEV_SETUP_WRITE);

    int maxlen = 20;
    int waittime = 75;
    int startpos = maxlen;
    int i; // a counter
    int appendMe;
    char text[256] = "This is just a scrolling text.  Seems to work somehow."; //56+20
    char outstr[256];
    char printline[21];


    while(1) {
        i = 0;
        strcpy(outstr, "\0");
        strcpy(printline, "\0");
        while(i <= startpos) {
            strncat( outstr, " ", i); // adds spaces in front
        if (startpos<0) {
            strncat(outstr, text+(0-startpos), maxlen); // removes passed chrs from text. 0-x to make pos
            outstr[maxlen+1] = '\0'; // nullzero. If maxlen less than outstr, strncpy will not nullterminate
        } else {
            strncat(outstr, text, maxlen); // adds text to preceeding spaces
            outstr[maxlen+1] = '\0'; // nullzero. If maxlen less than outstr, strncpy will not nullterminate                            
        strncpy(printline, outstr, maxlen);  // puts everything into a nice output array with a max 20 len 
        //printline[21] = 'x'; // nullzero. If maxlen less than outstr, strncpy will not nullterminate
        if (strlen(printline) < 1) {        
            startpos = maxlen; // all text used, restart
                fprintf_P(&lcd_stream, PSTR("Restart"));
        if (strlen(printline) < (maxlen)) {  // if there is still space on the line after printing the remaining text
            appendMe = maxlen - (strlen(printline));
            strncat(printline, "                                         ", appendMe); // basically adds enough space to cover the EOL      

        fputs(printline, &lcd_stream); // prints string             

    return 0;
October 12, 2011
by claesz
claesz's Avatar

Sorry. I obviously posted this in the wrong forum. I can't move it so I will post again in the right "C programming" forum. My apologies.

Post a Reply

Please log in to post a reply.

Did you know that hobby servos are controlled through a particular kind of PWM (Pulse Width Modulation) signal? Learn more...