millwood0 发表于 2009-6-21 04:33:45

Nokia 7110 GLCD driven by ARM

I posted this in the Proteus board before I realized that it should have been here. But here is a little program I have been working on the last week. It is the GLCD on a Nokia 7110 cell phone (SED1565 driver). the goal is to drive it with an ARM mcu.

here is the code - it runs fine, and is about 80% done functionality-wise. You are free to use it.

it was developed on Keil MDK3.70 demo.

http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_454924.PNG
(原文件名:nokia 7110 glcd.PNG)


=========code==================
//#include <htc.h>
//#include "delay.h"
#include <LPC210x.h>
//#include "always.h"

#define GETBIT(var,bit) (((var)>>(bit))&1)                         /* read bit from var */
#define SETBIT(var,bit) ((var)|=(1L<<(bit)))                /* set bit from var to 1 */
#define CLRBIT(var,bit) ((var)&=(~(1L<<(bit))))                /* clear bit from var (set it to 0) */

#define uint unsigned int
#define byte unsigned char
//#define delay_ms() DelayMs()

/////////////////////////////////////////////////////////////////////////////////
// Description : This firmware for Nokia 7110 (SED1565 controller) 96*65 TEST//
// Hardware : PIC16F875 , LCD NOKIA7110                                        //
// Firmware : Rev 0.1                                                          //
// Date : 6/14/2009                                                         //
// by : Hello world                                                            //
// Compiler : PICC-Lite 9.6L1 / TIDE                                                                  //
/////////////////////////////////////////////////////////////////////////////////

//#include <16F877.h>
//#fuses HS,NOPUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
//#use   delay(clock=20000000,RESTART_WDT)
//#bytelcdport = 6// (PORTB address value 6 for PIC16F628 device)


// hardware configuration
//                              PIC SIDE         LCD SIDE
/*#bitnok_sda= lcdport.0// RB0 pin-19      pin-13 Serial data
#bitnok_sclk = lcdport.1// RB1 pin-20      pin-05 Serial clock
#bitnok_dc   = lcdport.2// RB2 pin-21      pin-04 Data or Command mode
#bitnok_cs   = lcdport.3// RB3 pin-22      pin-02 LCD Chip select
#bitnok_res= lcdport.4// RB4 pin-23      pin-14 LCD Reset

#zero_ram
*/
// hardware configuration
// change this section if your pin connection is different

#define lcd_res         0                        //lcd_res connected to p0.0, pin13
#define lcd_sda         1                        //lcd_sda connected to p0.1, pin14
#define lcd_led                2                        //led backlight connected to p0.2, pin18
#define lcd_sclk         3                        //lcd_sclk connected to p0.3, pin21
#define lcd_dc                 4                        //lcd_dc connected to p0.4, pin22
#define lcd_cs                 5                        //lcd_cs connected to p0.5, pin23

// end hardware configuration

// display attributes
#define NORMAL                0x00        // normal black on green
#define UNDERLINE        0x80       
#define STRIKE                0x10
#define OVERLINE        0x01
#define REVERSE                0xff        //green on black


#define negative_lcd    lcd_write_command(lcd_reverse)
#define normal_lcd      lcd_write_command(lcd_normal)

/**********************************************************
               LCD Commands
**********************************************************/
#define pow_ctrl                                        0x20        // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
#define v5_ratio                                        0x22        //(17) V5 resistor ratio, from 0b00100000 to 0b00100111. need to add some ratio
#define start_line                                0x40        // start line - set the display line start address.
#define elec_vol                                        0x81        // (18) electronic volume mode
#define adc_normal                                 0xA0        // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
#define adc_reverse                                0xA1
#define lcd_bias_1_over_9        0xA2        // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
#define lcd_bias_1_over_7        0xA3
#define lcd_all_off                                0xA4        //turn all pixels off
#define lcd_all_on                                0xA5        //lcd all points on - turn on all pixels. 0xA4: normal display.
#define lcd_normal                                 0xA6         // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
#define lcd_reverse                                0xA7
#define lcd_off                                                0xAE        //
#define lcd_on                                                0xAF        // lcd on - display on. 0xAE: display off.
#define comm_normal                         0xC0        // (15) common output normal (0xC8 reverse)
#define comm_reverse                         0xC8
#define lcd_nop                                                0xE3        // nop (command for no-operation, 0b11100011.

#define lcd_1st_col                                0x12        //firstdisplayable column. datasheet didn't mention this. WEIRD!
#define ROW_RES                                                64                 //max row resolution
#define COL_RES                                                132                //max col resolution

/**********************************************************
               Global Variable
**********************************************************/
char page;
//char lcd_row,lcd_col;        //current row and column
char VidRAM;        //video ram, 8 rows and 132 column, each a byte.


/**********************************************************
               Function Prototype
**********************************************************/
void lcd_write_dorc(char byteforlcd);
void lcd_write_command(char byteforlcd_command);
void lcd_write_data(char byteforlcd_data);
void lcd_setpixel(char lcd_row, char lcd_col);
void lcd_clrpixel(char lcd_row, char lcd_col);
void lcd_write_byte(char lcd_row, char lcd_col, char charsel, char attribute);
//void lcd_gotoxy(char lcd_row, char lcd_col);        //go to lcd_row / 0-8; and lcd_col / 0-95
//void lcd_pixel(char x, char y);        // not used.
void lcd_chr(char lcd_row, char lcd_col, char charsel, char attribute);
void lcd_str(char lcd_row, char lcd_col, const char *str, char attribute);
void lcd_fill(char lcd_row0, char lcd_col0, char lcd_row1, char lcd_col1);
void lcd_clr(char lcd_row0, char lcd_col0, char lcd_row1, char lcd_col1);
void lcd_reset(void);
void lcd_cls(void);
void lcd_init(void);
void mcu_init(void);
void DelayUs(int);
void DelayMs(int);


/********************************************************
            ASCII table for 5x7 dots font
********************************************************/

const char Char_Table [] = {
                  0x00,0x00,0x00,0x00,0x00,// 20 space
                  0x00,0x00,0x5f,0x00,0x00,// 21 !
                  0x00,0x07,0x00,0x07,0x00,// 22 "
                  0x14,0x7f,0x14,0x7f,0x14,// 23 #
                  0x24,0x2a,0x7f,0x2a,0x12,// 24 $
                  0x23,0x13,0x08,0x64,0x62,// 25 %
                  0x36,0x49,0x55,0x22,0x50,// 26 &
                  0x00,0x05,0x03,0x00,0x00,// 27 '
                  0x00,0x1c,0x22,0x41,0x00,// 28 (
                  0x00,0x41,0x22,0x1c,0x00,// 29 )
                  0x14,0x08,0x3e,0x08,0x14,// 2a *
                  0x08,0x08,0x3e,0x08,0x08,// 2b +
                  0x00,0x50,0x30,0x00,0x00,// 2c ,
                  0x08,0x08,0x08,0x08,0x08,// 2d -
                  0x00,0x60,0x60,0x00,0x00,// 2e .
                  0x20,0x10,0x08,0x04,0x02,// 2f /
                  0x3e,0x51,0x49,0x45,0x3e,// 30 0
                  0x00,0x42,0x7f,0x40,0x00,// 31 1
                  0x42,0x61,0x51,0x49,0x46,// 32 2
                  0x21,0x41,0x45,0x4b,0x31,// 33 3
                  0x18,0x14,0x12,0x7f,0x10,// 34 4
                  0x27,0x45,0x45,0x45,0x39,// 35 5
                  0x3c,0x4a,0x49,0x49,0x30,// 36 6
                  0x01,0x71,0x09,0x05,0x03,// 37 7
                  0x36,0x49,0x49,0x49,0x36,// 38 8
                  0x06,0x49,0x49,0x29,0x1e,// 39 9
                  0x00,0x36,0x36,0x00,0x00,// 3a :
                  0x00,0x56,0x36,0x00,0x00,// 3b ;
                  0x08,0x14,0x22,0x41,0x00,// 3c <
                  0x14,0x14,0x14,0x14,0x14,// 3d =
                  0x00,0x41,0x22,0x14,0x08,// 3e >
                  0x02,0x01,0x51,0x09,0x06,// 3f ?
                  0x32,0x49,0x79,0x41,0x3e,// 40 @
                  0x7e,0x11,0x11,0x11,0x7e,// 41 A
                  0x7f,0x49,0x49,0x49,0x36,// 42 B
                  0x3e,0x41,0x41,0x41,0x22,// 43 C
                  0x7f,0x41,0x41,0x22,0x1c,// 44 D
                  0x7f,0x49,0x49,0x49,0x41,// 45 E
                  0x7f,0x09,0x09,0x09,0x01,// 46 F
                  0x3e,0x41,0x49,0x49,0x7a,// 47 G
                  0x7f,0x08,0x08,0x08,0x7f,// 48 H
                  0x00,0x41,0x7f,0x41,0x00,// 49 I
                  0x20,0x40,0x41,0x3f,0x01,// 4a J
                  0x7f,0x08,0x14,0x22,0x41,// 4b K
                  0x7f,0x40,0x40,0x40,0x40,// 4c L
                  0x7f,0x02,0x0c,0x02,0x7f,// 4d M
                  0x7f,0x04,0x08,0x10,0x7f,// 4e N
                  0x3e,0x41,0x41,0x41,0x3e,// 4f O
                  0x7f,0x09,0x09,0x09,0x06,// 50 P
                  0x3e,0x41,0x51,0x21,0x5e,// 51 Q
                  0x7f,0x09,0x19,0x29,0x46,// 52 R
                  0x46,0x49,0x49,0x49,0x31,// 53 S
                  0x01,0x01,0x7f,0x01,0x01,// 54 T
                  0x3f,0x40,0x40,0x40,0x3f,// 55 U
                  0x1f,0x20,0x40,0x20,0x1f,// 56 V
                  0x3f,0x40,0x38,0x40,0x3f,// 57 W
                  0x63,0x14,0x08,0x14,0x63,// 58 X
                  0x07,0x08,0x70,0x08,0x07,// 59 Y
                  0x61,0x51,0x49,0x45,0x43,// 5a Z
                  0x00,0x7f,0x41,0x41,0x00,// 5b [
                  0x02,0x04,0x08,0x10,0x20,// 5c 55
                  0x00,0x41,0x41,0x7f,0x00,// 5d ]
                  0x04,0x02,0x01,0x02,0x04,// 5e ^
                  0x40,0x40,0x40,0x40,0x40,// 5f _
                  0x00,0x01,0x02,0x04,0x00,// 60 `
                  0x20,0x54,0x54,0x54,0x78,// 61 a
                  0x7f,0x48,0x44,0x44,0x38,// 62 b
                  0x38,0x44,0x44,0x44,0x20,// 63 c
                  0x38,0x44,0x44,0x48,0x7f,// 64 d
                  0x38,0x54,0x54,0x54,0x18,// 65 e
                  0x08,0x7e,0x09,0x01,0x02,// 66 f
                  0x0c,0x52,0x52,0x52,0x3e,// 67 g
                  0x7f,0x08,0x04,0x04,0x78,// 68 h
                  0x00,0x44,0x7d,0x40,0x00,// 69 i
                  0x20,0x40,0x44,0x3d,0x00,// 6a j
                  0x7f,0x10,0x28,0x44,0x00,// 6b k
                  0x00,0x41,0x7f,0x40,0x00,// 6c l
                  0x7c,0x04,0x18,0x04,0x78,// 6d m
                  0x7c,0x08,0x04,0x04,0x78,// 6e n
                  0x38,0x44,0x44,0x44,0x38,// 6f o
                  0x7c,0x14,0x14,0x14,0x08,// 70 p
                  0x08,0x14,0x14,0x18,0x7c,// 71 q
                  0x7c,0x08,0x04,0x04,0x08,// 72 r
                  0x48,0x54,0x54,0x54,0x20,// 73 s
                  0x04,0x3f,0x44,0x40,0x20,// 74 t
                  0x3c,0x40,0x40,0x20,0x7c,// 75 u
                  0x1c,0x20,0x40,0x20,0x1c,// 76 v
                  0x3c,0x40,0x30,0x40,0x3c,// 77 w
                  0x44,0x28,0x10,0x28,0x44,// 78 x
                  0x0c,0x50,0x50,0x50,0x3c,// 79 y
                  0x44,0x64,0x54,0x4c,0x44,// 7a z
                  0x00,0x08,0x36,0x41,0x00,// 7b {
                  0x00,0x00,0x7f,0x00,0x00,// 7c |
                  0x00,0x41,0x36,0x08,0x00,// 7d }
                  0x10,0x08,0x08,0x10,0x08,// 7e ~
                  0x78,0x46,0x41,0x46,0x78}; // 7f &brvbar;

                  //7e,43,40,43,7e //&Uuml;
                  //7e,43,42,43,7e //&Ouml;
                  //1e,21,21,71,21 //&Ccedil;
                  //3c,42,53,53,72 //&ETH;

/********************************************************
            lcd clear LCD function
********************************************************/
void lcd_cls(void) {
        char x, y;
   for (page=0; page<9; page++)            // 9 page, fill display RAM with 0s.
      {
         lcd_write_command(0xB0 | page);   // page address ie:0xB0,0xB1,...,0xB7
         lcd_write_command(0x11);          // 0x11, most4 bit column address command 0001 0011
         lcd_write_command(0x01);          // 0x02, least 4 bit column address command 0000 0011
         for (x=96; x>0; x--) {             // 96 column
            lcd_write_data(0x00);
                                                for (y=0; y<8; y++)
                                                        VidRAM=0;                                                                //initialize the video ram
                                }
      }
}

/**********************************************************
               Reset LCD Function
**********************************************************/
void lcd_reset(void) {
   IOSET = 1<<lcd_cs;                        //select the lcd
   DelayMs(10);
   IOCLR = 1<<lcd_res;                //lcd_res low to reset the display. the lcd going into default state.
   DelayMs(10);                                                //give the lcd time to reset.
   IOSET = 1<<lcd_res;                //pulling the lcd out of reset.
   DelayMs(100);
}

/**********************************************************
               Initial LCD Function
**********************************************************/
void lcd_init(void) {
   lcd_reset();
   // the following initialization sequence per datasheet. All needs to be done in 5ms. (X) where X is the command on pg 8-56 of datasheet

   lcd_write_command(lcd_normal); // 0b10100110 = 0xA6, lcd in normal display mode (0xA7/0b10100111 negative mode)
   lcd_write_command(lcd_bias_1_over_7); // (11) lcd bias (1/9 0xA2/0b10100010 - 1/7 0xA3/0b10100011)
   lcd_write_command(adc_reverse); // (8) <ADC select> (0xA1/0b10100001 reverse lcd - 0xA0/0b10100000 select normal)
   lcd_write_command(comm_normal); // (15) common output normal (0xC8 reverse)
   lcd_write_command(v5_ratio+2); // (17) V5 resistor ratio, from 0b00100000 to 0b00100111
   lcd_write_command(elec_vol); // (18) electronic volume mode
   lcd_write_command(pow_ctrl+0x0E); // (16) power control set value (contrast level --> 0x00 lightest to 0x3F darkest), from 0b00101000 to 0b00101111.
   //this concludes the mandatory initialization, as specified on pg 8-56 of the datasheet
   
   lcd_write_command(0x2F); // power control set value, from 0b00101000 to 0b00101111. see pg 8-52 of datasheet.
   lcd_write_command(lcd_nop); // nop (command for no-operation, 0b11100011.
   lcd_write_command(0x40); // start line - set the display line start address.
   lcd_write_command(lcd_on); // lcd on - display on. 0xAE: display off.
//   lcd_write_command(lcd_all_on); // lcd all points on - turn on all pixels. 0xA4: normal display.
   DelayMs(50);
//   lcd_write_command(lcd_off); // lcd off - turn display off.

   lcd_cls();

//   lcd_write_command(lcd_on); // lcd on
//   lcd_write_command(lcd_all_off); // lcd normal display mode


}

/**********************************************************
               sent 8 bit data to LCD by series
**********************************************************/
void lcd_write_dorc(char byteforlcd) { // same lcdai 3310

char caa;
   for (caa=8;caa>0;caa--)
   {
      IOCLR=1<<lcd_sclk;        //data sent on the rising edge of sclk line
//      DelayUs(2);
      if ((byteforlcd&0x80)==0)        // tramission starts from D7, D6, .., D1, D0. if D7 is 0, send 0.
         {IOCLR=1<<lcd_sda;}
      else
         {IOSET=1<<lcd_sda;}
         
      IOSET=1<<lcd_sclk;        //clock out the data
      byteforlcd=byteforlcd<<1;        //shift left the next bit.
   }

}

/**********************************************************
            Sent Command to LCD Function
**********************************************************/
void lcd_write_command(char byteforlcd_command) {
   IOCLR=1<<lcd_dc;   // dc=0 signals lcd command mode. A0 in the datasheet. dc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_command);        //send the command.
   IOSET=1<<lcd_cs;   // chip disabled
}

/**********************************************************
               Sent Data to LCD Function
**********************************************************/
void lcd_write_data(char byteforlcd_data) {
   IOSET=1<<lcd_dc;   // display data mode. A0 in the datasheet. dorc=data or command.
   IOCLR=1<<lcd_cs;   // chip enabled, negative logic. _cs
   lcd_write_dorc(byteforlcd_data);        //send the data.
   IOSET=1<<lcd_cs;   // chip disabled
}

/**********************************************************
               goto xy PIXEL position on LCD Function
**********************************************************/
void lcd_gotoxy(char lcd_row, char lcd_col) {        //lcy_row: 0 - 8 (8th column has only 1 line / D0, lcd_col: 0 - 15.
   char col_addr;
   lcd_write_command(0xB0 + lcd_row);               // page address set. pg 8-48 in the datasheet.
   col_addr = (lcd_col*6);                                        // each font has five columns + 1 blank column. xaddr: 0 - 95 on nokia 7110. no offset.
       //lcd_1st_col=0x12: the first column of display starts here. Weird! the datasheet didn't mention it.
   lcd_write_command(0x10 | (col_addr>>4));      // column address 4 most bit set
   lcd_write_command(0x0f & col_addr);             // column address 4 least bit set
}

/**********************************************************
                                                set pixel at lcd_row and lcd_col
**********************************************************/
void lcd_setpixel(char lcd_row, char lcd_col) {        //row: 0 - 63, col: 0-131
        char x,y;

        if (lcd_row>64) return;
        if (lcd_col>0x83) return;                 //check for illegal addresses

        x=lcd_row/8;
        y=1<<(lcd_row % 8);
//        VidRAM=0;
        VidRAM |= y;                                //set the bit;
   lcd_write_command(0xB0 + x);               // page address set. pg 8-48 in the datasheet.
   lcd_write_command(0x10 | (lcd_col>>4));      // column address 4 most bit set
   lcd_write_command(0x0f & lcd_col);             // column address 4 least bit set
        lcd_write_data(VidRAM);
}

/**********************************************************
                                                clear pixel at lcd_row and lcd_col
**********************************************************/
void lcd_clrpixel(char lcd_row, char lcd_col) {        //row: 0 - 63, col: 0-131
        char x=lcd_row/8,y=1<<(lcd_row % 8);

        if (lcd_row>64) return;
        if (lcd_col>0x83) return;                 //check for illegal addresses

        x=lcd_row/8;
        y=1<<(lcd_row % 8);
        VidRAM &= (~y);                                //set the bit;
   lcd_write_command(0xB0 + x);               // page address set. pg 8-48 in the datasheet.
   lcd_write_command(0x10 | (lcd_col>>4));      // column address 4 most bit set
   lcd_write_command(0x0f & lcd_col);             // column address 4 least bit set
        lcd_write_data(VidRAM);
}

/**********************************************************
         write a byte / column to charractor Function
**********************************************************/
void lcd_write_byte(char lcd_row, char lcd_col, char charsel, char attribute) {
        char i;

        if (lcd_row>63) return;
        if (lcd_col>132-32) return;                //check for illegal address;

        if (attribute == REVERSE)
                charsel = ~charsel;
        else
                charsel |= attribute;

        for (i=0; i<8; i++) {
                if ((charsel & (1<<i)) == 0)
                        lcd_clrpixel(lcd_row+i, lcd_col);
                else
                        lcd_setpixel(lcd_row+i, lcd_col);
        }
}

/**********************************************************
         Convert bitmap to charractor Function
**********************************************************/
void lcd_chr(char lcd_row, char lcd_col, char charsel, char attribute) {
        char char_data, col;
        int char_pos;

        if (charsel < 0x20) return;
        if (charsel > 0x7f) return;                //check for illegal characters

   for (col = 0; col < 5; col++) // 5 columns for 5 bytes;
      {
         char_pos=charsel-0x20;
         char_data=Char_Table;
//         lcd_write_data(~char_data);            // send font data to lcd, white char on black background
                                        lcd_write_byte(lcd_row, lcd_col+col, char_data, attribute);
      }
//   lcd_write_data(~0x00); // blank side pixels for each font, white char on black background
                lcd_write_byte(lcd_row, lcd_col+5, 0x00, attribute);              
}

/**********************************************************
         Write a string at current screen position
**********************************************************/
void lcd_str(char lcd_row, char lcd_col, const char *str, char attribute) {

        char i=0;
while (*str) {
                lcd_chr(lcd_row, lcd_col+i, *str++, attribute);
                i+=6;
        }
       
}

/**********************************************************
         Fill an area
**********************************************************/
void lcd_fill(char lcd_row0, char lcd_col0, char width, char height) {

        char i, j;
for (i=lcd_row0; i<=lcd_row0+width; i++)
                for (j=lcd_col0; j<=lcd_col0+height; j++)
                        lcd_setpixel(i,j);
}

/**********************************************************
         Clear an area
**********************************************************/
void lcd_clr(char lcd_row0, char lcd_col0, char width, char height) {

        char i, j;
for (i=lcd_row0; i<=lcd_row0+width; i++)
                for (j=lcd_col0; j<=lcd_col0+height; j++)
                        lcd_clrpixel(i,j);
}

/**********************************************************
         draw a line between two points
                                       code shamelessly stolen from Jim Lynch's 6100 driver
                                       which itself is based on Jack Bresenham's line algorithm
**********************************************************/
void lcd_setline(char x0, char y0, char x1, char y1) {

        int dy = y1 - y0;
        int dx = x1 - x0;
        int stepx, stepy;

        if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
        if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
        dy <<= 1; // dy is now 2*dy
        dx <<= 1; // dx is now 2*dx
        lcd_setpixel(x0, y0);
       
        if (dx > dy) {
                int fraction = dy - (dx >> 1); // same as 2*dy - dx
                while (x0 != x1) {
                        if (fraction >= 0) {
                                y0 += stepy;
                                fraction -= dx; // same as fraction -= 2*dx
                        }
                        x0 += stepx;
                        fraction += dy; // same as fraction -= 2*dy
                        lcd_setpixel(x0, y0);
                }
        } else {
                int fraction = dx - (dy >> 1);
                while (y0 != y1) {
                        if (fraction >= 0) {
                                x0 += stepx;
                                fraction -= dy;
                        }
                        y0 += stepy;
                        fraction += dx;
                        lcd_setpixel(x0, y0);
                }
        }
}

/**********************************************************
         clear a line between two points
                                       code shamelessly stolen from Jim Lynch's 6100 driver
                                       which itself is based on Jack Bresenham's line algorithm
**********************************************************/
void lcd_clrline(char x0, char y0, char x1, char y1) {

        int dy = y1 - y0;
        int dx = x1 - x0;
        int stepx, stepy;

        if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
        if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
        dy <<= 1; // dy is now 2*dy
        dx <<= 1; // dx is now 2*dx
        lcd_clrpixel(x0, y0);
       
        if (dx > dy) {
                int fraction = dy - (dx >> 1); // same as 2*dy - dx
                while (x0 != x1) {
                        if (fraction >= 0) {
                                y0 += stepy;
                                fraction -= dx; // same as fraction -= 2*dx
                        }
                        x0 += stepx;
                        fraction += dy; // same as fraction -= 2*dy
                        lcd_clrpixel(x0, y0);
                }
        } else {
                int fraction = dx - (dy >> 1);
                while (y0 != y1) {
                        if (fraction >= 0) {
                                x0 += stepx;
                                fraction -= dy;
                        }
                        y0 += stepy;
                        fraction += dx;
                        lcd_clrpixel(x0, y0);
                }
        }
}

/**********************************************************
         draw a rectangular between two points
**********************************************************/
void lcd_setrect(char x0, char y0, char width, char height) {

        lcd_setline(x0, y0, x0, y0+width);
        lcd_setline(x0, y0, x0+height, y0);
        lcd_setline(x0+height, y0, x0+height, y0+width);
        lcd_setline(x0, y0+width, x0+height, y0+width);
}


/**********************************************************
delay routines
***********************************************************/

void DelayUs(int us) {
        for (; us>0; us--);
}

void DelayMs(int ms) {
        for (; ms>0; ms--)
                DelayUs(1000);
}

void mcu_init(void) {
// need to initialize the mcu here.
        PINSEL0=0x00;
        IODIR=0xff;                //pin p0.0..p0.7 used for gpio.
       
}

/*****************************************************************
                  Main Progarm
*****************************************************************/

int main(void)
{
        int i;

   mcu_init();
   lcd_init();
        while (1) {
                lcd_cls();
//                lcd_chr('c');
//                lcd_chr('b');
//                lcd_str(00, 18, "0-Hello, World!", NORMAL);
                lcd_str(10, 18, "1-Hello, World!", NORMAL);
//                lcd_fill(0, 32, 50, 56);
//                lcd_clr(20, 40, 60, 60);
                lcd_setline(0,50, 40, 60);
                lcd_setline(10, 20, 30, 40);
                lcd_setrect(5,25,20,30);
                for (i=10; i<60; i+=3) {
                        lcd_setline(i,25, 60-i, 80);
                        DelayMs(100);
//                        lcd_clrline(i,25, 60-i, 80);
                }
//                lcd_str(20, 20, "2-hello, world!", OVERLINE);
//                lcd_str(30, 21, "3-ABCDEFGHIJKLMN", UNDERLINE);
//                lcd_str(40, 22, "4-abcdefghijklmn", STRIKE);
//                lcd_str(50, 23, "5-OPQRSTUVWXYZ", OVERLINE | STRIKE);


//                lcd_gotoxy(8,0);
//                lcd_str("0-HELLO, WORLD!", NORMAL);


//                lcd_cls();
        }
}

/*void main(void) {
        while (1){
                //TODO Auto-generated main function
        }
}
*/

millwood0 发表于 2009-6-21 05:00:49

added functions for circles.

http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_454925.PNG
(原文件名:nokia 7110 glcd 2.PNG)

ShawnLinson 发表于 2009-6-21 08:20:57

强帖留名

_yuming 发表于 2009-6-21 09:54:30

mark

cowboy 发表于 2009-6-21 12:37:21

Thanks millwood0

C.Ronaldo 发表于 2009-6-21 13:56:21

GOOD1

millwood0 发表于 2009-6-21 18:47:02

some history of the code: the code was originally developed by somebody else in CCS. It had serious timing issues and coding errors when I was trying to migrate it to PICC. then I realized that for what I wanted to do, pic isn't fast enough so I thought about migrating to ARM. that's why you will see a lot of lines that I have commented out that refer to htc / pic.

the code still has some issues and inconsistencies that I am trying to fix soon. But for now, it should work most of the time.

here is a picture of a menu someone developed with this library.

http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_455007.jpg
(原文件名:nokia 7110 menu.jpg)

keaiduo 发表于 2009-10-13 00:12:41

Thanks

f7a7 发表于 2010-7-1 23:49:47

mark

Forever 发表于 2011-11-16 22:17:04

good!
页: [1]
查看完整版本: Nokia 7110 GLCD driven by ARM