CMatic
Joined: 11 Jan 2012 Posts: 69
|
HDSP2002 5x7 display code problems |
Posted: Wed Mar 26, 2014 8:34 pm |
|
|
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
} |
|
|