Lpc2103 ve nokia7110 lcd example...

Başlatan mustafa_cmbz, 01 Şubat 2011, 00:22:50

mustafa_cmbz

Merhaba arkadaşlar...bende uzun zamandır arm'a geçmek isteyip bir türlü fırsat bulamayan arkadaşlardanım çok şükür şimdilik tek derdim zaman ve bende kendime bu konuyla alakalı olarak işin gücün ve sosyal hayatın dışında bir zaman ayırıp bişiler öğrenmeye çalışıyorum....

az önce nette LPC2103 ile lcd yi nasıl çalıştırırım diye örnek ararken karşıma bi site çıktı ve bende hemen verilen kodu şemayı denemeye koyuldum...ilk başta şunuda belirtim kod ve uygulama benim değil tamamen bu siteden alıntıdır...bilindiği üzere arm ile ilgili bilgiler pic kadar yaygınlaşmış değil...Bende nette araştırıp bulduğum örnek kodları şemaları uygulamaları vs. arm ile ilgili ne varsa sizlerle paylaşmak istiyorum....kendin niye bişiler yazmıyosun kardeşim derseniz basic tabanlı çalıştıktan sonra c ye geçmek basicçiler için aşılmaz bi dağ gibi durur bende c'ye geçmeyi gözümde çok büyüttüm zamanında ama şimdilerde tamamen c'ye geçmiş bulunmaktayım henüz tam kavrayamamış olsamda böyle örnek kodları inceleyerek ufaktan ufaktan ısınma turları atmaktayım...bklm devamı gelecektir inş..

şimdi gerekli açıklamaları yaptıktan sonra bulduğum uygulamanın kodlarını site adresini ve gerekli diğer tüm dökümanları sizler ile paylaşalım :)

http://http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3404919&bbs_page_no=7&bbs_id=1037


[IMG]http://download.ourdev.cn/bbs_upload780997/files_16/ourdev_454105.PNG[/img]

//#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) 
//#byte  lcdport = 6  // (PORTB address value 6 for PIC16F628 device) 


// hardware configuration 
//                              PIC SIDE         LCD SIDE 
/*#bit  nok_sda  = lcdport.0  // RB0 pin-19        pin-13 Serial data 
#bit  nok_sclk = lcdport.1  // RB1 pin-20        pin-05 Serial clock 
#bit  nok_dc   = lcdport.2  // RB2 pin-21        pin-04 Data or Command mode 
#bit  nok_cs   = lcdport.3  // RB3 pin-22        pin-02 LCD Chip select 
#bit  nok_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 

#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 //first  displayable column. datasheet didn't mention this. WEIRD! 

/********************************************************** 
               Global Variable 
**********************************************************/ 
char page; 
char x,y; 
//char char_row; 
//char charpos; 
//char chardata; 


/********************************************************** 
               Function Prototype 
**********************************************************/ 
void lcd_write_dorc(char byteforlcd); 
void lcd_write_command(char byteforlcd_command); 
void lcd_write_data(char byteforlcd_data); 
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 charsel); 
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 
********************************************************/ 

char const 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 \ 
                  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 ¦ 

                  //7e,43,40,43,7e //Ü 
                  //7e,43,42,43,7e //Ö 
                  //1e,21,21,71,21 //Ç 
                  //3c,42,53,53,72 //&ETH; 

/******************************************************** 
              lcd clear LCD function 
********************************************************/ 
void lcd_cls(void) { 
   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, most  4 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); 
      } 
} 

/********************************************************** 
               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(0x2f); // 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 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_1st_col+(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(0x11 | (col_addr>>4));        // column address 4 most bit set 
   lcd_write_command(0x0f & col_addr);             // column address 4 least bit set 
} 

/********************************************************** 
           Convert bitmap to charractor Function 
**********************************************************/ 
void lcd_chr(char charsel) { 
char char_row, char_data; 
int char_pos; 

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

   for (char_row = 0; char_row < 5; char_row++) // 5 bytes 
      { 
         char_pos=charsel-0x20; 
         char_data=Char_Table[char_pos*5+char_row]; 
//         lcd_write_data(~char_data);            // send font data to lcd, white char on black background 
 lcd_write_data(char_data);            // send font data to lcd 
      } 
//   lcd_write_data(~0x00); // blank side pixels for each font, white char on black background 
 lcd_write_data(0x00); // blank side pixels for each font 
} 

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

  while (*str)  
lcd_chr(*str++);  
} 

/********************************************************** 
  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) 
{ 
  
   mcu_init(); 
   lcd_init(); 
while (1) { 
lcd_gotoxy(0,0); 
    lcd_str("0-HELLO, WORLD!"); 
lcd_gotoxy(1,0); 
lcd_str("1-01234567890012"); 
lcd_gotoxy(2,0); 
lcd_str("2-hello, world!"); 
lcd_gotoxy(3,0); 
lcd_str("3-ABCDEFGHIJKLMN"); 
lcd_gotoxy(4,0); 
lcd_str("4-abcdefghijklmn"); 
lcd_gotoxy(5,0); 
lcd_str("5-OPQRSTUVWXYZ"); 
lcd_gotoxy(6,0); 
lcd_str("6-opqrstuvwxyz"); 
lcd_gotoxy(7,0); 
lcd_str("7-  BYE BYE"); 

// lcd_cls(); 
} 
} 

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




daha hali hazırda arm ile ilgili pek fazla bilgim olmadığı için denemelerimi isiste yapıyorum ama yakın zaman içinde edindiğim bilgiler doğrultusunda kendi deney bordumu çizip uygulamalarımı real'e dökeceğim....iyi çalışmalar...

mezire


mustafa_cmbz

ilk diğer foruma yazmıştım kolaylık olsun diye ordan kopy paste etmiştim ondan olmalı...tşk ederim..