📄 lcd44b0.c
字号:
/*********************************************************************************************************** uC/GUI* Universal graphic software for embedded applications** (c) Copyright 2002, Micrium Inc., Weston, FL* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH** 礐/GUI is protected by international copyright laws. Knowledge of the* source code may not be used to write a similar product. This file may* only be used in accordance with a license and should not be redistributed* in any way. We appreciate your understanding and fairness.*----------------------------------------------------------------------File : LCD44B0.CPurpose : Driver for LCDs using a HD66789 controller---------------------------------------------------------------------- Version-Date---Author-Explanation ---------------------------------------------------------------------- 1.00b 020204 JE a) Hardwareinterface routines renamed: ...DATA -> ...A1, ...CMD -> ...A0---------------------------LIST OF CONFIG SWITCHES--------------------The following is a list of additional configuration switches for thisdriver. These switches might not be listed in the manual, becausethe manual mainly covers the general config switches which aresupported by all drivers.----------------------------------------------------------------------Known problems or limitations with current version------------------------------------------------------------------------------------------------------Open issues----------------------------------------------------------------------none---------------------------END-OF-HEADER------------------------------*/#include <string.h> /* for memset */#include <stddef.h> /* needed for definition of NULL */#include "LCD_Private.h" /* private modul definitions & config */#include "GUI_Private.h"#include "GUIDebug.h"#include "LCD_0.h" /* Defines for first display */#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH 18#endif #define BKCOLOR LCD_BKCOLORINDEX#define COLOR LCD_COLORINDEX#define lcd_BASE_ADDRESS 0x06000000 /* parallel CS3 */static U16 frameBuffer[LCD_YSIZE_PHYS][LCD_XSIZE_PHYS];void Init_data1(unsigned int data) ; void Init_data2(unsigned int reg) ; void display_num(unsigned int x,unsigned int y,unsigned char *pic);void display_id(unsigned int x,unsigned int y,unsigned int id_value);unsigned int lcd_ic_id(void);/*************************************************************** write pixel data***************************************************************/ void Init_data(unsigned int reg,unsigned int data) { unsigned long int reg_18bit,data_18bit; reg_18bit=(reg&0xff)<<1|(reg&0xff00)<<2; data_18bit=(data&0xff)<<1|(data&0xff00)<<2; (*(volatile unsigned short *) (lcd_BASE_ADDRESS +0x0))=(unsigned long int)reg_18bit; (*(volatile unsigned short *) (lcd_BASE_ADDRESS+0x04))=(unsigned long int )data_18bit; } void Init_data3(unsigned int reg,unsigned int data) { unsigned long int reg_18bit,dat_18bit; reg_18bit=(reg&0xff)<<1|(reg&0xff00)<<2; dat_18bit=(data&0x7ff)<<1|(data&0xf800)<<2; (*(volatile unsigned short *) (lcd_BASE_ADDRESS +0x0))=(unsigned long int)reg_18bit; (*(volatile unsigned short *) (lcd_BASE_ADDRESS+0x04))=(unsigned long int)data<<1; } void Init_data4(unsigned int reg,unsigned int data) { unsigned long int reg_18,dat_18; reg_18=(reg&0xff)<<1|(reg&0xff00)<<2; dat_18=(((unsigned long int)data&0x7ff)<<1)|(((unsigned long int)data&0xf800)<<2); (*(volatile unsigned long *) (lcd_BASE_ADDRESS +0x0))=reg_18; (*(volatile unsigned long *) (lcd_BASE_ADDRESS+0x04))=dat_18; } void Init_data5(unsigned int reg,unsigned long int data) { unsigned long int reg_18; reg_18=(reg&0xff)<<1|(reg&0xff00)<<2; (*(volatile unsigned short *) (lcd_BASE_ADDRESS +0x0))=(unsigned long int)reg_18; (*(volatile unsigned short *) (lcd_BASE_ADDRESS+0x04))=(unsigned long int)data; } void Init_data1(unsigned int data) { unsigned long int data_18bit; data_18bit=(data&0xff)<<1|(data&0xff00)<<2; (*(volatile unsigned short *) (lcd_BASE_ADDRESS +0x04))=(unsigned long int)data_18bit; }void Init_data2(unsigned int reg) { unsigned long int reg_18bit; reg_18bit=(reg&0xff)<<1|(reg&0xff00)<<2; (*(volatile unsigned short *) (lcd_BASE_ADDRESS +0x0))=(unsigned long int)reg_18bit; }/* unsigned short read_data(void) { unsigned short dat; *(volatile unsigned short *) (lcd_BASE_ADDRESS +0x0)=0x0022; dat=*(volatile unsigned short *)(lcd_BASE_ADDRESS+0x04); dat=*(volatile unsigned short *)(lcd_BASE_ADDRESS+0x04); return(dat);}/*********************************************** Draw Bitmap 1 BPP************************************************/static void _DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) { LCD_PIXELINDEX Index0 = *(pTrans+0); LCD_PIXELINDEX Index1 = *(pTrans+1); x += Diff; switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { case 0: do { LCD_L0_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0); if (++Diff == 8) { Diff = 0; p++; } } while (--xsize); break; case LCD_DRAWMODE_TRANS: do { if (*p & (0x80 >> Diff)) LCD_L0_SetPixelIndex(x, y, Index1); x++; if (++Diff == 8) { Diff = 0; p++; } } while (--xsize); break; case LCD_DRAWMODE_XOR:; do { if (*p & (0x80 >> Diff)) { int Pixel = LCD_L0_GetPixelIndex(x, y); LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel); } x++; if (++Diff == 8) { Diff = 0; p++; } } while (--xsize); break; }}/*********************************************** Draw Bitmap 2 BPP************************************************/#if (LCD_MAX_LOG_COLORS > 2)static void _DrawBitLine2BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) { LCD_PIXELINDEX Pixels = *p; int CurrentPixel = Diff; x += Diff; switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { case 0: do { int Shift = (3 - CurrentPixel) << 1; int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; LCD_PIXELINDEX PixelIndex = *(pTrans + Index); LCD_L0_SetPixelIndex(x++, y, PixelIndex); if (++CurrentPixel == 4) { CurrentPixel = 0; Pixels = *(++p); } } while (--xsize); break; case LCD_DRAWMODE_TRANS: do { int Shift = (3 - CurrentPixel) << 1; int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift; if (Index) { LCD_PIXELINDEX PixelIndex = *(pTrans + Index); LCD_L0_SetPixelIndex(x, y, PixelIndex); } x++; if (++CurrentPixel == 4) { CurrentPixel = 0; Pixels = *(++p); } } while (--xsize); break; }}#endif/*********************************************** Draw Bitmap 4 BPP************************************************/#if (LCD_MAX_LOG_COLORS > 4)static void _DrawBitLine4BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) { LCD_PIXELINDEX Pixels = *p; int CurrentPixel = Diff; switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { case 0: do { int Shift = (1 - CurrentPixel) << 2; int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; LCD_PIXELINDEX PixelIndex = *(pTrans + Index); LCD_L0_SetPixelIndex(x++, y, PixelIndex); if (++CurrentPixel == 2) { CurrentPixel = 0; Pixels = *(++p); } } while (--xsize); break; case LCD_DRAWMODE_TRANS: do { int Shift = (1 - CurrentPixel) << 2; int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift; if (Index) { LCD_PIXELINDEX PixelIndex = *(pTrans + Index); LCD_L0_SetPixelIndex(x, y, PixelIndex); } x++; if (++CurrentPixel == 2) { CurrentPixel = 0; Pixels = *(++p); } } while (--xsize); break; }}#endif/*********************************************** Draw Bitmap 8 BPP************************************************/#if (LCD_MAX_LOG_COLORS > 16)static void _DrawBitLine8BPP(int x, int y, U8 const * p, int xsize, const LCD_PIXELINDEX * pTrans) { LCD_PIXELINDEX Pixel; switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) { case 0: if (pTrans) { for (; xsize > 0; xsize--, x++, p++) { Pixel = *p; LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel)); } } else { for (; xsize > 0; xsize--, x++, p++) { LCD_L0_SetPixelIndex(x, y, *p); } } break; case LCD_DRAWMODE_TRANS: if (pTrans) { for (; xsize > 0; xsize--, x++, p++) { Pixel = *p; if (Pixel) { LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel)); } } } else { for (; xsize > 0; xsize--, x++, p++) { Pixel = *p; if (Pixel) { LCD_L0_SetPixelIndex(x, y, Pixel); } } } break; }}#endif/*********************************************** Draw Bitmap 16 BPP************************************************/#if (LCD_BITSPERPIXEL > 8)static void DrawBitLine16BPP(int x, int y, U16 const * p, int xsize, const LCD_PIXELINDEX * pTrans) { LCD_PIXELINDEX pixel; if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) { if (pTrans) { for (; xsize > 0; xsize--, x++, p++) { pixel = *p; LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel)); } } else { for (;xsize > 0; xsize--, x++, p++) { LCD_L0_SetPixelIndex(x, y, *p); } } } else { if (pTrans) { for (; xsize > 0; xsize--, x++, p++) { pixel = *p; if (pixel) { LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel)); } } } else { for (; xsize > 0; xsize--, x++, p++) { pixel = *p; if (pixel) { LCD_L0_SetPixelIndex(x, y, pixel); } } } }}#endif/*********************************************************************** Exported functions************************************************************************//*********************************************** LCD_L0_SetPixelIndex***********************************************Purpose: Sets the index of the given pixel. The upper layers of emWin calling this routine make sure that the coordinates are in range, so that no check on the parameters needs to be performed.*/void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) { // unsigned Off; // U16 Data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -