CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

HDSP2002 5x7 display code problems

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
CMatic



Joined: 11 Jan 2012
Posts: 69

View user's profile Send private message

HDSP2002 5x7 display code problems
PostPosted: Wed Mar 26, 2014 8:34 pm     Reply with quote

Hi,

The program below displays a text string message on a 4 characters old 5x7 matrix display (HDSP2002) made by HP in 1979. This display has a 28 bit SIPO (serial in parallel out) register which takes in data and then shifts the bits in parallel. There are 5 columns which are refreshed one byte per column (although the 8th bit is not used), hence 5x7.

The problem is that my message only displays the first character on the display and all others are garbled, don't know why? Please help.

Here is my program on PIC16F877a.

Thanks very much.
Code:

/***********************************************************************//
//                  HCMS 2002 5x7 High Efficiency RED Display
//                  File: HCMS2002V1

//Compiler CCS C PCWHD Version 4.126 Limited Edition(Evaluation)
//
//***********************************************************************//
#include <16F877a.h>
#device PASS_STRINGS=IN_RAM
#FUSES NOWDT, HS,NOPUT,NOPROTECT,NOBROWNOUT, NOLVP,NOCPD,NOWRT, NODEBUG
#use delay(clock=20000000)       // setup for internal 4mghz oscillator
//#include <stdlib.h>

//******************** Display Columns on Port B*************************//
#define COL1   PIN_B3
#define COL2   PIN_B4     
#define COL3   PIN_B5
#define COL4   PIN_B6
#define COL5   PIN_B7

//******************** Display Controls lines
#define DIN    PIN_D0
#define CLK    PIN_D1
#define VB     PIN_D2
#define LED    PIN_D3
//********************Declare Function Names
void writedata(int data);
void lcdStr(char *);

int temp;

const char FONTLOOKUP [][5]= {
    { 0x00, 0x00, 0x00, 0x00, 0x00 },   /* space *///Table starts at 32
    { 0x00, 0x00, 0x2f, 0x00, 0x00 },   /* ! */
    { 0x00, 0x07, 0x00, 0x07, 0x00 },   /* " */
    { 0x14, 0x7f, 0x14, 0x7f, 0x14 },   /* # */
    { 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   /* $ */
    { 0xc4, 0xc8, 0x10, 0x26, 0x46 },   /* % */
    { 0x36, 0x49, 0x55, 0x22, 0x50 },   /* & */
    { 0x00, 0x05, 0x03, 0x00, 0x00 },   /* ' */
    { 0x00, 0x1c, 0x22, 0x41, 0x00 },   /* ( */
    { 0x00, 0x41, 0x22, 0x1c, 0x00 },   /* ) */
    { 0x14, 0x08, 0x3E, 0x08, 0x14 },   /* * */
    { 0x08, 0x08, 0x3E, 0x08, 0x08 },   /* + */
    { 0x00, 0x00, 0x50, 0x30, 0x00 },   /* , */
    { 0x10, 0x10, 0x10, 0x10, 0x10 },   /* - */
    { 0x00, 0x60, 0x60, 0x00, 0x00 },   /* . */
    { 0x20, 0x10, 0x08, 0x04, 0x02 },   /* / */
    { 0x3E, 0x51, 0x49, 0x45, 0x3E },   /* 0 */
    { 0x00, 0x42, 0x7F, 0x40, 0x00 },   /* 1 */
    { 0x42, 0x61, 0x51, 0x49, 0x46 },   /* 2 */
    { 0x21, 0x41, 0x45, 0x4B, 0x31 },   /* 3 */
    { 0x18, 0x14, 0x12, 0x7F, 0x10 },   /* 4 */
    { 0x27, 0x45, 0x45, 0x45, 0x39 },   /* 5 */
    { 0x3C, 0x4A, 0x49, 0x49, 0x30 },   /* 6 */
    { 0x01, 0x71, 0x09, 0x05, 0x03 },   /* 7 */
    { 0x36, 0x49, 0x49, 0x49, 0x36 },   /* 8 */
    { 0x06, 0x49, 0x49, 0x29, 0x1E },   /* 9 */
    { 0x00, 0x36, 0x36, 0x00, 0x00 },   /* : */
    { 0x00, 0x56, 0x36, 0x00, 0x00 },   /* ; */
    { 0x08, 0x14, 0x22, 0x41, 0x00 },   /* < */
    { 0x14, 0x14, 0x14, 0x14, 0x14 },   /* = */
    { 0x00, 0x41, 0x22, 0x14, 0x08 },   /* > */
    { 0x02, 0x01, 0x51, 0x09, 0x06 },   /* ? */
    { 0x32, 0x49, 0x59, 0x51, 0x3E },   /* @ */
    { 0x7E, 0x11, 0x11, 0x11, 0x7E },   /* A */
    { 0x7F, 0x49, 0x49, 0x49, 0x36 },   /* B */
    { 0x3E, 0x41, 0x41, 0x41, 0x22 },   /* C */
    { 0x7F, 0x41, 0x41, 0x22, 0x1C },   /* D */
    { 0x7F, 0x49, 0x49, 0x49, 0x41 },   /* E */
    { 0x7F, 0x09, 0x09, 0x09, 0x01 },   /* F */
    { 0x3E, 0x41, 0x49, 0x49, 0x7A },   /* G */
    { 0x7F, 0x08, 0x08, 0x08, 0x7F },   /* H */
    { 0x00, 0x41, 0x7F, 0x41, 0x00 },   /* I */
    { 0x20, 0x40, 0x41, 0x3F, 0x01 },   /* J */
    { 0x7F, 0x08, 0x14, 0x22, 0x41 },   /* K */
    { 0x7F, 0x40, 0x40, 0x40, 0x40 },   /* L */
    { 0x7F, 0x02, 0x0C, 0x02, 0x7F },   /* M */
    { 0x7F, 0x04, 0x08, 0x10, 0x7F },   /* N */
    { 0x3E, 0x41, 0x41, 0x41, 0x3E },   /* O */
    { 0x7F, 0x09, 0x09, 0x09, 0x06 },   /* P */
    { 0x3E, 0x41, 0x51, 0x21, 0x5E },   /* Q */
    { 0x7F, 0x09, 0x19, 0x29, 0x46 },   /* R */
    { 0x46, 0x49, 0x49, 0x49, 0x31 },   /* S */
    { 0x01, 0x01, 0x7F, 0x01, 0x01 },   /* T */
    { 0x3F, 0x40, 0x40, 0x40, 0x3F },   /* U */
    { 0x1F, 0x20, 0x40, 0x20, 0x1F },   /* V */
    { 0x3F, 0x40, 0x38, 0x40, 0x3F },   /* W */
    { 0x63, 0x14, 0x08, 0x14, 0x63 },   /* X */
    { 0x07, 0x08, 0x70, 0x08, 0x07 },   /* Y */
    { 0x61, 0x51, 0x49, 0x45, 0x43 },   /* Z */
    { 0x00, 0x7F, 0x41, 0x41, 0x00 },   /* [ */
    { 0x55, 0x2A, 0x55, 0x2A, 0x55 },   /* "Yen" */
    { 0x00, 0x41, 0x41, 0x7F, 0x00 },   /* ] */
    { 0x04, 0x02, 0x01, 0x02, 0x04 },   /* ^ */
    { 0x40, 0x40, 0x40, 0x40, 0x40 },   /* _ */
    { 0x00, 0x01, 0x02, 0x04, 0x00 },   /* ' */
    { 0x20, 0x54, 0x54, 0x54, 0x78 },   /* a */
    { 0x7F, 0x48, 0x44, 0x44, 0x38 },   /* b */
    { 0x38, 0x44, 0x44, 0x44, 0x20 },   /* c */
    { 0x38, 0x44, 0x44, 0x48, 0x7F },   /* d */
    { 0x38, 0x54, 0x54, 0x54, 0x18 },   /* e */
    { 0x08, 0x7E, 0x09, 0x01, 0x02 },   /* f */
    { 0x0C, 0x52, 0x52, 0x52, 0x3E },   /* g */
    { 0x7F, 0x08, 0x04, 0x04, 0x78 },   /* h */
    { 0x00, 0x44, 0x7D, 0x40, 0x00 },   /* i */
    { 0x20, 0x40, 0x44, 0x3D, 0x00 },   /* j */
    { 0x7F, 0x10, 0x28, 0x44, 0x00 },   /* k */
    { 0x00, 0x41, 0x7F, 0x40, 0x00 },   /* l */
    { 0x7C, 0x04, 0x18, 0x04, 0x78 },   /* m */
    { 0x7C, 0x08, 0x04, 0x04, 0x78 },   /* n */
    { 0x38, 0x44, 0x44, 0x44, 0x38 },   /* o */
    { 0x7C, 0x14, 0x14, 0x14, 0x08 },   /* p */
    { 0x08, 0x14, 0x14, 0x18, 0x7C },   /* q */
    { 0x7C, 0x08, 0x04, 0x04, 0x08 },   /* r */
    { 0x48, 0x54, 0x54, 0x54, 0x20 },   /* s */
    { 0x04, 0x3F, 0x44, 0x40, 0x20 },   /* t */
    { 0x3C, 0x40, 0x40, 0x20, 0x7C },   /* u */
    { 0x1C, 0x20, 0x40, 0x20, 0x1C },   /* v */
    { 0x3C, 0x40, 0x30, 0x40, 0x3C },   /* w */
    { 0x44, 0x28, 0x10, 0x28, 0x44 },   /* x */
    { 0x0C, 0x50, 0x50, 0x50, 0x3C },   /* y */
    { 0x44, 0x64, 0x54, 0x4C, 0x44 },   /* z */
    { 0x00, 0x06, 0x09, 0x09, 0x06 }    /* ยบ */ //Degree symbol
};

const int cols[5] = {0x08,0x10,0x20,0x40,0x80}; //Columns mapped to port B3-B7 pins

void main()
 {
 char message0[4] = {"TEST"}; // Message to be displayed
 
set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_e(0x00);



   do
   {

   // 5x7 Small Font
   lcdStr(message0); //Display message
   } while(TRUE);
 
 }//End of the main()


//-------------------------------------------------------------------------/
// Description    :Write data to HCMS-2002 5x7 Red LED display
// Argument(s)    :int data to be written to the display
//
// Return value   :none
//-------------------------------------------------------------------------/
void writedata(int data)
{
//data = 0xff;

      output_low(CLK);           //CLK is low
      for (temp=8;temp>0;temp--)
      {
      output_low(CLK);
         if ((data&0x80)==0)
         {
         output_low(DIN);
         }
         else
         {
         output_high(DIN);
         }
      output_high(CLK);
      delay_us(10);
      output_low(CLK);
      data=data<<1;
      }
}

//-------------------------------------------------------------------------/
// Description    :Write a single char to HCMS-2002 Red 5x7 display
// Argument(s)    :String Pointer
//
// Return value   :none
//-------------------------------------------------------------------------/
void lcdStr(char *str)
{
   int i, j;
   //for(j=0; j<=4; j++)
   //{
      for(i=0;i<5;i++) //The ASCII table has 5 values per char thus 0 to 4
      {
      output_low(VB); //VB = OFF
      writedata(FONTLOOKUP[*str-32][i]);
      output_b(cols[i]);
      output_high(VB);
      delay_ms(1);
      } // Inner loop for the 5 bytes of the ASCII char
   //writedata(0x00);
   str++;
   //} // Loop for the Next Character to be fetched
}


Very Happy Very Happy Very Happy Very Happy
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Mar 27, 2014 12:25 am     Reply with quote

You think if you increment the passed 'str' pointer parameter at the end of
your routine, that it will somehow get back to the line where it was called
and increment the parameter there. No.

Let's make a test program. The program below strips your code
down to its essence. I compiled this with PCM vs. 5.021 and ran
it in MPLAB simulator with UART output directed to the Output Window
in MPLAB. This is what I get:
Quote:

0021
0021
0021

Let's look at part of the .SYM file, generated by the compiler for this program:
Quote:

01C CCP_2_HIGH
020 rs232_errors
021-024 message0
025-026 lcdStr.str
025 @PRINTF_X_9600_62_63.P1
026 @PRINTF_X_9600_62_63.P1
077 @SCRATCH
078 @SCRATCH

We see that message0 is at RAM address 0x21. That address is used
in every call to the LcdStr() function. It's not being incremented.
You need to revise your program and come up with a different code
structure that works.

Code:
#include <16F877A.h>
#fuses XT, NOWDT, BROWNOUT, PUT
#use delay(clock=4M)
#use rs232(baud=9600, UART1, ERRORS)

char message0[4] = {"TEST"}; // Message to be displayed

void lcdStr(char *str)
{
str++;
}

//======================
void main()     
{
lcdStr(message0); 
printf("%lx \r", message0);

lcdStr(message0); 
printf("%lx \r", message0);

lcdStr(message0); 
printf("%lx \r", message0);
   
while(1);           
}
CMatic



Joined: 11 Jan 2012
Posts: 69

View user's profile Send private message

HDSP2002 5x7 display code problems
PostPosted: Fri Mar 28, 2014 6:26 pm     Reply with quote

Thank you PCM Programmer. I tried and used your suggestions of incrementing the string pointer but it does not correctly display the characters either, the first char in the string is fine but the rest are still garbled. Again thank you for your suggestions.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group