📄 lcddrv.c
字号:
/* MShowTec - www.mshowtec.com
** msLinux LCDDrv.c ver1.0
** 20051221 lmjx create limiao@mshowtec.com
**
*/
#define MSLINUX_LCDDRV_C
#include "LCDDrv.h"
#include "dev.h"
#include "lcdcfg.h"
extern unsigned short virtual_screen[LCDHEIGHT][LCDWIDTH];
void delay(int time)
{
while(time--){
__asm{nop};
}
}
void InitLCD(void)
{
int x,y;
static unsigned char EnterOnce=1;
if(EnterOnce)
EnterOnce=0;
else
return;
write_cmd(LCDCON,LCDWIDTH|(LCDHEIGHT<<8));//128*128 dir=0 rgb=0 update=0
return;
}
void UpdateScreen(void)
{
write_cmd(UPDATE,0);
}
void DrawRealXY(unsigned short x,unsigned short y,unsigned short c)
{
if(x>=LCDWIDTH)
x = LCDWIDTH-1;
if(y>=LCDHEIGHT)
y = LCDHEIGHT -1;
write_cmd(CURX,x);
delay(10);
write_cmd(CURY,y);
delay(10);
write_data(c);
}
void DrawRealScreen(unsigned short StartX,unsigned short StartY,unsigned short Width,unsigned short Height)
{
int x,y;
int irq_save = 0;
irq_save = mslinux_save_disable_irq();
if(Width==0||Height==0
||StartX>=LCDWIDTH
||StartY>=LCDHEIGHT)
return;
Width = (StartX+Width>LCDWIDTH) ?(LCDWIDTH-StartX):Width;
Height = (StartY+Height>LCDHEIGHT) ?(LCDHEIGHT-StartY):Height;
delay(50);
for(y=StartY;y<Height;y++)
{
write_cmd(CURX,StartX);
delay(10);
write_cmd(CURY,y);
for(x = StartX;x<Width;x++){
write_data(virtual_screen[y][x]);
}
}
UpdateScreen();
mslinux_restore_irq(irq_save);
}
static long lcd_ioctrl()
{
int cmd;
long para;
long ret = 0;
cmd = dev_get_cmd(DEV_LCD);
para = dev_get_para(DEV_LCD);
switch(cmd){
case IOCTRL_INIT:
InitLCD();
break;
case IOCTRL_RD:
break;
case IOCTRL_WE:
break;
case IOCTRL_LCD_DRAW:
DrawRealScreen(((unsigned short*)para)[0],((unsigned short*)para)[1],((unsigned short*)para)[2],((unsigned short*)para)[3]);
break;
default:
break;
}
return ret;
}
void lcd_register()
{
dev_register(DEV_LCD,lcd_ioctrl);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -