اطلاعیه

Collapse
No announcement yet.

کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

    سلام بچه ها
    یه کد داشتم که می خواستم یکی برام تحلیلش کنه که بدونم این چطوریه. این کد:


    کد:
    /********************************************************************
    
    DESCRIPTION:	A Simple program to genarate some random 
    				musical tone.
    
    MCU:			Atmel AVR ATmega32
    
    CPU SPEED:		16Mhz
    
    LOW FUSE:		0XFF
    HIGH FUSE:		0XC9
    
    NOTE:			Connect a 8ohm speaker between GND and PB3.
    
    
    AUTHOR:			Avinash Gupta
    DATE: 			Mar 18, 2010
    
    WEB:			www.eXtremeElectronics.co.in
    
    
    *** THIS PROJECT IS PROVIDED FOR EDUCATION/HOBBY USE ONLY ***
    
    *** NO PROTION OF THIS WORK CAN BE USED IN COMMERIAL    ***
    *** APPLICATION WITHOUT WRITTEN PERMISSION FROM THE AUTHOR ***
    
    EVERYONE IS FREE TO POST/PUBLISH THIS ARTICLE IN
    PRINTED OR ELECTRONIC FORM IN FREE/PAID WEBSITES/MAGAZINES/BOOKS
    IF PROPER CREDIT TO ORIGINAL AUTHOR IS MENTIONED WITH LINKS TO
    ORIGINAL ARTICLE 
    
    COPYRIGHT (C) 2008-2010 EXTREME ELECTRONICS INDIA.
    
    *********************************************************************/
    
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    
    #include "sin.h"
    
    /*
    
    Function To Initialize TIMER0 In Fast
    PWWM Mode.
    
    */
    void InitPWM()
    {
    	/*
    	TCCR0 - Timer Counter Control Register (TIMER0)
    	-----------------------------------------------
    	BITS DESCRIPTION
    	
    	NO: 	NAME  DESCRIPTION
    	--------------------------
    	BIT 7 : FOC0  Force Output Compare [Not used in this example]
    	BIT 6 : WGM00 Wave form generartion mode [SET to 1]
    	BIT 5 : COM01 Compare Output Mode    [SET to 1]
    	BIT 4 : COM00 Compare Output Mode    [SET to 0]
    	BIT 3 : WGM01 Wave form generartion mode [SET to 1]
    	BIT 2 : CS02  Clock Select        [SET to 0]
    	BIT 1 : CS01  Clock Select        [SET to 0]
    	BIT 0 : CS00  Clock Select        [SET to 1]
    
    	The above settings are for
    	--------------------------
    	Timer Clock = CPU Clock (No Prescalling)
    	Mode    = Fast PWM
    	PWM Output = Non Inverted
    
    	*/
    
    
    	TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
    
    	//Set OC0 PIN as output. It is PB3 on ATmega16 ATmega32
    	DDRB|=(1<<PB3);
    }
    
    void main()
    {
    	uint8_t i;
    
    	InitPWM();
    
    	while(1)
    	{
    
    		uint8_t delay,n;
    
    		for(delay=1;delay<=50;delay++)
    		{
    			for(n=0;n<(51-delay);n++)
    			{
    				for(i=0;i<=254;i++)
    				{
    					OCR0=pgm_read_byte_near(sine+i);
    					_delay_loop_2(delay);
    
    				}	
    			}
    		}
    		for(delay=50;delay>=2;delay--)
    		{
    			for(n=0;n<(51-delay);n++)
    			{
    				for(i=0;i<=254;i++)
    				{
    					OCR0=pgm_read_byte_near(sine+i);
    					_delay_loop_2(delay);
    				}	
    			}
    		}				
    			
    	}
    }

    اینم فایل sin.h :


    کد:
    #include <avr/pgmspace.h>
    
    prog_uint8_t sine[256]={
    							127,
    							130,
    							133,
    							136,
    							139,
    							143,
    							146,
    							149,
    							152,
    							155,
    							158,
    							161,
    							164,
    							167,
    							170,
    							173,
    							176,
    							178,
    							181,
    							184,
    							187,
    							189,
    							192,
    							195,
    							197,
    							200,
    							203,
    							205,
    							207,
    							210,
    							212,
    							214,
    							217,
    							219,
    							221,
    							223,
    							225,
    							227,
    							229,
    							231,
    							232,
    							234,
    							236,
    							237,
    							239,
    							240,
    							242,
    							243,
    							244,
    							245,
    							246,
    							248,
    							248,
    							249,
    							250,
    							251,
    							251,
    							252,
    							253,
    							253,
    							253,
    							254,
    							254,
    							254,
    							254,
    							254,
    							254,
    							254,
    							253,
    							253,
    							253,
    							252,
    							252,
    							251,
    							250,
    							250,
    							249,
    							248,
    							247,
    							246,
    							245,
    							243,
    							242,
    							241,
    							239,
    							238,
    							236,
    							235,
    							233,
    							231,
    							229,
    							227,
    							225,
    							224,
    							221,
    							219,
    							217,
    							215,
    							213,
    							210,
    							208,
    							206,
    							203,
    							201,
    							198,
    							195,
    							193,
    							190,
    							187,
    							185,
    							182,
    							179,
    							176,
    							173,
    							170,
    							167,
    							164,
    							161,
    							158,
    							155,
    							152,
    							149,
    							146,
    							143,
    							140,
    							137,
    							134,
    							131,
    							128,
    							125,
    							121,
    							118,
    							115,
    							112,
    							109,
    							106,
    							103,
    							100,
    							97,
    							94,
    							91,
    							88,
    							85,
    							82,
    							79,
    							76,
    							73,
    							71,
    							68,
    							65,
    							62,
    							60,
    							57,
    							55,
    							52,
    							50,
    							47,
    							45,
    							42,
    							40,
    							38,
    							36,
    							34,
    							31,
    							29,
    							27,
    							26,
    							24,
    							22,
    							20,
    							19,
    							17,
    							15,
    							14,
    							13,
    							11,
    							10,
    							9,
    							8,
    							7,
    							6,
    							5,
    							4,
    							3,
    							3,
    							2,
    							2,
    							1,
    							1,
    							0,
    							0,
    							0,
    							0,
    							0,
    							0,
    							0,
    							1,
    							1,
    							1,
    							2,
    							2,
    							3,
    							4,
    							4,
    							5,
    							6,
    							7,
    							8,
    							9,
    							10,
    							12,
    							13,
    							14,
    							16,
    							17,
    							19,
    							21,
    							22,
    							24,
    							26,
    							28,
    							30,
    							32,
    							34,
    							36,
    							39,
    							41,
    							43,
    							45,
    							48,
    							50,
    							53,
    							55,
    							58,
    							61,
    							63,
    							66,
    							69,
    							72,
    							74,
    							77,
    							80,
    							83,
    							86,
    							89,
    							92,
    							95,
    							98,
    							101,
    							104,
    							107,
    							110,
    							113,
    							116,
    							119,
    							122,
    };
    یه درخواست هم دارم. این کد واسه کامپایلر کدویژن نوشته نشده. همین کد توی کد ویژن چطوری میشه؟

    #2
    پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

    در این کد مقادیر یک جدول به ظاهر سینوسی، در فواصل زمانی متغیر (ناشی از نوع استفاده از متغیر delay) در OCR0 قرار داده و pwm خروجی بعد از بافر شدن به بلندگو متصل شده که مطابق فیلمی که آدرس آن را در تاپیک دیگری قرار داده اید، به صدایی شبیه آژیر منجر می شود:

    http://uploadtak.com/images/d1759_pwmsound.zip

    نحوه عملکرد کد به این صورت است که ابتدا متغیر delay از مقدار 0 شروع می شود و جدول سینوسی 50 بار با تاخیر متناظر با صفر خوانده و در OCR0 قرار می گیرد. با افزایش delay به یک، همین عملیات 49 بار و با تاخیر متناظر با delay=1 انجام می شود و به همین ترتیب که باعث کاهش فرکانس و کاهش تعداد سیکل های پخش شده در فرکانس های پائین تر می شود. در بخش دوم تولید شکل موج هم delay روند کاهشی خود را از 50 به مقادیر کمتر را طی می کند که بصورت برعکس باعث افزایش فرکانس و افزایش تعداد سیکل های تولید شده سینوسی در فرکانس های بالاتر می شود. مجموعه این دو بخش، پدیده کاهش و افزایش مداوم فرکانس را ایجاد می کند.
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

      تشکر آقای کی نژاد بابت پاسختون.
      یه موضوعی پیش اومده. من این برنامه رو واسه ATmega8A نوشتم به این صورت:


      کد:
      #ifndef F_CPU
      #define F_CPU 16934400UL
      #endif
      
      #include <avr/io.h>
      #include <util/delay.h>
      #include <avr/pgmspace.h>
      #include "sin.h"
      
      int main(void)
      {	
      	uint8_t i;
      	DDRB = 0x08;
      	TCCR2 = 0x69;
      	
        while(1)
        {
      		uint8_t delay,n;
          for (delay=1;delay<=50;delay++)
          {	
      			for (n=0;n<(51-delay);n++)
      			{
      				for (i=0;i<=254;i++)
      				{
      					OCR2=pgm_read_byte_near(sine+i);
      					_delay_loop_2(delay);
      				}
      			}
          }
          for (delay=50;delay>=2;delay--)
          {	
      			for (n=0;n<(51-delay);n++)
      			{
      				for (i=0;i<=254;i++)
      				{
      					OCR2=pgm_read_byte_near(sine+i);
      					_delay_loop_2(delay);
      				}
      			}
          }//TODO:: Please write your application code 
        }
      }
      من از atmel studio 6 استفاده میکنم. موقعی که برنامه رو دیباگ میکنم بهم اخطار میده که این اخطار ناشی از uint8_t i; توی تابع اصلی بالای تعریف پورت ها هستش. توی حلقه هم که میرسه قسمتی که با i کار میکنه مشکل پیدا میکنه. حالا بنظرتون مشکل کجاست؟ چرا اینجوری میشه؟

      یه سوال دیگه هم داشتم. این کتابخونه pgmspace.h کارش دقیقا چیه؟

      دیدگاه


        #4
        پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

        حالا که دوباره دیباگ کردم مشکلی ظاهرا نداشت. ارور که نداشتم. برنامه رو ساختم و منتقل کردم. فیوز بیت ها هم اینجوریه:



        ولی نمی دونم چرا درست کار نمیکنه!
        این فیلمش هستش. یه نگاه بندازین:


        http://uploadtak.com/images/a4693_01032013003.zip

        قبلا هم برنامه ای که سازنده واسه ATmega32 ساخته بود و گفته بود درسته منم امتحان کردم رو اتمگا 32 که داشتم ولی بازم نتیجه کار همین بود. اگه دقت کنید انگار صدا پایین هم میاد ولی بالا نمیره انگار. یه جورایی انگار یه مشکلی داره.
        بنظرتون کجای کار میلنگه؟

        دیدگاه


          #5
          پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

          برای تست و اگر مطابق برنامه کریستال 16 مگاهرتز متصل شده باشد، فیوزبیت CKOPT را برنامه ریزی کنید. CKSEL0 را هم در وضعیت 1 قرار دهید.
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            #6
            پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

            سلام دوستان لطفا کد زیر رو هم برای اینجانب تحلیل کنید



            /**************************************************************************************************
            * SSD1289 color Graphical LCD Display Driver
            * File name : SSD1289x16.h
            * Programmer : jaruwit supa
            * Web presence : www.thaibestlink.com
            * Note : SSD1289 16 bit interface
            * Language : avrGCC
            * Hardware : atmega16
            * Date : 01/05/2009
            ************************************************************************************************/

            #ifndef _SSD1289_INCLUDED_
            #define _SSD1289_INCLUDED_

            #include <io.h>
            #include <delay.h>

            /* _____HARDWARE DEFINES_____________________________________________________ */

            // LCM BL-TFT320420-32/28
            #define Horizontal
            // Horizontal and vertical screen size

            #define LCD_LO_DDR DDRA
            #define LCD_LO_PORT PORTA
            #define LCD_LO_PIN PINA

            #define LCD_HI_DDR DDRB
            #define LCD_HI_PORT PORTB
            #define LCD_HI_PIN PINB

            #define LCD_CS_DDR DDRD
            #define LCD_CS_PORT PORTD
            #define LCD_CS_PIN PIND
            #define LCD_CS_BIT 4

            #define LCD_RS_DDR DDRD
            #define LCD_RS_PORT PORTD
            #define LCD_RS_PIN PIND
            #define LCD_RS_BIT 3

            #define LCD_WR_DDR DDRD
            #define LCD_WR_PORT PORTD
            #define LCD_WR_PIN PIND
            #define LCD_WR_BIT 2

            #define LCD_RD_DDR DDRD
            #define LCD_RD_PORT PORTD
            #define LCD_RD_PIN PIND
            #define LCD_RD_BIT 1

            #define LCD_RST_DDR DDRD
            #define LCD_RST_PORT PORTD
            #define LCD_RST_PIN PIND
            #define LCD_RST_BIT 0

            #define LCD_INPUT() {LCD_LO_DDR = 0x00; LCD_HI_DDR = 0x00;} //YAK TABE DAR HAMIN JA TAERIF KADEH
            #define LCD_OUTPUT() {LCD_LO_DDR = 0xFF; LCD_HI_DDR = 0xFF;}

            #define LCD_SET_DBH LCD_HI_PORT
            #define LCD_SET_DBL LCD_LO_PORT

            #define LCD_GET_DBH() LCD_HI_PIN
            #define LCD_GET_DBL() LCD_LO_PIN

            #define LCD_SET_CS() LCD_CS_PORT |= 1<<LCD_CS_BIT // a|=b => a=a|b |=or bity
            #define LCD_CLR_CS() LCD_CS_PORT &= ~(1<<LCD_CS_BIT)
            #define LCD_DIR_CS(x) LCD_CS_DDR |= 1<<LCD_CS_BIT

            #define LCD_SET_RS() LCD_RS_PORT |= 1<<LCD_RS_BIT
            #define LCD_CLR_RS() LCD_RS_PORT &= ~(1<<LCD_RS_BIT)
            #define LCD_DIR_RS(x) LCD_RS_DDR |= 1<<LCD_RS_BIT

            #define LCD_SET_WR() LCD_WR_PORT |= 1<<LCD_WR_BIT
            #define LCD_CLR_WR() LCD_WR_PORT &= ~(1<<LCD_WR_BIT)
            #define LCD_DIR_WR(x) LCD_WR_DDR |= 1<<LCD_WR_BIT

            #define LCD_SET_RD() LCD_RD_PORT |= 1<<LCD_RD_BIT
            #define LCD_CLR_RD() LCD_RD_PORT &= ~(1<<LCD_RD_BIT)
            #define LCD_DIR_RD(x) LCD_RD_DDR |= 1<<LCD_RD_BIT

            #define LCD_SET_RST() LCD_RST_PORT |= 1<<LCD_RST_BIT
            #define LCD_CLR_RST() LCD_RST_PORT &= ~(1<<LCD_RST_BIT)
            #define LCD_DIR_RST(x) LCD_RST_DDR |= 1<<LCD_RST_BIT

            /* _____PUBLIC DEFINE_____________________________________________________ */

            #ifdef Horizontal
            #define SCREEN_HOR_SIZE 240UL
            #define SCREEN_VER_SIZE 320UL



            #else
            // Horizontal and vertical screen size
            #define SCREEN_HOR_SIZE 320UL
            #define SCREEN_VER_SIZE 240UL


            #endif

            // color
            #define BLACK RGB(0x00, 0x00, 0x00)
            #define WHITE RGB(0xFF, 0xFF, 0xFF)
            #define RED RGB(0xFF, 0x00, 0x00)
            #define GREEN RGB(0x00, 0xFF, 0x00)
            #define BLUE RGB(0x00, 0x00, 0xFF)
            #define YELLOW RGB(0xFF, 0xFF, 0x00)
            #define MAGENTA RGB(0xFF, 0x00, 0xFF)
            #define CYAN RGB(0x00, 0xFF, 0xFF)
            #define GRAY RGB(0x80, 0x80, 0x40)
            #define SILVER RGB(0xA0, 0xA0, 0x80)
            #define GOLD RGB(0xA0, 0xA0, 0x40)
            //******************

            /* _____PUBLIC VARIABLE_____________________________________________________ */
            extern unsigned int _color;

            /* _____PUBLIC FUNCTIONS_____________________________________________________ */
            extern void lcd_init(void);
            extern void lcd_setcursor(unsigned int x, unsigned int y);
            extern void lcd_setarea(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2);
            extern void lcd_write_pixel(unsigned int x, unsigned int y,unsigned int color) ;
            extern void lcd_bar(unsigned int left, unsigned int top, unsigned int right, unsigned int bottom, unsigned int color);
            extern void lcd_clear();
            extern void lcd_background_color(int color);
            extern void lcd_draw_symbol(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char t, flash unsigned char *pImage);
            extern void lcd_draw_image(unsigned int x, unsigned int y, flash unsigned char *pImage);
            extern void lcd_putchar(char character,int forground_color,int background_color);
            extern void lcd_putsf(flash char *string,int forground_color,int background_color);
            extern void lcd_gotoxy(unsigned char x,unsigned char y);
            extern void lcd_draw_line(int x0,int y0,int x1,int y1,int color);
            extern void lcd_draw_rectangle(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,int color);
            extern void lcd_draw_circle(unsigned int x0,unsigned int y0,unsigned int radius,char fill,int color);
            extern void lcd_puts(char *string,int forground_color,int background_color);
            /* _____DEFINE MACRO_________________________________________________________ */

            #define GetMaxX() ((unsigned int)SCREEN_HOR_SIZE-1)
            #define GetMaxY() ((unsigned int)SCREEN_VER_SIZE-1)

            #define RGB(red, green, blue) ((unsigned int)( (( red >> 3 ) << 11 ) | (( green >> 2 ) << 5 ) | ( blue >> 3 )))

            #define SetColor(color) _color = color
            #define GetColor() _color

            #endif


            unsigned int _color = 0xf92f;
            unsigned char x_text=0,y_text=0;

            flash char font8x16[97][16]= {
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
            0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, // !
            0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // "
            0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00,0x00, // #
            0x0C,0x0C,0x3E,0x63,0x61,0x60,0x3E,0x03,0x03,0x43,0x63,0x3E,0x0C,0x0C,0x00,0x00, // $
            0x00,0x00,0x00,0x00,0x00,0x61,0x63,0x06,0x0C,0x18,0x33,0x63,0x00,0x00,0x00,0x00, // %
            0x00,0x00,0x00,0x1C,0x36,0x36,0x1C,0x3B,0x6E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00, // &
            0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // '
            0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00,0x00,0x00,0x00, // (
            0x00,0x00,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x00,0x00,0x00,0x00, // )
            0x00,0x00,0x00,0x00,0x42,0x66,0x3C,0xFF,0x3C,0x66,0x42,0x00,0x00,0x00,0x00,0x00, // *
            0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00, // +
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00, // ,
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, // .
            0x00,0x00,0x01,0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00, // / (forward slash)
            0x00,0x00,0x3E,0x63,0x63,0x63,0x6B,0x6B,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00, // 0 0x30
            0x00,0x00,0x0C,0x1C,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00,0x00,0x00, // 1
            0x00,0x00,0x3E,0x63,0x03,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00,0x00, // 2
            0x00,0x00,0x3E,0x63,0x03,0x03,0x1E,0x03,0x03,0x03,0x63,0x3E,0x00,0x00,0x00,0x00, // 3
            0x00,0x00,0x06,0x0E,0x1E,0x36,0x66,0x66,0x7F,0x06,0x06,0x0F,0x00,0x00,0x00,0x00, // 4
            0x00,0x00,0x7F,0x60,0x60,0x60,0x7E,0x03,0x03,0x63,0x73,0x3E,0x00,0x00,0x00,0x00, // 5
            0x00,0x00,0x1C,0x30,0x60,0x60,0x7E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00, // 6
            0x00,0x00,0x7F,0x63,0x03,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x00,0x00,0x00,0x00, // 7
            0x00,0x00,0x3E,0x63,0x63,0x63,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00, // 8
            0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x3F,0x03,0x03,0x06,0x3C,0x00,0x00,0x00,0x00, // 9
            0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, // :
            0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00, // ;
            0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00, // <
            0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00, // =
            0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00, // >
            0x00,0x00,0x3E,0x63,0x63,0x06,0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00, // ?
            0x00,0x00,0x3E,0x63,0x63,0x6F,0x6B,0x6B,0x6E,0x60,0x60,0x3E,0x00,0x00,0x00,0x00, // @ 0x40
            0x00,0x00,0x08,0x1C,0x36,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x00,0x00,0x00,0x00, // A
            0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x33,0x33,0x33,0x33,0x7E,0x00,0x00,0x00,0x00, // B
            0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1E,0x00,0x00,0x00,0x00, // C
            0x00,0x00,0x7C,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7C,0x00,0x00,0x00,0x00, // D
            0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x31,0x33,0x7F,0x00,0x00,0x00,0x00, // E
            0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, // F
            0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x6F,0x63,0x63,0x37,0x1D,0x00,0x00,0x00,0x00, // G
            0x00,0x00,0x63,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, // H
            0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, // I
            0x00,0x00,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00, // J
            0x00,0x00,0x73,0x33,0x36,0x36,0x3C,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, // K
            0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7F,0x00,0x00,0x00,0x00, // L
            0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, // M
            0x00,0x00,0x63,0x63,0x73,0x7B,0x7F,0x6F,0x67,0x63,0x63,0x63,0x00,0x00,0x00,0x00, // N
            0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00,0x00,0x00, // O
            0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, // P 0x50
            0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x63,0x6B,0x6F,0x3E,0x06,0x07,0x00,0x00, // Q
            0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, // R
            0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x06,0x03,0x63,0x63,0x3E,0x00,0x00,0x00,0x00, // S
            0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, // T
            0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00, // U
            0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x08,0x00,0x00,0x00,0x00, // V
            0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x36,0x00,0x00,0x00,0x00, // W
            0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00,0x00, // X
            0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, // Y
            0x00,0x00,0x7F,0x63,0x43,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00,0x00, // Z
            0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00, // [
            0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x03,0x01,0x00,0x00,0x00,0x00, // \ (back slash)
            0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00, // ]
            0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, // _
            0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ` 0x60
            0x00,0x00,0x00,0x00,0x00,0x3C,0x46,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00, // a
            0x00,0x00,0x70,0x30,0x30,0x3C,0x36,0x33,0x33,0x33,0x33,0x6E,0x00,0x00,0x00,0x00, // b
            0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00,0x00, // c
            0x00,0x00,0x0E,0x06,0x06,0x1E,0x36,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00, // d
            0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x7E,0x60,0x63,0x3E,0x00,0x00,0x00,0x00, // e
            0x00,0x00,0x1C,0x36,0x32,0x30,0x7C,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, // f
            0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x66,0x3C,0x00,0x00, // g
            0x00,0x00,0x70,0x30,0x30,0x36,0x3B,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00,0x00, // h
            0x00,0x00,0x0C,0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, // i
            0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00, // j
            0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3C,0x36,0x33,0x73,0x00,0x00,0x00,0x00, // k
            0x00,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, // l
            0x00,0x00,0x00,0x00,0x00,0x6E,0x7F,0x6B,0x6B,0x6B,0x6B,0x6B,0x00,0x00,0x00,0x00, // m
            0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00, // n
            0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00, // o
            0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x3E,0x30,0x30,0x78,0x00,0x00, // p 0x70
            0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x0F,0x00,0x00, // q
            0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, // r
            0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x38,0x0E,0x03,0x63,0x3E,0x00,0x00,0x00,0x00, // s
            0x00,0x00,0x08,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x1B,0x0E,0x00,0x00,0x00,0x00, // t
            0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00, // u
            0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x36,0x1C,0x1C,0x08,0x00,0x00,0x00,0x00, // v
            0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x00,0x00,0x00,0x00, // w
            0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x1C,0x1C,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // x
            0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x3F,0x03,0x06,0x3C,0x00,0x00, // y
            0x00,0x00,0x00,0x00,0x00,0x7F,0x66,0x0C,0x18,0x30,0x63,0x7F,0x00,0x00,0x00,0x00, // z
            0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00, // {
            0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00, // |
            0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, // }
            0x00,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~
            0x00,0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // DEL
            };

            /* _____PRIVATE FUNCTIONS____________________________________________________ */
            /********************************************************************************************************
            * Function : void LCD_WrCmd(unsigned char cmd)
            * Description : This function performs low level command write to LCD
            * Input : cmd - is the command written to the LCD module
            * Returns : none
            * Notes : Hardware specific.
            *********************************************************************************************************/
            void lcd_WrCmd(unsigned char cmd)
            {
            LCD_CLR_CS(); // clear CS pin to ENABLE LCD

            LCD_CLR_RS();
            LCD_SET_DBL = cmd;
            LCD_SET_DBH = (cmd >> 8);
            LCD_CLR_WR();
            LCD_SET_WR();

            LCD_SET_CS(); // set CS pin to DISABLE LCD
            }

            /********************************************************************************************************
            * Function : void LCD_WrDat(unsigned int val)
            * Description : This function performs low level display data write to LCD
            * Arguments : val - is the data written to the LCD module
            * Returns : none
            * Notes : Hardware specific.
            ********************************************************************************************************/
            void lcd_WrDat(unsigned int val)
            {
            LCD_CLR_CS(); // clear CS pin to ENABLE LCD

            LCD_SET_RS();
            LCD_SET_DBL = val;
            LCD_SET_DBH = (val>>8);
            LCD_CLR_WR();
            LCD_SET_WR();

            LCD_SET_CS(); // set CS pin to DISABLE LCD
            }
            /*********************************************************************************************************
            * Function: void LCD_SetReg(unsigned char index, unsigned int val)
            * Input : index - register number
            * : val - value to be set
            * Returns : none
            * Notes : Hardware specific.
            **********************************************************************************************************/
            void lcd_SetReg(unsigned char index, unsigned int val)
            {
            lcd_WrCmd(index);
            lcd_WrDat(val);
            }

            /*********************************************************************************************************
            * Function : unsigned int LCD_GetReg(unsigned char index)
            * Description : This function performs low level read data register from LCD
            * Input: : index - register number
            * Return : register data
            * Notes : none
            **********************************************************************************************************/
            unsigned int lcd_GetReg(unsigned char index)
            {
            unsigned int ret;

            LCD_CLR_CS(); // clear CS pin to ENABLE LCD

            LCD_CLR_RS();
            LCD_SET_DBL = index;
            LCD_SET_DBH = (index >> 8);
            LCD_CLR_WR();
            LCD_SET_WR();

            LCD_INPUT(); // input mode
            LCD_CLR_RD();
            #asm ("nop");
            ret = LCD_GET_DBH();
            ret <<= 8;
            ret |= LCD_GET_DBL();
            LCD_SET_RD();
            LCD_SET_CS(); // set CS pin to DISABLE LCD

            LCD_OUTPUT(); // output data
            return ret;
            }

            /*********************************************************************************************************
            * Function : void LCD_InitPort(void)
            * Description : This function init lcd io
            * Input : none
            * Returns : none
            * Notes : none
            **********************************************************************************************************/
            void lcd_InitPort(void)
            {
            LCD_SET_DBH = 0xFF;
            LCD_SET_DBL = 0xFF;
            LCD_OUTPUT();

            // set default
            LCD_SET_CS();
            LCD_SET_RS();
            LCD_SET_WR();
            LCD_SET_RD();

            LCD_CLR_RST();

            // init direction
            LCD_DIR_CS(1);
            LCD_DIR_RS(1);
            LCD_DIR_WR(1);
            LCD_DIR_RD(1);
            LCD_DIR_RST(1);

            // reset module
            delay_ms(20);
            LCD_SET_RST();
            delay_ms(20);
            }

            /* _____PUBLIC FUNCTIONS_____________________________________________________ */

            /*********************************************************************************************************
            * Function : void LCD_Reset(void)
            * Description : This function reset lcd module
            * Input: : none
            * Returns : none
            * Notes : none
            **********************************************************************************************************/
            void lcd_init(void)
            {
            unsigned int driver_code;
            lcd_InitPort();

            driver_code = lcd_GetReg(0x00);
            LCD_LO_DDR = 0xFF;
            LCD_HI_DDR = 0xFF;

            LCD_LO_PORT = driver_code;
            LCD_HI_PORT = driver_code>>8;

            lcd_WrCmd(0x0000);lcd_WrDat(0x0001); //Start Oscillation OSCEN=1
            delay_ms(15);
            lcd_WrCmd(0x0003);lcd_WrDat(0xAAAC); //Power Control (1)
            lcd_WrCmd(0x000C);lcd_WrDat(0x0002); //Power Control (2)
            lcd_WrCmd(0x000D);lcd_WrDat(0x000A); //Power Control (3)
            lcd_WrCmd(0x000E);lcd_WrDat(0x2C00); //Power Control (4)
            lcd_WrCmd(0x001E);lcd_WrDat(0x00B8); //Power Control (5)
            delay_ms(15);
            lcd_WrCmd(0x0001);lcd_WrDat(0x2B3F); //Driver Output Control RL=0, REV=1, BGR=1, TB=1
            // LCD_WrCmd(0x0001);LCD_WrDat(0x6B3F); //Driver Output Control RL=1, REV=1, BGR=1, TB=1
            lcd_WrCmd(0x0002);lcd_WrDat(0x0600);
            // Restore VSYNC mode from low power state
            lcd_WrCmd(0x0010);lcd_WrDat(0x0000); //Sleep mode cancel
            lcd_WrCmd(0x0011);lcd_WrDat(0x6030); //Entry Mode
            // DFM 0x4000 = 262L color
            // DFM 0x6000 = 65K color
            // AM 0x0000 = horizontal display
            // AM 0x0008 = Vertical display
            // ID[0] 0x0000 = horizontal decrement
            // ID[0] 0x0010 = horizontal increment
            // ID[1] 0x0000 = Vertical decrement
            // ID[1] 0x0020 = Vertical decrement

            delay_ms(20);
            lcd_WrCmd(0x0005);lcd_WrDat(0x0000); // Compare register
            lcd_WrCmd(0x0006);lcd_WrDat(0x0000); // Compare register
            // Horizontal and Vertical porch are for DOTCLK mode operation
            lcd_WrCmd(0x0016);lcd_WrDat(0xEF1C); // Horizontal Porch
            lcd_WrCmd(0x0017);lcd_WrDat(0x0003); // Vertical Porch
            // Display Control
            lcd_WrCmd(0x0007);lcd_WrDat(0x0233); // Display Control
            // D1 0x0000 = display off
            // D1 0x0002 = display on
            // D0 0x0000 = internal display halt
            // D0 0x0001 = internal display operate


            lcd_WrCmd(0x000B);lcd_WrDat(0x5312); // Frame cycle control
            lcd_WrCmd(0x000F);lcd_WrDat(0x0000); // Gate Scan Position
            delay_ms(20);
            // Vertical Scroll Control
            lcd_WrCmd(0x0041);lcd_WrDat(0x0000); // Vertical Scroll Control
            lcd_WrCmd(0x0042);lcd_WrDat(0x0000); // Vertical Scroll Control

            // 1st Screen driving position
            lcd_WrCmd(0x0048);lcd_WrDat(0x0000); // Start position. 0
            lcd_WrCmd(0x0049);lcd_WrDat(0x013F); // End position. 319

            // Source RAM address
            lcd_WrCmd(0x0044);lcd_WrDat(0xEF00); //Horizontal RAM address position start/end setup
            //dec 239
            //dec 0, i.e. horizontal ranges from 0 -> 239
            //POR value is 0xEF00 anyway. This address must be set before RAM write

            lcd_WrCmd(0x0045);lcd_WrDat(0x0000); //Vertical RAM address start position setting
            //0x0000 = dec 0
            lcd_WrCmd(0x0046);lcd_WrDat(0x013F); //Vertical RAM address end position setting (0x013F = dec 319)

            // 2nd Screen driving position
            // LCD_WrCmd(0x004A);lcd_WrDat(0x0000); // Start position. 0
            // LCD_WrCmd(0x004B);lcd_WrDat(0x0000); // End position. 0
            delay_ms(20);
            //gamma control
            lcd_WrCmd(0x0030);lcd_WrDat(0x0707);
            lcd_WrCmd(0x0031);lcd_WrDat(0x0704);
            lcd_WrCmd(0x0032);lcd_WrDat(0x0204);
            lcd_WrCmd(0x0033);lcd_WrDat(0x0201);
            lcd_WrCmd(0x0034);lcd_WrDat(0x0203);
            lcd_WrCmd(0x0035);lcd_WrDat(0x0204);
            lcd_WrCmd(0x0036);lcd_WrDat(0x0204);
            lcd_WrCmd(0x0037);lcd_WrDat(0x0502);
            lcd_WrCmd(0x003A);lcd_WrDat(0x0302);
            lcd_WrCmd(0x003B);lcd_WrDat(0x0500);

            delay_ms(20);
            }

            /*********************************************************************
            * Function : void LCD_SetCursor(unsigned int x, unsigned int y)
            * Description : set start address of lcd ram
            * Input : x,y - pixel coordinates
            * Return : none
            * Note : set start address change
            ********************************************************************/
            void lcd_setcursor(unsigned int x, unsigned int y)
            {
            #ifdef Horizontal
            lcd_SetReg(0x4E,x); // initial settings for the GDDRAM X address in the address counter (AC).
            lcd_SetReg(0x4F,y); // initial settings for the GDDRAM Y address in the address counter (AC).
            #else
            lcd_SetReg(0x4E,y); // initial settings for the GDDRAM X address in the address counter (AC).
            lcd_SetReg(0x4F,x); // initial settings for the GDDRAM Y address in the address counter (AC).
            #endif
            lcd_WrCmd(0x22);
            }

            /*********************************************************************
            * Function : void LCD_SetArea(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
            * Description : set paint area
            * Input : x1,y1,x2,y2 - pixel coordinates
            * Return : none
            * Note : Side Effects: paint area change
            ********************************************************************/
            void lcd_setarea(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
            {
            #ifdef Horizontal
            lcd_WrCmd(0x44); lcd_WrDat((x2 << 8) | x1); // Source RAM address window
            lcd_WrCmd(0x45); lcd_WrDat(y1); // Gate RAM address window
            lcd_WrCmd(0x46); lcd_WrDat(y2); // Gate RAM address window
            #else
            lcd_WrCmd(0x44); lcd_WrDat((y2 << 8) | y1); // Source RAM address window
            lcd_WrCmd(0x45); lcd_WrDat(x1); // Gate RAM address window
            lcd_WrCmd(0x46); lcd_WrDat(x2); // Gate RAM address window
            #endif
            lcd_setcursor(x1, y1);;
            }

            /*********************************************************************
            * Function : void LCD_PutPixel(unsigned int x, unsigned int y)
            * Description : puts pixel
            * Input : x,y - pixel coordinates
            * Output : none
            * Note : none
            ********************************************************************/
            void lcd_write_pixel(unsigned int x, unsigned int y,unsigned int color)
            {
            lcd_setcursor(x,y);
            lcd_WrDat(color);
            }

            /*********************************************************************
            * Function : void LCD_Bar(unsigned int left, unsigned int top, unsigned int right, unsigned int bottom)
            * Description : draws rectangle filled with current color
            * Input : left,top - top left corner coordinates,
            * : right,bottom - bottom right corner coordinates
            * Output : none
            * Note :
            * CGRAM map
            * 00000...000EF line0
            * 00100...001EF line1
            * 00200...002EF line2
            * ....
            * 13F00...13FEF line320
            * yyyxx...yyyxx
            * address x = x
            * address y = y << 8
            * new line y = y + 0x100
            ********************************************************************/
            void lcd_bar(unsigned int left, unsigned int top, unsigned int right, unsigned int bottom, unsigned int color)
            {
            register unsigned int x,y;

            lcd_setarea(left, top, right, bottom);
            for(y=top; y<=bottom; y++)
            {
            for(x=left; x<=right; x++)
            {
            lcd_WrDat(color);
            }
            }
            lcd_setarea(0, 0, GetMaxX(), GetMaxY());
            }

            /*********************************************************************
            * Function : void LCD_Clear(unsigned int color)
            * Description : fill display with color
            * Input : color - paint color
            * Output : none
            * Note : none
            ********************************************************************/
            void lcd_clear()
            {
            // LCD_WrCmd(0x0007);LCD_WrDat(0x0221); // Display Control: display off
            lcd_bar(0, 0, GetMaxX(), GetMaxY(), 0xffff);
            // LCD_WrCmd(0x0007);LCD_WrDat(0x0233); // Display Control: display on
            }

            void lcd_background_color(int color)
            {
            lcd_bar(0, 0, GetMaxX(), GetMaxY(), color);
            }

            /*********************************************************************
            * Function : void DrawSymbol(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char t, unsigned char *pImage)
            * Description : display image array to lcd
            * Input : x,y - pixel coordinates
            * : w - width
            * : h - height
            * : t - compress type(0 = none(RGB565), 1 = compress(RGB5<compress bit>55)
            * : pImage - FLASH array of image
            * Output : none
            * Note : none
            ********************************************************************/
            void lcd_draw_symbol(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char t, flash unsigned char *pImage)
            {
            unsigned char colorMsb;
            unsigned char colorLsb;
            unsigned char colorDup = 0;
            unsigned int color=0;
            unsigned int x1,y1;

            // set draw area
            lcd_setarea(x,y,x+w-1,y+h-1);
            for (y1 = 0; y1<h ; y1++)
            {
            for (x1 = 0; x1<w ; x1++)
            {
            if (!colorDup)
            {
            colorMsb = *pImage++;
            colorLsb = *pImage++;
            if (t == 0x01)
            {
            colorDup = colorLsb & 0x20; // get duplicate flag
            colorLsb = colorLsb | 0x20; // remove duplicate flag and add more white
            }
            if (colorDup)
            colorDup = *pImage++; // get duplicate no
            color = ((unsigned int)colorMsb << 8) | colorLsb; // merge color
            SetColor(color); // set a pixel
            }
            else
            {
            colorDup--;
            }
            lcd_WrDat(color);
            }
            }
            lcd_setarea(0, 0, GetMaxX(), GetMaxY());
            }

            /*********************************************************************
            * Function : void DrawImage(unsigned int x, unsigned int y, unsigned char *pImage)
            * Description : display image array to lcd
            * Input : x,y - pixel coordinates
            * : pImage - FLASH array of image
            * Output : none
            * Note : ** modify image format here **
            * image format
            * <type 1 byte><width 2 byte><height 2 btye><image array n byte>
            ********************************************************************/
            void lcd_draw_image(unsigned int x, unsigned int y, flash unsigned char *pImage)
            {
            unsigned char t;
            unsigned int w, h;

            // get image information
            t = *pImage++; // image type
            w = *pImage++; // width
            w = (w << 8) | *pImage++;
            h = *pImage++; // Height
            h = (h << 8) | *pImage++;

            lcd_draw_symbol(x, y, w, h, t, pImage);
            }

            //*********************************************************************

            void lcd_gotoxy(unsigned char x,unsigned char y)
            {
            lcd_setcursor(x,y);
            if(x>40 || y>15)
            {
            y+=x/40;
            x%=40;
            }
            x_text=x;
            y_text=y;
            }

            void lcd_putchar(char character,int forground_color,int background_color)
            {
            int temporary_color;
            char character_segment_data,length_counter,width_counter;
            for(length_counter=0;length_counter<16;length_counter++)
            {
            character_segment_data=font8x16[character-0x20][length_counter];
            for(width_counter=0;width_counter<8;width_counter++)
            {
            if(character_segment_data&(0b10000000>>width_counter))
            lcd_write_pixel(((int)x_text*8)+width_counter,((int)y_text*16)+length_counter,forground_color);
            else
            {
            lcd_write_pixel(((int)x_text*8)+width_counter,((int)y_text*16)+length_counter,background_color);
            }
            }
            }

            if(++x_text>40)
            {
            x_text=0;
            if(++y_text>15) y_text=0;
            }
            }

            void lcd_putsf(flash char *string,int forground_color,int background_color)
            {
            while(*string)
            lcd_putchar(*string++,forground_color,background_color);
            }

            void lcd_draw_line(int x0,int y0,int x1,int y1,int color)
            {
            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;
            dx<<=1;
            lcd_write_pixel(x0,y0,color);
            if(dx>dy)
            {
            int fraction=dy-(dx>>1);
            while(x0!=x1)
            {
            if(fraction>=0)
            {
            y0+=stepy;
            fraction-=dx;
            }
            x0+=stepx;
            fraction+=dy;
            lcd_write_pixel(x0,y0,color);
            }
            }
            else
            {
            int fraction=dx-(dy>>1);
            while (y0 != y1)
            {
            if(fraction>=0)
            {
            x0+=stepx;
            fraction-=dy;
            }
            y0+=stepy;
            fraction+=dx;
            lcd_write_pixel(x0,y0,color);
            }
            }
            }

            void lcd_draw_rectangle(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,int color)
            {
            lcd_draw_line(x0,y0,x1,y0,color);
            lcd_draw_line(x1,y0,x1,y1,color);
            lcd_draw_line(x1,y1,x0,y1,color);
            lcd_draw_line(x0,y1,x0,y0,color);
            }


            void lcd_draw_circle(unsigned int x0,unsigned int y0,unsigned int radius,char fill,int color)
            {
            int x_offset,y_offset,error;
            x_offset=0;
            y_offset=radius;
            error=1-radius;

            do
            {
            if(fill)
            {
            lcd_draw_line(x0-x_offset,y0+y_offset,x0+x_offset,y0+y_offset,color);
            lcd_draw_line(x0-x_offset,y0-y_offset,x0+x_offset,y0-y_offset,color);
            lcd_draw_line(x0-y_offset,y0+x_offset,x0+y_offset,y0+x_offset,color);
            lcd_draw_line(x0-y_offset,y0-x_offset,x0+y_offset,y0-x_offset,color);
            }
            else
            {
            lcd_write_pixel(x_offset+x0,y_offset+y0,color);
            lcd_write_pixel(y_offset+x0,x_offset+y0,color);
            lcd_write_pixel(x0-x_offset,y_offset+y0,color);
            lcd_write_pixel(x0-y_offset,x_offset+y0,color);
            lcd_write_pixel(y_offset+x0,y0-x_offset,color);
            lcd_write_pixel(x_offset+x0,y0-y_offset,color);
            lcd_write_pixel(x0-x_offset,y0-y_offset,color);
            lcd_write_pixel(x0-y_offset,y0-x_offset,color);
            }

            if(error<0)
            error+=(3+(2*(x_offset++)));
            else
            error+=(5+(2*((x_offset++)-(y_offset--))));
            }while(x_offset<=y_offset);
            }

            void lcd_puts(char *string,int forground_color,int background_color)
            {
            while(*string)
            lcd_putchar(*string++,forground_color,background_color);
            }


            با تشکر
            جدیدترین ویرایش توسط شاهرخ مستقیمی; ۱۰:۴۲ ۱۳۹۶/۰۲/۰۹. دلیل: مخفی کردن کد ارسالی به علت طولانی بودن بیش از حد

            دیدگاه


              #7
              پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

              این کد کامل نیست ولی چیزی که میشه ازش فهمید یه ساختار شرطیه که اینجور که از اسم متغیرا پیداس مربوط به رنگ میشه سه رنگ اصلی قرمز سبز ابی
              میگه اگر قرمز بزرگتراز 3 و کوچیکر از 11 بود و سبز بزرگتر از 2 و کوچیکتر از 5 بود و آبی بزرگتر از 3 بود فلان کارو انجام بده

              دیدگاه


                #8
                پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

                نوشته اصلی توسط Reza Azimy_RW نمایش پست ها
                این کد کامل نیست ولی چیزی که میشه ازش فهمید یه ساختار شرطیه که اینجور که از اسم متغیرا پیداس مربوط به رنگ میشه سه رنگ اصلی قرمز سبز ابی
                میگه اگر قرمز بزرگتراز 3 و کوچیکر از 11 بود و سبز بزرگتر از 2 و کوچیکتر از 5 بود و آبی بزرگتر از 3 بود فلان کارو انجام بده
                دوست عزیزحتما یه حالی به زبان سی خودت بده ... >> یا << این علامت ها دستور شیفت تو زبان سی هستش ... هیچ ربطی به شرط نداره....

                دلیل: ادغام دو پست برای جلوگیری از اسپم

                نوشته اصلی توسط vahid2006 نمایش پست ها
                سلام دوستان لطفا کد زیر رو هم برای اینجانب تحلیل کنید

                #define RGB(red, green, blue) ((unsigned int)( (( red >> 3 ) << 11 ) | (( green >> 2 ) << 5 ) | ( blue >> 3 )))

                با تشکر
                دوست عیزیز این کد کامل نیست ... ادامه داره ...
                البته نیازی نیست تما این تابع بصورت define تعریف بشه ..... کد رو کامل بزار تا راهنماییت کنیم ....

                دیدگاه


                  #9
                  پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

                  سلام
                  کد رو اصلاح کردم و کد کامل رو نوشتم.راستی فقط می خوام بدونم این دستورات چیه که تو اون خط که قبلا خدمتتون فرستادم.
                  مابقی رو متوجه می شم.
                  ممنون

                  دیدگاه


                    #10
                    پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

                    نوشته اصلی توسط vahid2006 نمایش پست ها
                    سلام
                    کد رو اصلاح کردم و کد کامل رو نوشتم.راستی فقط می خوام بدونم این دستورات چیه که تو اون خط که قبلا خدمتتون فرستادم.
                    مابقی رو متوجه می شم.
                    ممنون
                    ببین این کدها دارن رنگهای پیش فرض رو به برنامت میشناسونه ...
                    تعریف رنگهای ال سی دی .....
                    البته نمیدونم تو کد شما چرا اونجوری تعریف شده ...
                    چون باید تابع RGB هم یه جا تعریف بشه ... ... تو این کدی که گذاشتی همچین چیزی ندیدم ...
                    ولی کلا رنگ ها رو تعریف کرده ...
                    ببین چون تو ال سی دی ها رنگهای مختلف باید یک عدد 16 بیتی و یا 24 بیتی باشه ، ولی در واقعیت رنگها رو از 3 یا 2 تا عدد
                    ما میشناسیم .... برای اینکه اون 2 یا 3 تا عدد بشه یکی باید ... مثلا برای داشتن یک عدد 24 بیتی باید 3 تا عدد 8 بیتی رو در یک عدد
                    32 بیتی شیفت بدیم .... یعنی اولی رو 24 تا و دومی رو 16 تا و سومی رو بدون شیفت انتقال میدیم داخل یک عدد 32 بیتی
                    مثال :

                    char R;
                    char G;
                    char B;
                    unsigned long Color:
                    Color = ( (unsigned long) R << 24) | ( (unsigned long) G << 16) | (unsigned long) B

                    البته اون خط کدی که داده بودی فکر کنم مبدل کد رنگ 24 بیتی به کد رنگ 16 بیتی هستش
                    جدیدترین ویرایش توسط microprocesor_2002; ۱۶:۱۷ ۱۳۹۶/۰۲/۰۷.

                    دیدگاه


                      #11
                      پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

                      دوست عزیزحتما یه حالی به زبان سی خودت بده ... >> یا << این علامت ها دستور شیفت تو زبان سی هستش ... هیچ ربطی به شرط نداره....
                      شرمنده من تو فاز سی شارپ بودم

                      دیدگاه


                        #12
                        پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

                        ممنون از راهنمایی مفیدتون

                        دیدگاه


                          #13
                          پاسخ : کمک در تحلیل کد(کیا می تونن این کد به زبان C رو برام تحلیل کنن؟)

                          دوستان خواهشا برای تشکر کردن، از دکمه ی تشکر استفاده بفرمایید که تاپیک شلوغ نشه. خیلی ممنونم

                          دیدگاه

                          لطفا صبر کنید...
                          X