📄 lcmdriver.c
字号:
#include "includes.h"
/*全局变量定义*/
uint16 LcmOrigin_x , LcmOrigin_y;
uint16 LcmCursor_x , LcmCursor_y; //光标位置
uint8 bLcd_data,bHeight=16,gv_f2ndScreen=0,fReverse=0,fUnderline=0,fFormat,fmodeX=0,fmodeY=0;
//bLcd_data:记录汉字的区位码缓冲 bHeight:记录字体的高度 f2ndSreen:切换显示屏标志 fReverse:字体反向显示标志 fUnderline 字体加下划线标志
uint8 gv_linemode=0;
void SetFont(uint8 font) //设置字体高度
{
bHeight=font;
}
/**************************************************************************
** 函数名称: ClearLcm
** 功能描述: 清屏
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: gv_f2ndScreen : 换屏标志
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月09日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void ClearLcm(void)
{
uint16 loop;
unsigned char *pChar;
if(gv_f2ndScreen == 0)
{
pChar = (unsigned char*)LCD_ACTIVE_BUF1; //指向图形缓冲区1
for(loop=0;loop<9600;loop++)
{
*pChar=0x00;
pChar++;
}
}
else
{
pChar = (unsigned char*)LCD_ACTIVE_BUF2; //指向图形缓冲区2
for(loop=0;loop<9600;loop++)
{
*pChar=0x00;
pChar++;
}
}
LcmCursor_x=0;
LcmCursor_y=0;
}
/**************************************************************************
** 函数名称: LcmInit
** 功能描述: 初始化液晶控制器
**
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月09日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void LCD_Initialize(void)
{
rPCOND=0xaaaa; //端口D配置成LCD控制引脚
//rPUPD=0x0;
//rPDATD=0xff;
rDITHMODE=0x12210; //抖动模式设定
rDP1_2=0xa5a5; //以下为抖动时间设置
rDP4_7=0xba5da65;
rDP3_5=0xa5a5f;
rDP2_3=0xd6b;
rDP5_7=0xeb7b5ed;
rDP3_4=0x7dbe;
rDP4_5=0x7ebdf;
rDP6_7=0x7fdfbfe;
ClearLcm();
SwitchLcm(1);
ClearLcm();
SwitchLcm(0);
rLCDCON1=(ENVID_DIS)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(LINEBLANK<<21);
rLCDSADDR1= (MODESEL<<27)|((LCD_ACTIVE_BUF1>>22)<<21)|M5D(LCD_ACTIVE_BUF1>>1);
rLCDSADDR2= (BSWP<<29) |M5D(((LCD_ACTIVE_BUF1 + ((LCD_XSIZE*LCD_YSIZE)/8))>>1))|(MVAL<<21);
rLCDSADDR3= (LCD_XSIZE/4) | ( 0<<9 );
rLCDCON1=(ENVID_EN)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
}
uint8 GetLcmNum(void)
{
if(gv_f2ndScreen) return 1;
else return 0;
}
void SelectScreen(uint8 i)
{
if(i==0) gv_f2ndScreen=0;
else gv_f2ndScreen=1;
}
/**********************************************************
*
* 函数名: void SwitchLcd(U8 LCD_Section)
* 功 能: 切换显示屏
* 说 明:
* 设计人:欧阳鹏
* 设计时间:2006-05-14
* 入口参数:显示屏区域的选择
* 出口参数:无
***********************************************************/
void SwitchLcm(uint8 Section) //切换显示屏
{
rLCDCON1=(ENVID_DIS)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(LINEBLANK<<21); //lcd屏的尺寸为320x240
//CloseInterrupt(); //为防止中断对LINECNT的影响,禁止中断
if (Section==0)
{
gv_f2ndScreen=0;
rLCDSADDR1= (MODESEL<<27)|((LCD_ACTIVE_BUF1>>22)<<21)|M5D(LCD_ACTIVE_BUF1>>1);
rLCDSADDR2= (BSWP<<29) |M5D(((LCD_ACTIVE_BUF1+((LCD_XSIZE*LCD_YSIZE)/8))>>1))|(MVAL<<21);
}
else
{
gv_f2ndScreen=1;
rLCDSADDR1= (MODESEL<<27)|((LCD_ACTIVE_BUF2>>22)<<21)|M5D(LCD_ACTIVE_BUF2>>1);
rLCDSADDR2= (BSWP<<29) |M5D(((LCD_ACTIVE_BUF2 + ((LCD_XSIZE*LCD_YSIZE)/8))>>1))|(MVAL<<21);
}
rLCDCON1=(ENVID_EN)|(INVVD<<0)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(DISMODE<<5)|(MMODE<<7)|(WDLY<<8)|(WLH<<10)|(CLKVAL<<12);
//OpenInterrupt();
}
/**************************************************************************
** 函数名称: GUI_Point
** 功能描述: 设置相对屏幕的零点
**
** 输 入: int16 x,int16 y 点位置
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
void SetLcmOrigin(uint16 x, uint16 y)
{
LcmOrigin_x = x;
LcmOrigin_y = y;
}
void SetCordinateMode(uint8 xmode,uint8 ymode)
{
fmodeX=xmode;
fmodeY=ymode;
}
/****************************************************************************
* 与LCM相关的GUI接口函数
****************************************************************************/
/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat 填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
* 出口参数:无
****************************************************************************/
void GUI_FillSCR(uint8 dat)
{
uint32 loop;
unsigned char *pChar;
if(gv_f2ndScreen == 0)
{
pChar = (unsigned char*)LCD_ACTIVE_BUF1; //指向图形缓冲区1
for(loop=0;loop<9600;loop++)
{
*pChar=dat;
pChar++;
}
}
else
{
pChar = (unsigned char*)LCD_ACTIVE_BUF2; //指向图形缓冲区2
for(loop=0;loop<9600;loop++) *pChar++=dat;
}
//LcmCursor_x=0;
// LcmCursor_y=0;
}
/****************************************************************************
* 名称:GUI_Initialize()
* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void GUI_Initialize(void)
{
LCD_Initialize(); // 初始化LCM模块工作模式,纯图形模式
GUI_FillSCR(0x00); // 初始化缓冲区为0x00,并输出屏幕(清屏)
}
/****************************************************************************
* 名称:GUI_ClearSCR()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void GUI_ClearSCR(void)
{
GUI_FillSCR(0x00);
}
/**************************************************************************
** 函数名称: GUI_Point
** 功能描述: 描点 坐标原点为屏幕左上角
**
** 输 入: int16 x,int16 y 点位置
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 欧阳鹏
** 日 期: 2007年10月10日
**-------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------
**************************************************************************/
/* 定义十进制(0-7)==>十六进制位转换表,由于显示点数据是由左到右,所以十六进制位顺序是倒的 */
uint8 const DCB2HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
uint8 GUI_Point(uint32 x, uint32 y, TCOLOR color)
{
uint32 addr; //要送数据的地址
uint8 point_dat,orig_point; //显示数据
uint8 *pDisp;
if(fmodeX==1) x=-x; //x的正方向确定 如果fmodeX=0 正方向朝右 如果fmodeX=1 正方向朝左
if(fmodeY==1) y=-y; //y的正方向确定 如果fmodeY=0 正方向朝下 如果fmodeY=1 正方向朝上
x = x + LcmOrigin_x; //由相对坐标x得到 实际的坐标x
y = y + LcmOrigin_y; //由相对坐标y得到 实际的坐标y
if(gv_f2ndScreen == 0)
{
pDisp = (uint8 *) LCD_ACTIVE_BUF1;
}
else
{
pDisp = (uint8 *) LCD_ACTIVE_BUF2;
}
addr = (x)/8+y*SCR_LINE;
point_dat=*(pDisp+addr);
orig_point=point_dat;
if((color&0x1)!=0)
{
if(gv_linemode==0)
{
point_dat =(uint8)(0x80 >> ((uint16)x%8)); //显示的实际数据,将点位置转换成字节数据
point_dat =~(point_dat ^ (~orig_point));
}
else
point_dat=point_dat | DCB2HEX_TAB[x&0x7];
}
else point_dat=point_dat &(~DCB2HEX_TAB[x&0x7]);
*(pDisp+addr)=point_dat;
return 1;
}
/****************************************************************************
* 名称:GUI_Line()
* 功能:画水平线。
* 入口参数: x0 水平线起点所在列的位置
* y0 水平线起点所在行的位置
* x1 水平线终点所在列的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void LCD_Line(int startx,int starty,int endx,int endy, TCOLOR color)
{
int dx,dy,e;
dx=endx-startx;
dy=endy-starty;
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(startx<=endx)
{
GUI_Point(startx,starty,color);
if(e>0){starty+=1;e-=dx;}
startx+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(starty<=endy)
{
GUI_Point(startx,starty,color);
if(e>0){startx+=1;e-=dy;}
starty+=1;
e+=dx;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -