📄 lcd.c
字号:
/***************************************************************/
/* LCD--DM50174(302*240 POINT IC-SEC1330) OF ALL PROGRAM */
/***************************************************************/
#include "init.h"
ioport unsigned int port2000;
ioport unsigned int port2001;
#define Lcd_wc port2001 /*LCD写指令*/
#define Lcd_wd port2000 /*LCD写参数*/
#define Lcd_rs port2000
#define Lcd_rd port2001
unsigned int Lcd_Systab[]=
{0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00};
unsigned int Lcd_Scrtab[]=
{0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00};
extern unsigned int Ascii[13][16];
#define SYSTEM_SET 0x40 /*初始化设置*/
#define SCROLL 0x44 /*显示域设置*/
#define SLEEP_IN 0x53 /*休闲模式设置*/
#define DISP_ON 0x59 /*显示状态设置显示开*/
#define DISP_OFF 0x58 /*显示关*/
#define OVLAY 0x5b /*显示合成设置*/
#define HDOT_SCR 0x5a /*点位移设置*/
#define CSRFORM 0x5d /*光标形状设置*/
#define CGRAM_ADR 0x5c /*CGRAM首址设置*/
#define CSRDIR_RG 0x4c /*光标移动方式设置光标右移*/
#define CSRDIR_LF 0x4d /*光标左移*/
#define CSRDIR_UP 0x4e /*光标上移*/
#define CSRDIR_DW 0x4f /*光标下移*/
#define CSRW 0x46 /*光标指针设置*/
#define CSRR 0x47 /*读取光标指针*/
#define MWRITE 0x42 /*数据写入设置*/
#define MREAD 0x43 /*数据读取设置*/
#define LCDWAIT Wait;Wait; Wait;Wait;
#define Lcd_AP 0x28 /*显示屏一行所占字节数*/
typedef volatile unsigned int pointer; /*定义指针类型*/
/************************************************/
/* */
/* Lcd_Clear: 清显示区子程序 */
/* */
/* Data_Add1: 显示区首址 */
/* Data_Add2: 显示区末址 */
/* Data: 显示数据 */
/* */
/************************************************/
void Lcd_Clear(unsigned int Data_Add1,unsigned int Data_Add2,unsigned int Data)
{unsigned int Counter;
Lcd_wc=CSRDIR_RG; LCDWAIT
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=0x00; LCDWAIT;
Lcd_wd=0x00; LCDWAIT;
Lcd_wc=MWRITE; LCDWAIT;
for(Counter=Data_Add1;Counter<Data_Add2;Counter++)
{
Lcd_wd=Data;
LCDWAIT;
}
Lcd_wc=CSRDIR_DW; LCDWAIT;
}
/************************************************/
/* */
/* Lcd_Init: 初始化液晶子程序 */
/* */
/************************************************/
void Lcd_Init()
{ unsigned int i;
Lcd_wc=SYSTEM_SET; LCDWAIT; LCDWAIT;
for(i=0;i<8;i++)
{Lcd_wd=Lcd_Systab[i];
LCDWAIT; LCDWAIT;
}
Lcd_wc=SCROLL; LCDWAIT;LCDWAIT;
for(i=0;i<10;i++)
{
Lcd_wd=Lcd_Scrtab[i];
LCDWAIT; LCDWAIT;
}
Lcd_wc=HDOT_SCR; LCDWAIT; LCDWAIT;
Lcd_wd=0x00; LCDWAIT; LCDWAIT;
Lcd_wc=OVLAY; LCDWAIT; LCDWAIT;
Lcd_wd=0x08; LCDWAIT; LCDWAIT;
Lcd_Clear(0,0x8000,0); /*0x6580*/
Lcd_wc=DISP_ON; LCDWAIT; LCDWAIT;
Lcd_wd=0x54; LCDWAIT; /*0x54*/ LCDWAIT;
Lcd_wc=CSRFORM; LCDWAIT; LCDWAIT;
Lcd_wd=0x07; LCDWAIT; LCDWAIT;
Lcd_wd=0x87; LCDWAIT; LCDWAIT;
Lcd_wc=CSRDIR_DW; LCDWAIT; LCDWAIT;
}/*============================================*/
/************************************************/
/* */
/* Lcd_Pointer: 画点子程序 */
/* */
/* Dot_X: x坐标(0-319) */
/* Dot_Y: y坐标(0-239) */
/* */
/************************************************/
void Lcd_Point(unsigned int Dot_X,unsigned int Dot_Y)
{ unsigned int Cursor_X,Cursor_Y;
unsigned int Counter;
unsigned int Read_Data,i;
Counter=Dot_X&0x0007;
Cursor_X=(Dot_Y*Lcd_AP+(Dot_X>>3)+0x4000)&0x00ff;
Cursor_Y=((Dot_Y*Lcd_AP+(Dot_X>>3)+0x4000)&0xff00)>>8;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X; LCDWAIT;
Lcd_wd=Cursor_Y; LCDWAIT;
Lcd_wc=MREAD; LCDWAIT;
Read_Data=Lcd_rd&0x00ff;LCDWAIT;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X; LCDWAIT;
Lcd_wd=Cursor_Y; LCDWAIT;
Lcd_wc=MWRITE; LCDWAIT;
Lcd_wd=(0x80>>Counter)|Read_Data;
LCDWAIT;
}/*==============================================*/
/************************************************/
/* */
/* Lcd_Line: 划线子程序 */
/* */
/* (X0,Y0): 起始点坐标 */
/* (X1,Y1): 终止点坐标 */
/* */
/* X0,X1: 0-319 */
/* Y0,Y1: 0-239 */
/* */
/************************************************/
void Lcd_Line(unsigned int X0,unsigned int Y0,unsigned int X1,unsigned int Y1)
{ unsigned int Cursor_X,Cursor_Y;
unsigned int Counter,Dot_Type;
unsigned int Read_Data;
double k;
if(X0==X1)
{if (Y0>Y1) {Counter=Y0;Y0=Y1;Y1=Counter;}
if (Y1>=239) Y1=239;
for (Counter=Y0;Counter<=Y1;Counter++)
Lcd_Point(X0,Counter);
}
else if(Y0==Y1)
{if (X0>X1) {Counter=X0;X0=X1;X1=Counter;}
if (X1>=319) X1=319;
Cursor_X=(Y0*Lcd_AP+(X0>>3)+0x4000)&0x00ff;
Cursor_Y=((Y0*Lcd_AP+(X0>>3)+0x4000)&0xff00)>>8;
if ((X0>>3)==(X1>>3))
{ Dot_Type=0xff>>(X0&0x07);
Read_Data=0xff<<(7-X1&0x07);
Dot_Type=Dot_Type&Read_Data;
Lcd_wc=CSRDIR_RG; LCDWAIT;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X; LCDWAIT;
Lcd_wd=Cursor_Y;LCDWAIT;
Lcd_wc=MREAD; LCDWAIT;
Read_Data=Lcd_rd&0x00ff; LCDWAIT;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X; LCDWAIT;
Lcd_wd=Cursor_Y; LCDWAIT;
Lcd_wc=MWRITE; LCDWAIT;
Lcd_wd=Dot_Type|Read_Data; LCDWAIT;
}
else
{ Dot_Type=0xff>>(X0&0x07);
Lcd_wc=CSRDIR_RG; LCDWAIT;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X; LCDWAIT;
Lcd_wd=Cursor_Y; LCDWAIT;
Lcd_wc=MREAD; LCDWAIT;
Read_Data=Lcd_rd&0x00ff; LCDWAIT;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X; LCDWAIT;
Lcd_wd=Cursor_Y; LCDWAIT;
Lcd_wc=MWRITE; LCDWAIT;
Lcd_wd=Dot_Type|Read_Data; LCDWAIT;
for (Counter=(X0>>3);Counter<((X1>>3)-1);Counter++)
{Lcd_wd=0xff; LCDWAIT;
}
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X+(X1>>3)-(X0>>3); LCDWAIT;
Lcd_wd=Cursor_Y;LCDWAIT;
Lcd_wc=MREAD; LCDWAIT;
Read_Data=Lcd_rd&0x00ff; LCDWAIT;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X+(X1>>3)-(X0>>3); LCDWAIT;
Lcd_wd=Cursor_Y; LCDWAIT;
Lcd_wc=MWRITE; LCDWAIT;
Dot_Type=(0x00ff<<(7-X1&0x07))&0x00ff;
Lcd_wd=Dot_Type|Read_Data; LCDWAIT;
}
}
else if(abs((int)X1-(int)X0)>fabs((int)Y1-(int)Y0))
{k=((double)Y1-(double)Y0)/((double)X1-(double)X0);
if (X0>X1)
{for(Cursor_X=X1;Cursor_X<=X0;Cursor_X++)
{Cursor_Y=(int)((double)(Cursor_X-X1)*k+(double)Y1);
Lcd_Point(Cursor_X,Cursor_Y);
}
}
else
{for(Cursor_X=X0;Cursor_X<=X1;Cursor_X++)
{Cursor_Y=(int)((double)(Cursor_X-X0)*k+(double)Y0);
Lcd_Point(Cursor_X,Cursor_Y);
}
}
}
else
{k=((double)X1-(double)X0)/((double)Y1-(double)Y0);
if (Y0>Y1)
{for(Cursor_Y=Y1;Cursor_Y<=Y0;Cursor_Y++)
{Cursor_X=(int)((double)(Cursor_Y-Y1)*k+(double)X1);
Lcd_Point(Cursor_X,Cursor_Y);
}
}
else
{for(Cursor_Y=Y0;Cursor_Y<=Y1;Cursor_Y++)
{Cursor_X=(int)((double)(Cursor_Y-Y0)*k+(double)X0);
Lcd_Point(Cursor_X,Cursor_Y);
}
}
}
}/*==============================================*/
void Lcd_Point1(unsigned int Dot_X,unsigned int Dot_Y)
{ unsigned int Cursor_X,Cursor_Y;
unsigned int Counter;
unsigned int Read_Data,i;
Counter=Dot_X&0x0007;
Cursor_X=(Dot_Y*Lcd_AP+(Dot_X>>3)+0x4000)&0x00ff;
Cursor_Y=((Dot_Y*Lcd_AP+(Dot_X>>3)+0x4000)&0xff00)>>8;
Lcd_wc=CSRW; LCDWAIT;
Lcd_wd=Cursor_X; LCDWAIT;
Lcd_wd=Cursor_Y; LCDWAIT;
Lcd_wc=MREAD; LCDWAIT;
Read_Data=Lcd_rd&0x00ff;LCDWAIT;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -