Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
03/07/10 16:33
Read: times


 
#173917 - Display problems
I've been dabbling with a noritake VFD module with a HD47780 controller, and i cannot seem to get the letters to display properly. They are currently appearing on screen with a blank character inbetween each character i send to the screen so my code below should print Graeme but it is displayed as G r a e m e. Not only this but you will notice that the enable is strobed low then high, strobing the enable pin as usual does not print the character. I know the delays are completely inaccurate but this should not affect the display? surely only the speed at which i can send information to it. Also, I am not using the busy pin as I do not have a soldering iron to make a jumper to enable the busy pin. Im sure i am missing something blindingly obvious but after 6 hours of playing, I can get this to work, fresh out of ideas. Cheers for the helpful, and inciteful advice you always provide guys, Joel



#include <c8051f060.h>                    // SFR declarations
#define SYSCLK 3062500                 // approximate SYSCLK frequency in Hz found in slabs 
							// example for this chip! i thought this was  24 500 000 ???
#define LCD_DATA P2			// set P2 alias
sfr16 RCAP3    = 0xCA;                    // Timer3 reload value
sfr16 TMR3     = 0xCC;                    // Timer3 counter


sbit LED1	= P1^6;			
sbit RS		= P3^3;		//Register select
sbit RW		= P3^2;		//  Read write		
sbit EN		= P3^1;		//Enable
//sbit B		= P3^4;		//unused
sbit SW1	= P3^7;
 int a =1;




void PORT_Init (void);				// Initialised and configure port I/O
void Timer3_Init (int counts);
void Timer3_ISR (void);
void Ext_Interrupt_Init (void);     // Configure External Interrupts (/INT0 and /INT1)
void hold (void);					// Invokes constant never ending loop
void delay (int t);					// Delay
void Screen_Init (void);			// Calls screen initilisation funtion
void send (char Hex, int RS_val); 		// sends byte 'char h' to screen
void busy (void);					// check busy flag on screen
void oil_pressure (void);			// write graphic of oil pressure warning light

//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) 
{
   char string[1] = {'A'};
   
   WDTCN = 0xde;
   WDTCN = 0xad;					// disable watchdog timer

   Ext_Interrupt_Init ();			// External interrupt initialisation
   Timer3_Init (SYSCLK / 12 / 10);     // Initialise T3
   PORT_Init ();					// Port Direction Initialisation
//   Screen_Init ();			// Initialise screen
  
   EA = 1;							// enable global interrupts

   SFRPAGE = LEGACY_PAGE;         

 
   

   while (1) 
   {

	
//	P2= a;
//	delay(10);
//	EN = 1;
//	delay(10);
//	EN = 0;
//	a++;

//	send(0xF2,0);
//	send('B',1);
//	send(0xf0,0);
//	send(0x07,1);
//	send(0x07,1);


	send('G',0);
	send('r',0);
	send('a',0);
	send('e',0);
	send('m',0);
	send('e',0);
	
	hold();

//send (string[0], 1)


	SFRPAGE = CONFIG_PAGE;           // set SFR page before reading writing P5 bits
   } 						// end main while loop
 }						// end main void





void send (char Hex, int RS_val)
{
 	char SFRPAGE_SAVE = SFRPAGE;
   	SFRPAGE = CONFIG_PAGE;

	
	RS 		 = RS_val;			// correct RS val for command / data being sent
	delay(1000);
	EN 		 = 0;				// set enable high		
	LCD_DATA = Hex;				// send value to LCD data port
	delay(1000);					// call delay with atleast 20ns
	EN		 = 1;				// set enable low
	delay(1000);					// call delay with atleast 100ns
	LCD_DATA = 0;				// set LCD_PORT lines low for next data send
	delay(100000);
	//check busy?
							

	SFRPAGE = SFRPAGE_SAVE;
}




