亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lcd15xx.c

?? uCOS/uCGUI在2440上的移植
?? C
?? 第 1 頁 / 共 5 頁
字號:
  DataR_Valid= 0xff;                    /* All bits are valid. */
  #if (LCD_NUM_CONTROLLERS == 1)
    DataR_Cache= ReadVMem0();
  #else
    switch (CurController) {
    case 0:
      DataR_Cache= ReadVMem0(); break;
    case 1:
      DataR_Cache= ReadVMem1(); break;
    #if (LCD_NUM_CONTROLLERS >2)
    case 2:
      DataR_Cache= ReadVMem2(); break;
    #endif
    #if (LCD_NUM_CONTROLLERS >3)
    case 3:
      DataR_Cache= ReadVMem3(); break;
    #endif
    }
  #endif    /* LCD_NUM_CONTROLLERS == 1 */
}
#endif

#if (LCD_NUM_CONTROLLERS > 1)
typedef void (tWriteVMem)(void);
tWriteVMem* aWriteVMemX[] = {
  WriteVMem0,WriteVMem1
#if (LCD_NUM_CONTROLLERS >2)
  ,WriteVMem2
#endif
#if (LCD_NUM_CONTROLLERS >3)
  ,WriteVMem3
#endif
}; 
#endif 

static void Flush(void) {
  /* Nothing to write ? Then we are done !*/
  if (DataW_Dirty==0)
    return;
  /* All bits are dirty ? Then write`em all, dont read !!*/
  if (DataW_Dirty!=0xff) {
    /* Only some are dirty ... We have to read the byte ! */
    if (!DataR_Valid) {
      ReadData();         /* Get current byte in our cache */
    }
    DataW_Cache &= DataW_Dirty;
    DataW_Cache |= DataR_Cache & (~DataW_Dirty);
  }
  DataR_Cache = DataW_Cache;
#if (LCD_NUM_CONTROLLERS == 1)
  WriteVMem0();
#else
  aWriteVMemX[CurController]();
#endif
  DataW_Dirty = 0;              /* No more bits to write */
}

/*
        *****************************************
        *                                       *
        *         Find Byte                     *
        *                                       *
        *****************************************

Due to the setup options reg. the area of the display which is covered
by one LCD-controller and the fact that different display controllers
can controll arbitrary areas of the display as defined in the
config-file, It can be a tricky job to find out which display
controller is concerned, where in the video memory of that particular
controller the byte is located and how many bits are left (i.e. what
the minimal and maximal physical y-position is).
Note that this job is a lot easier in a single controller system,
where the entire routine could be placed in a macro.
*/
#if (LCD_SUPPORT_SEGTRANS==0)
  #define CALCCOL(Con) Col  = DataCacheX-LCD_XORG##Con
#else
  #define CALCCOL(Con) Col  = LCD__aRow2Seg##Con[DataCacheX-LCD_XORG##Con]
#endif

#if (LCD_SUPPORT_COMTRANS==0)
  #define CALCY(Con) \
    DataCacheY0 = DataCacheY &(~7);    \
    DataCacheY1 = DataCacheY0+  7;     \
    Page = (DataCacheY0-LCD_YORG##Con)>>3
#else
    #define CALCY(Con) \
    DataCacheY1 = DataCacheY0 = DataCacheY; \
    {                                       \
      int Com = LCD__aLine2Com##Con[DataCacheY-LCD_YORG##Con]; \
      Page = Com>>3;                                   \
      DataCacheYBit0 = DataCacheY-(Com&7);             \
    }
#endif

#define IF_INLEFT(Con)   if (DataCacheX >= LCD_XORG##Con)
#define IF_INRIGHT(Con)  if (DataCacheX <= LCD_XORG##Con+LCD_NUM_SEGS##Con-1)
#define IF_INTOP(Con)    if (DataCacheY >= LCD_YORG##Con)
#define IF_INBOTTOM(Con) if (DataCacheY <= LCD_YORG##Con+LCD_NUM_COMS##Con-1)

#define IF_INAREA(Con)                                    \
   IF_INRIGHT(Con)                                        \
   IF_INLEFT(Con)                                         \
   IF_INTOP(Con)                                          \
   IF_INBOTTOM(Con)


#define CALCXY(Con) \
  CALCCOL(Con);      \
  CALCY(Con);      \
  pCacheByte = &Cache##Con[Page][Col];  \
  CurController = Con;

/* This is an optimization for a single controller system */
  #if (LCD_NUM_CONTROLLERS == 1)
	#define FindByte() \
	CALCCOL(0); CALCY(0); pCacheByte = &Cache0[Page][Col];
/*	CALCCOL(0); CALCY(0); pCacheByte = &Cache0[Page][Col-LCD_FIRSTSEG0];*/
  #endif

/* This is an optimization for a 2 controller system */
#if (LCD_NUM_CONTROLLERS == 2)
  #if (LCD_XORG0==LCD_XORG1)
    #undef IF_INAREA
    #if (LCD_YORG0 == LCD_YORG)
      #define IF_INAREA(Con) IF_INBOTTOM(Con)
    #else
      #define IF_INAREA(Con) IF_INTOP(Con)
    #endif
	#define FindByte() IF_INAREA(0) { CALCXY(0); } else { CALCXY(1); }
  #endif
#endif

/* The actual routine ... */
#ifndef FindByte
static void FindByte(void) {
  #if (LCD_NUM_CONTROLLERS > 1)
  /* Check if controller 0 is concerned */
    IF_INAREA(0)
    {
      CALCXY(0);
      return;
    }
  /* Check if controller 1 is concerned, but only
     in a system with more than 2 controllers */
  #if (LCD_NUM_CONTROLLERS > 2)
    IF_INAREA(1)
  #endif
    {
      CALCXY(1);
      return;
    }
  /* Check if controller 2 is concerned */
    #if (LCD_NUM_CONTROLLERS > 3)
      #if (LCD_NUM_CONTROLLERS > 3)
      IF_INAREA(2)
      #endif
    {
      CALCXY(2);
      return;
    }
    #endif
  /* Check if controller 3 is concerned */
    #if (LCD_NUM_CONTROLLERS >3)
      #if (LCD_NUM_CONTROLLERS >4)
      IF_INAREA(3)
      #endif
    {
      CALCXY(3);
      return;
    }
    #endif
    /* This should never happen ! */
  #endif
}
#endif

/*
        *****************************************
        *                                       *
        *         Set new Position              *
        *                                       *
        *****************************************
*/

static void Goto(void) {
  U8* pCacheByteTemp[2];
  U8  PageTemp[2];
  U8  ColTemp[2];
  #if (LCD_NUM_CONTROLLERS > 1)
    U8  CurControllerTemp[2];
  #endif
  DataR_Valid=0;       /* No info about what's in the data byte */
  if (DataW_Dirty == 0) {
    FindByte();
    return;
  }
  /* Save the current values because FindByte will overwrite them */
  pCacheByteTemp[0]        = pCacheByte;
  PageTemp[0]              = Page;
  ColTemp[0]               = Col;
  #if (LCD_NUM_CONTROLLERS > 1)
    CurControllerTemp[0]     = CurController;
  #endif
  FindByte();
  if (pCacheByteTemp[0] != pCacheByte) {
    /* Save the new values */
    pCacheByteTemp[1]        = pCacheByte;
    PageTemp[1]              = Page;
    ColTemp[1]               = Col;
    #if (LCD_NUM_CONTROLLERS > 1)
      CurControllerTemp[1] = CurController;
    #endif
    /* Restore the old values for writing */
    pCacheByte        = pCacheByteTemp[0];
    Page              = PageTemp[0];
    Col               = ColTemp[0];
    #if (LCD_NUM_CONTROLLERS > 1)
      CurController = CurControllerTemp[0];
    #endif
    Flush();
    /* Restore the new (current) values */
    pCacheByte        = pCacheByteTemp[1];
    Page              = PageTemp[1];
    Col               = ColTemp[1];
    DataR_Valid=0;       /* We have no more info about what's in the data byte */
    #if (LCD_NUM_CONTROLLERS > 1)
      CurController = CurControllerTemp[1];
    #endif
  }
}

/*
        *****************************************
        *                                       *
        *         Set X and Y- Position         *
        *                                       *
        *****************************************

   Check if we already have the right byte in the buffer.
   This works only if COM-Lines are straight, otherwise it is just
   a waste of CPU-time.
*/

#if (LCD_SUPPORT_COMTRANS)
  #define GotoXY(x,y)                     \
    DataCacheY = y;                                                      \
    DataCacheX = x;                         \
    Goto()
#else
static void GotoXY(int x, int y) {
  DataCacheY = y;                                                          
  if ((x == DataCacheX) &&                  
      (y >= DataCacheY0) &&     (y <= DataCacheY1))
  {
    return;                                 
  }                                         
  DataCacheX = x;                         
  Goto();
}
#endif

/*
        *****************************************
        *                                       *
        *         Set Y- Position               *
        *                                       *
        *****************************************
*/

#if (!LCD_SUPPORT_COMTRANS)     /* Only used if COMs are straight ! */
static void GotoY(int y) {
/* Check if we already have the right byte in the buffer.
   This works only if COM-Lines are straight, otherwise it is just
   a waste of CPU-time.
 */
  DataCacheY = y;    
  if ((y >= DataCacheY0) && (y <= DataCacheY1))
    return;
  Goto();
}
#endif


#if (LCD_SUPPORT_COMTRANS)
#define GotoYPlus1()           \
  DataCacheY++;                \
        Goto()
#else
static void GotoYPlus1(void) {
  DataCacheY++;
  if ((DataCacheY >= DataCacheY0) && (DataCacheY <= DataCacheY1))
    return;
        Goto();
}
#endif

/*
  ********************************************************************
  *                                                                  *
  *                Drawing routines, internal                        *
  *                                                                  *
  ********************************************************************
*/

static const U8 Bit2Mask[] = { 1,2,4,8,16,32,64,128 };

/*
        *****************************************
        *                                       *
        *           Xor pixel                   *
        *                                       *
        *****************************************
*/

/*
static void XORPIXEL() {
  U8 HWMask;
  LOADDATA();
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];
  DataW_Dirty |= HWMask;
  DataW_Cache ^= HWMask;
}
*/
#define XORPIXEL() {                             \
  U8 HWMask;\
  LOADDATA(); /* For XOR operations, the byte needs to be loaded */ \
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];\
  DataW_Dirty |= HWMask;\
  DataW_Cache ^= HWMask;\
}

static void XorPixel(void) {
  XORPIXEL();
}

/*
        *****************************************
        *                                       *
        *     Set pixel, internal drawing       *
        *                                       *
        *****************************************
*/
/*
static void SETPIXEL() {
  U8 HWMask;
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];
  DataW_Dirty |= HWMask;
  DataW_Cache |= HWMask;
}
*/
#define SETPIXEL() {                             \
  U8 HWMask;										 \
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];	 \
  DataW_Dirty |= HWMask;							 \
  DataW_Cache |= HWMask;							 \
}

static void SetPixel(void) {
  SETPIXEL();
}

/*
        *********************************************************
        *                                                       *
        *       LCD_L0_XorPixel                                 *
        *                                                       *
        *********************************************************

Purpose:  This routine is called by emWin. It writes 1 pixel into the
          display.

*/

void LCD_L0_XorPixel(int x, int y) {
  GotoXY(x,y);
  LOADDATA();
  XORPIXEL();
}

/*
        *****************************************
        *                                       *
        *       Clear pixel                     *
        *                                       *
        *****************************************
*/

/*
static v

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久人人爽人人爽| 天天爽夜夜爽夜夜爽精品视频| 国产欧美精品一区二区色综合朱莉| 亚洲色图一区二区| 久久精品国产精品亚洲红杏| 一本一本久久a久久精品综合麻豆| 日韩亚洲欧美在线观看| 一个色综合网站| 成人美女视频在线观看18| 日韩欧美激情在线| 午夜欧美在线一二页| 91美女精品福利| 国产色产综合产在线视频| 日本欧美加勒比视频| 欧美性一二三区| 亚洲精品欧美综合四区| 99视频一区二区三区| 久久久777精品电影网影网| 久久精品国产99国产| 日韩欧美色电影| 日韩精品三区四区| 欧美日韩精品系列| 亚洲免费成人av| 色综合久久久久久久久久久| 国产精品少妇自拍| 韩国av一区二区三区四区| 欧美一区二区三区系列电影| 午夜日韩在线电影| 欧美精品少妇一区二区三区| 一区二区三区四区不卡在线| 97久久超碰国产精品| 国产精品国产三级国产普通话三级| 国产在线精品一区二区夜色| 欧美精品一区二区三区高清aⅴ| 狠狠色丁香婷综合久久| 精品毛片乱码1区2区3区| 精品一二三四区| www国产精品av| 国产一区二区三区香蕉| 国产精品美女久久久久av爽李琼| 成人国产电影网| 亚洲图片另类小说| 91成人免费网站| 亚洲香肠在线观看| 日韩一本二本av| 国产一区二区三区在线观看精品| 久久精品综合网| 91在线观看视频| 午夜欧美2019年伦理| 日韩精品专区在线影院观看| 韩国精品免费视频| 中文字幕在线不卡国产视频| 欧美日韩综合一区| 久久99久久99小草精品免视看| 久久久精品免费免费| 99re热这里只有精品视频| 一区二区在线观看av| 欧美美女网站色| 黄色成人免费在线| 亚洲免费资源在线播放| 日韩一区二区精品葵司在线| 成人一区在线观看| 亚洲国产美女搞黄色| 久久精品一区蜜桃臀影院| 91丝袜国产在线播放| 毛片av一区二区三区| 国产精品免费丝袜| 日韩一区二区三区精品视频| 国产91高潮流白浆在线麻豆| 五月婷婷激情综合网| 久久久久久久网| 欧美在线一二三| 精品一区二区久久久| 亚洲综合一区二区| 欧美精品一区二区三区久久久| 色国产精品一区在线观看| 久久电影网站中文字幕| 亚洲综合男人的天堂| 欧美激情一区二区三区不卡| 精品视频在线免费| www.成人在线| 精品在线亚洲视频| 亚洲国产精品嫩草影院| 国产精品久久99| 26uuu欧美日本| 91麻豆精品国产91久久久久久久久 | 激情五月婷婷综合网| 一区二区三区欧美视频| 国产精品伦理一区二区| 精品成人一区二区三区| 制服丝袜亚洲色图| 91黄色在线观看| 成人h动漫精品一区二| 国精产品一区一区三区mba桃花| 亚洲国产精品视频| 亚洲乱码国产乱码精品精可以看| 欧美国产精品中文字幕| 精品少妇一区二区| 4438x成人网最大色成网站| 日本韩国视频一区二区| 99在线精品一区二区三区| 国产成人av电影在线| 精东粉嫩av免费一区二区三区| 免费在线观看精品| 日韩精品电影在线观看| 偷拍亚洲欧洲综合| 亚洲国产精品久久久久婷婷884| 国产精品久久久久久久第一福利| 久久久久久久性| 久久久99精品久久| 欧美激情一区在线| 国产免费观看久久| 国产精品你懂的在线| 中文字幕精品综合| 国产精品久久综合| 中文字幕在线观看一区二区| 欧美激情艳妇裸体舞| 中文字幕av一区二区三区免费看 | 欧美三级中文字| 欧美在线观看一二区| 欧美日韩国产高清一区二区三区| 在线观看中文字幕不卡| 欧美久久婷婷综合色| 欧美夫妻性生活| 欧美精品九九99久久| 91精品综合久久久久久| 日韩精品一区二区三区在线观看| 日韩三级av在线播放| 久久综合国产精品| 国产日韩欧美亚洲| 亚洲区小说区图片区qvod| 亚洲自拍与偷拍| 午夜精品久久久久久久久| 毛片av一区二区| 成人精品国产免费网站| 欧美亚洲自拍偷拍| 日韩一二三区视频| 国产日韩一级二级三级| 自拍av一区二区三区| 亚洲福利视频一区| 国产一区二区视频在线播放| av一区二区三区四区| 欧美日韩国产一区| 久久网站最新地址| 亚洲美女精品一区| 青椒成人免费视频| 国产一区二区精品久久91| 99精品欧美一区二区三区综合在线| 欧美性大战久久久久久久| 久久伊人中文字幕| 一区二区三区视频在线观看| 精品一区二区免费| 日本韩国精品在线| 精品少妇一区二区三区| 亚洲免费在线电影| 久久99精品久久久久久| 色综合欧美在线视频区| 精品国产免费一区二区三区四区 | 亚洲一区二区三区不卡国产欧美| 免费精品视频在线| 一本色道久久加勒比精品 | 欧美日韩在线一区二区| 国产日韩综合av| 天天综合色天天| 91网站在线播放| 久久久久久黄色| 五月开心婷婷久久| 91在线播放网址| 久久综合精品国产一区二区三区| 午夜精品久久久久久久蜜桃app| 国产suv精品一区二区三区| 欧美高清激情brazzers| 亚洲免费观看高清| 成人午夜私人影院| 精品国产一区二区三区四区四| 亚洲一区欧美一区| 不卡免费追剧大全电视剧网站| 精品少妇一区二区三区视频免付费 | caoporn国产一区二区| 日韩精品中午字幕| 日韩国产欧美在线视频| 欧美图区在线视频| 亚洲精品国产一区二区三区四区在线 | 久久久久亚洲综合| 久久精品国产一区二区三 | 日本一区二区在线不卡| 韩国在线一区二区| 日韩无一区二区| 亚洲成人av一区二区三区| 99精品在线观看视频| 中文字幕在线一区| 成人天堂资源www在线| 久久久欧美精品sm网站| 国产真实乱对白精彩久久| 欧美mv日韩mv国产网站app| 五月激情六月综合| 欧美人与z0zoxxxx视频| 香蕉成人啪国产精品视频综合网| 欧美亚洲动漫精品| 亚洲高清视频的网址|