aboutsummaryrefslogtreecommitdiffstats
path: root/HD44780.c
diff options
context:
space:
mode:
authorreinelt <>2000-04-13 06:09:52 +0000
committerreinelt <>2000-04-13 06:09:52 +0000
commit7a34aa1940680a265c074fe1c4f329eb0669d63c (patch)
treeb454de44fb53b6e72f1252e287ebe700a7c5dbd7 /HD44780.c
parent960aa7ec9ab275c7ebeb4bba96dbbd7b9211c000 (diff)
downloadlcd4linux-7a34aa1940680a265c074fe1c4f329eb0669d63c.tar.gz
[lcd4linux @ 2000-04-13 06:09:52 by reinelt]
added BogoMips() to system.c (not used by now, maybe sometimes we can calibrate our delay loop with this value) added delay loop to HD44780 driver. It seems to be quite fast now. Hopefully no compiler will optimize away the delay loop!
Diffstat (limited to 'HD44780.c')
-rw-r--r--HD44780.c73
1 files changed, 41 insertions, 32 deletions
diff --git a/HD44780.c b/HD44780.c
index cdea5bf..5d3d6dd 100644
--- a/HD44780.c
+++ b/HD44780.c
@@ -1,4 +1,4 @@
-/* $Id: HD44780.c,v 1.1 2000/04/12 08:05:45 reinelt Exp $
+/* $Id: HD44780.c,v 1.2 2000/04/13 06:09:52 reinelt Exp $
*
* driver for display modules based on the HD44780 chip
*
@@ -20,6 +20,14 @@
*
*
* $Log: HD44780.c,v $
+ * Revision 1.2 2000/04/13 06:09:52 reinelt
+ *
+ * added BogoMips() to system.c (not used by now, maybe sometimes we can
+ * calibrate our delay loop with this value)
+ *
+ * added delay loop to HD44780 driver. It seems to be quite fast now. Hopefully
+ * no compiler will optimize away the delay loop!
+ *
* Revision 1.1 2000/04/12 08:05:45 reinelt
*
* first version of the HD44780 driver
@@ -49,8 +57,6 @@
#define CHARS 8
#define BARS ( BAR_L | BAR_R | BAR_U | BAR_D | BAR_H2 )
-static LCD Lcd;
-
typedef struct {
int len1;
int len2;
@@ -66,7 +72,9 @@ typedef struct {
int ascii;
} SEGMENT;
+static LCD Lcd;
static unsigned short Port=0;
+static unsigned long Delay;
static char Txt[4][40];
static BAR Bar[4][40];
@@ -75,28 +83,29 @@ static int nSegment=2;
static SEGMENT Segment[128] = {{ len1:0, len2:0, type:255, used:0, ascii:32 },
{ len1:255, len2:255, type:255, used:0, ascii:255 }};
-
static void HD_delay (unsigned long usec)
{
- usleep(usec);
+ unsigned long i=usec*Delay/2;
+ while (i--);
}
-static void HD_command (unsigned char cmd)
+static void HD_command (unsigned char cmd, int delay)
{
outb (cmd, Port); // put data on DB1..DB8
outb (0x02, Port+2); // set Enable = bit 0 invertet
HD_delay(1);
outb (0x03, Port+2); // clear Enable
+ HD_delay(delay);
}
-static void HD_write (char *string, int len)
+static void HD_write (char *string, int len, int delay)
{
while (len--) {
outb (*string++, Port); // put data on DB1..DB8
outb (0x00, Port+2); // set Enable = bit 0 invertet
HD_delay(1);
outb (0x01, Port+2); // clear Enable
- HD_delay(40);
+ HD_delay(delay);
}
}
@@ -107,20 +116,13 @@ static int HD_open (void)
return -1;
}
- HD_command (0x30); // 8 Bit mode
- HD_delay (4100); // wait 4.1 ms
- HD_command (0x30); // 8 Bit mode
- HD_delay (100); // wait 100 us
- HD_command (0x30); // 8 Bit mode
- HD_delay (4100); // wait 4.1 ms
- HD_command (0x38); // 8 Bit mode, 1/16 duty cycle, 5x8 font
- HD_delay (40); // wait 40 us
- HD_command (0x08); // Display off, cursor off, blink off
- HD_delay (40); // wait 40 us
- HD_command (0x0c); // Display on, cursor off, blink off
- HD_delay (1640); // wait 1.64 ms
- HD_command (0x06); // curser moves to right, no shift
- HD_delay (40); // wait 40 us
+ HD_command (0x30, 4100); // 8 Bit mode, wait 4.1 ms
+ HD_command (0x30, 100); // 8 Bit mode, wait 100 us
+ HD_command (0x30, 4100); // 8 Bit mode, wait 4.1 ms
+ HD_command (0x38, 40); // 8 Bit mode, 1/16 duty cycle, 5x8 font
+ HD_command (0x08, 40); // Display off, cursor off, blink off
+ HD_command (0x0c, 1640); // Display on, cursor off, blink off, wait 1.64 ms
+ HD_command (0x06, 40); // curser moves to right, no shift
return 0;
}
@@ -287,8 +289,8 @@ static void HD_define_chars (void)
}
break;
}
- HD_command (0x40|8*c);
- HD_write (buffer, 8);
+ HD_command (0x40|8*c, 40);
+ HD_write (buffer, 8, 120); // 120 usec delay for CG RAM write
}
}
@@ -305,8 +307,7 @@ int HD_clear (void)
Bar[row][col].segment=-1;
}
}
- HD_command (0x01); // clear display
- HD_delay (1640);
+ HD_command (0x01, 1640); // clear display
return 0;
}
@@ -332,16 +333,25 @@ int HD_init (LCD *Self)
fprintf (stderr, "HD44780: no 'Size' entry in %s\n", cfg_file());
return -1;
}
-
if (sscanf(s,"%dx%d",&cols,&rows)!=2 || rows<1 || cols<1) {
fprintf(stderr,"HD44780: bad size '%s'\n",s);
return -1;
}
-
+
+ s=cfg_get ("Delay");
+ if (s==NULL || *s=='\0') {
+ fprintf (stderr, "HD44780: no 'Delay' entry in %s\n", cfg_file());
+ return -1;
+ }
+ if ((Delay=strtol(s, &e, 0))==0 || *e!='\0' || Delay<1) {
+ fprintf (stderr, "HD44780: bad delay '%s' in %s\n", s, cfg_file());
+ return -1;
+ }
+
Self->rows=rows;
Self->cols=cols;
Lcd=*Self;
-
+
if (HD_open()!=0)
return -1;
@@ -359,8 +369,7 @@ void HD_goto (int row, int col)
int pos;
pos=(row%2)*64+col;
if (row>2) pos+=20;
- HD_command (0x80|pos);
- HD_delay(40);
+ HD_command (0x80|pos, 40);
}
int HD_put (int row, int col, char *text)
@@ -474,7 +483,7 @@ int HD_flush (void)
if (Txt[row][col]=='\t') break;
*p=Txt[row][col];
}
- HD_write (buffer, p-buffer);
+ HD_write (buffer, p-buffer, 40);
}
}
return 0;