void PORT_Init (void)
{
char SFRPAGE_SAVE;

   SFRPAGE_SAVE = SFRPAGE;		// Save old SFRPAGE
   SFRPAGE = CONFIG_PAGE;		// Switch to configuration page

   XBR0     = 0x00;
   XBR1     = 0x14;                    // No peripherals selected 00010100
   XBR2     = 0x40;                    // Enable crossbar and weak pullups
                                   
   EX0 = 1;                            // Enable /INT0 interrupts
   EX1 = 1;                            // Enable /INT1 interrupts
 
   P2MDOUT |= 0xff;				
//   P1MDIN |= 0xFF;				// P1.6 is digital - unnecessary as configured as 'digital' on reset
   
   P3MDOUT = 0xff;				
//   P3     |= 0xF0;				// Set P3.7-P3.4 latch to '1'
      
   P1MDOUT = 0x40;				//(LED)
//   P0 = 0xFF;

   //P3 = 0xff;
   //P2 = 0xff;
   LED1 = 0;					// Init LED1 to 0

   SFRPAGE = SFRPAGE_SAVE;		//   to previous
}




void Screen_Init (void)
{
 	char SFRPAGE_SAVE = SFRPAGE;
   	SFRPAGE = CONFIG_PAGE;
	

	send(0x30, 0); 							// Luminescence command
	send(0x03, 1);							// Luminescence value (100%)


	SFRPAGE = SFRPAGE_SAVE;
}




void Ext_Interrupt_Init (void)
{
   char SFRPAGE_SAVE = SFRPAGE;
   SFRPAGE = TIMER01_PAGE;

   TCON = 0x05;                  // /INT 0 and /INT 1 are falling edge triggered

   EX0 = 1;                            // Enable /INT0 interrupts
   EX1 = 1;                            // Enable /INT1 interrupts

   SFRPAGE = SFRPAGE_SAVE;
}




void Timer3_Init (int counts)
{
char SFRPAGE_SAVE = SFRPAGE;

   SFRPAGE_SAVE = SFRPAGE;                 
   SFRPAGE = TMR3_PAGE;                   // T3 Page

   TMR3CN = 0x00;                         // Stop Timer3; Clear TF3;
                                         	 	   // use SYSCLK/12 as timebase
   RCAP3   = -counts;                     // Init reload values
   TMR3    = 0xffff;                      // set to reload immediately
   EIE2   |= 0x01;                        // enable Timer3 interrupts
   TR3 = 1;                               // start Timer3

   SFRPAGE = SFRPAGE_SAVE;                 

}




void oil_pressure (void)
{	
char oilpressure[2][36]={0x1c,0x66,0x42,0x43,0x61,0x31,0x1b,0x0e,0x04,0x04,
						 0x14,0x14,0x14,0x1d,0x1d,0x14,0x14,0x14,0x04,0x02,
						 0x01,0x01,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x09,
						 0x13,0x16,0x2c,0x30,0x03,0x01,0x00,0x00,0x00,0x00,
						 0x00,0x80,0xfe,0x02,0x02,0x02,0x02,0x02,0x02,0xea,
						 0xea,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x06,
						 0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,
						 0xc0,0xc0};
int r, c;

	for (r=0;r<2;r++)
	{
	//call function to set cursor back to 
		for (c=0;c<36;c++)
		{
		//call send(oilpressure[r][c]);
		}
	}
}


void delay (int t)
{
while(t!=0)
t--;
}



void hold (void)
{
while(1);
}



void busy (void)
{
// must check the busy status, R/W = H, RS = L, check bit D7 high, must configure port direction and strong pull ups?
}


void Timer3_ISR (void) interrupt 14
{
   TF3 = 0;                               	// clear TF3
   LED1 = ~LED1;                            // change state of LED
}



//void INT0_ISR (void) interrupt 1
//{
// 
//}


//void INT1_ISR (void) interrupt 0
//{
//   
//}
 



List of 16 messages in thread
TopicAuthorDate
Display problems            01/01/70 00:00      
   forgot to mention!            01/01/70 00:00      
   read the datasheet and buy the iron            01/01/70 00:00      
      just a minute ...            01/01/70 00:00      
         If you can't "afford" the one pin for the R/W signal            01/01/70 00:00      
            Why not address his question instead of wasting more money?            01/01/70 00:00      
         odd behaviour            01/01/70 00:00      
            Magic?            01/01/70 00:00      
               oscilloscope is fine, but in this case...            01/01/70 00:00      
                  Both, I think            01/01/70 00:00      
               "magic" is synonym for "luck"            01/01/70 00:00      
                  working            01/01/70 00:00      
                     min & max limits            01/01/70 00:00      
                        Delay lengths            01/01/70 00:00      
                           If only folks would do what we once always did ...            01/01/70 00:00      
   RW pin is defined but            01/01/70 00:00      

Back to Subject List