📄 interface.c
字号:
/***************************************************************************************************
file : Interface.c
author : Group23.EEICST.HUST
finish : 2005-08-15 10:42
related files : Interface.h
----------------------------------------------------------------------------------------------------
the basic API for SPCE061 with LCD(FM12864) and KeyBoard
used 8 IOs for control,and they are exclusive
used 8 IOs for Data,and they can be shared
used IRQ6_TMB1
Attention:
1. At the very begining of your programe fire the "Interface_Init" before
2. If using different IO ports definitions,only the "#define"s should be modified
***************************************************************************************************/
#include "Global.h"
#include "ENCL12.h" //this is the Lattices of the English Characters.
#define LCD_Nop
#define SIGN(x) ((x)<0?-1:1)
#define ABS(x) ((x)<0?-(x):(x))
#define bmLCD_DATA (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7) //DATA: IOB[0..7]
#define bmLCD_CSA BIT9 //CSA: IOB[9]
#define bmLCD_CSB BIT8 //CSB: IOB[8]
#define bmLCD_DI BIT10 //DI: IOB[10]
#define bmLCD_RW BIT11 //RW: IOB[11]
#define bmLCD_E BIT12 //E: IOB[12]
#define bmLCD_RST BIT13 //Reset: IOB[13]
#define bmLCD_CTRL (BIT8|BIT9|BIT10|BIT11|BIT12|BIT13)
#define LCD_GET_DATA ((*P_IOA_Data)&bmLCD_DATA)
#define LCD_SET_DATA(x) ((*P_IOA_Data)=(*P_IOA_Data)&(~bmLCD_DATA)|x) //!Attention!:x must <0x0100
#define LCD_CSNone do{SET_PORTA(bmLCD_CSA);SET_PORTA(bmLCD_CSB);}while(0)
#define LCD_CSA do{CLR_PORTA(bmLCD_CSA);SET_PORTA(bmLCD_CSB);}while(0)
#define LCD_CSB do{SET_PORTA(bmLCD_CSA);CLR_PORTA(bmLCD_CSB);}while(0)
#define LCD_CSAll do{CLR_PORTA(bmLCD_CSA);CLR_PORTA(bmLCD_CSB);}while(0)
#define LCD_DATA SET_PORTA(bmLCD_DI) //DI: IOB[10]
#define LCD_CMD CLR_PORTA(bmLCD_DI)
#define LCD_READ SET_PORTA(bmLCD_RW) //RW: IOB[11]
#define LCD_WRITE CLR_PORTA(bmLCD_RW)
#define LCD_SET_E SET_PORTA(bmLCD_E) //E: IOB[12]
#define LCD_CLR_E CLR_PORTA(bmLCD_E)
#define LCD_RESET CLR_PORTA(bmLCD_RST) //RST: IOB[13]
#define LCD_UNRESET SET_PORTA(bmLCD_RST)
#define LCD_CTRL_OUT SET_PORTA_OUT(bmLCD_CTRL)
#define LCD_DATA_IN SET_PORTA_IN(bmLCD_DATA) //DATA
#define LCD_DATA_OUT SET_PORTA_OUT(bmLCD_DATA)
#define LCD_CMD_ON 0x003F
#define LCD_CMD_OFF 0x003E
#define LCD_CMD_STARTR 0x00C0
#define LCD_CMD_PAGE 0x00B8
#define LCD_CMD_Y 0x0040
//=========================================================================================
//
//=========================================================================================
void LCD_WriteCMD(unsigned char Data)
{
unsigned char status;
LCD_DATA_IN;
LCD_READ;
LCD_CMD;
do
{
LCD_Nop;
LCD_SET_E;
LCD_Nop;
status=LCD_GET_DATA;
LCD_CLR_E;
}while(status&0x80);
LCD_DATA_OUT;
LCD_SET_DATA(Data);
LCD_WRITE;
LCD_Nop;
LCD_SET_E;
LCD_Nop;
LCD_CLR_E;
}
//=========================================================================================
//
//=========================================================================================
unsigned char LCD_ReadDATA()
{
unsigned char data;
LCD_DATA_IN;
LCD_READ;
LCD_CMD;
do
{
LCD_Nop;
LCD_SET_E;
LCD_Nop;
data=LCD_GET_DATA;
LCD_CLR_E;
}while(data&0x80);
LCD_DATA;
LCD_Nop;
LCD_SET_E;
LCD_Nop;
data=LCD_GET_DATA;
LCD_CLR_E;
return data;
}
//=========================================================================================
//
//=========================================================================================
void LCD_WriteDATA(unsigned char Data)
{
unsigned char status;
LCD_DATA_IN;
LCD_READ;
LCD_CMD;
do
{
LCD_Nop;
LCD_SET_E;
LCD_Nop;
status=LCD_GET_DATA;
LCD_CLR_E;
}while(status&0x80);
LCD_DATA_OUT;
LCD_SET_DATA(Data);
LCD_WRITE;
LCD_DATA;
LCD_Nop;
LCD_SET_E;
LCD_Nop;
LCD_CLR_E;
}
//=========================================================================================
//
//=========================================================================================
void LCD_Init()
{
int i;
LCD_CTRL_OUT;
LCD_DATA_OUT;
LCD_RESET;
for(i=0;i<0x40;i++)
LCD_Nop;
LCD_UNRESET;
for(i=0;i<0x40;i++)
LCD_Nop;
LCD_CSNone;
LCD_WriteCMD(LCD_CMD_ON);
LCD_WriteCMD(LCD_CMD_STARTR|0x00);
}
//=========================================================================================
//
//=========================================================================================
void LCD_CLS(unsigned char Color)
{
unsigned char page,y;
LCD_CSA;
for(page=0;page<8;page++)
{
LCD_WriteCMD(LCD_CMD_PAGE|page);
for(y=0;y<64;y++)
LCD_WriteDATA(Color);
}
LCD_CSB;
for(page=0;page<8;page++)
{
LCD_WriteCMD(LCD_CMD_PAGE|page);
for(y=0;y<64;y++)
LCD_WriteDATA(Color);
}
LCD_CSNone;
}
//=========================================================================================
//
//=========================================================================================
void LCD_StartRow(int x)
{
LCD_WriteCMD(LCD_CMD_STARTR|(~x&0x3F));
}
//=========================================================================================
//
//=========================================================================================
void LCD_Pixel(int x,int y,unsigned char Color)
{
unsigned char temp;
if(x<0||x>127||y<0||y>63)
return;
if(x&0x40)
LCD_CSB;
else
LCD_CSA;
x&=0x3F;
LCD_WriteCMD(LCD_CMD_PAGE|(y>>3));
LCD_WriteCMD(LCD_CMD_Y|x);
temp=LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|x);
temp=LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|x);
if(Color==1)
LCD_WriteDATA(temp|(0x01<<(y&0x07)));
else if(Color==0)
LCD_WriteDATA(temp&(~(0x01<<(y&0x07))));
else if(Color==2)
LCD_WriteDATA(temp^(0x01<<(y&0x07)));
LCD_CSNone;
}
//=========================================================================================
//
//=========================================================================================
void LCD_Line(int x0,int y0,int x1,int y1,unsigned char Color)
{
int x,y,sx,sy,e,dx,dy,temp;
dx=x1-x0;
dy=y1-y0;
if(!(dx|dy))
return;
if(ABS(dx)>ABS(dy))
{
if(x0>x1)
{
temp=x0;
x0=x1;
x1=temp;
temp=y0;
y0=y1;
y1=temp;
}
dx=x1-x0;
dy=y1-y0;
sy=SIGN(dy);
dy=ABS(dy);
e=(dy>>1);
y=y0;
for(x=x0;x<=x1;x++)
{
LCD_Pixel(x,y,Color);
e+=dy;
if(e>=dx)
{
y+=sy;
e-=dx;
}
}
}
else
{
if(y0>y1)
{
temp=x0;
x0=x1;
x1=temp;
temp=y0;
y0=y1;
y1=temp;
}
dx=x1-x0;
dy=y1-y0;
sx=SIGN(dx);
dx=ABS(dx);
e=(dx>>1);
x=x0;
for(y=y0;y<=y1;y++)
{
LCD_Pixel(x,y,Color);
e+=dx;
if(e>=dy)
{
x+=sx;
e-=dy;
}
}
}
}
//=========================================================================================
//
//=========================================================================================
void LCD_Bar(int x0,int y0,int x1,int y1,unsigned char LineColor,unsigned char FillColor)
{
int x,y,temp;
if(x0>x1)
{
temp=x0;
x0=x1;
x1=temp;
}
for(x=x0+1;x<x1;x++)
{
*P_Watchdog_Clear=1;
for(y=y0+1;y<y1;y++)
LCD_Pixel(x,y,FillColor);
}
for(x=x0;x<=x1;x++)
{
LCD_Pixel(x,y0,LineColor);
LCD_Pixel(x,y1,LineColor);
}
for(y=y0+1;y<y1;y++)
{
LCD_Pixel(x0,y,LineColor);
LCD_Pixel(x1,y,LineColor);
}
}
//=========================================================================================
//
//=========================================================================================
void LCD_Box(int x0,int y0,int x1,int y1,unsigned char Color)
{
int x,y,temp;
if(x0>x1)
{
temp=x0;
x0=x1;
x1=temp;
}
for(x=x0;x<=x1;x++)
{
LCD_Pixel(x,y0,Color);
LCD_Pixel(x,y1,Color);
}
for(y=y0+1;y<y1;y++)
{
LCD_Pixel(x0,y,Color);
LCD_Pixel(x1,y,Color);
}
}
//=========================================================================================
//
//=========================================================================================
int LCD_DrawText(char *str,int x,int y,char ForeColor,char BackColor) //Color:0-white,1-black,2-reverse,3-lucency
{
int i,j,k,n,qu,wei,location;
while(*str)
{
if(*str<128)
{
for(i=0;i<12;i++)
for(k=0;k<7;k++)
if((CL12[*str-32][i]>>k)&0x01)
{
if(ForeColor!=3)
LCD_Pixel(x+k,y+i,ForeColor);
}
else
{
if(BackColor!=3)
LCD_Pixel(x+k,y+i,BackColor);
}
x+=6;
str++;
}
#ifdef __CN_CHAR__
else
{
qu=*(str++)-0xa0;
wei=*(str++)-0xa0;
location=qu*94+wei;
for(n=0;n<NUM_STR;n++)
{
if(ZKQW[n]==location)
{
for(i=0;i<12;i++)
{
for(k=0;k<8;k++)
if((ZKDATA[n*24+i*2]>>(7-k))&0x01)
{
if(ForeColor!=3)
LCD_Pixel(x+k,y+i,ForeColor);
}
else
{
if(ForeColor!=3)
LCD_Pixel(x+k,y+i,BackColor);
}
for(k=0;k<4;k++)
if((ZKDATA[n*24+i*2+1]>>(7-k))&0x01)
{
if(ForeColor!=3)
LCD_Pixel(x+8+k,y+i,ForeColor);
}
else
{
if(ForeColor!=3)
LCD_Pixel(x+8+k,y+i,BackColor);
}
}
break;
}
}
x+=12;
}
#endif
}
return x;
}
//=========================================================================================
//
//=========================================================================================
int LCD_VirtualDrawText(char *str,int x) //for getting the pixel length of str
{
while(*str)
{
if(*str<128)
{
x+=6;
str++;
}
#ifdef __CN_CHAR__
else
{
str+=2;
x+=12;
}
#endif
}
return x;
}
//=========================================================================================
//this function is a copy from group5.EEICSR.HUST
//It's faster then LCD_Bar(x0,y0,x1,y1,2,2)
//=========================================================================================
void LCD_Reverse(int x0,int y0,int x1,int y1)
{
unsigned char tmp,tmpDa;
unsigned char sy=y0>>3;
unsigned char ey=y1>>3;
unsigned char mod,count;
unsigned char backup,backupY;
count = ey-sy+1;
if(x0>=64 || x1<64)
{
backupY = sy;
if(x1<64)
LCD_CSA;
else
LCD_CSB;
while(count--)
{
LCD_WriteCMD(LCD_CMD_PAGE|backupY++);
if(count == (ey-sy))
{
if(ey == sy)
mod = ((1<<((y1&0x07)+1))-1)^((1<<(y0&0x07))-1);
else
mod = 0xFF&(0xFF<<(y0&0x07));
}
else if(count == 0)
mod = ((y1&0x07)==0x07)?0xFF:((1<<((y1&0x07)+1))-1);
else
mod = 0xFF;
for(tmp=x0;tmp<=x1;tmp++)
{
LCD_WriteCMD(LCD_CMD_Y|tmp);
tmpDa = LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|tmp);
tmpDa = LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|tmp);
LCD_WriteDATA(tmpDa^mod);
}
}
LCD_CSNone;
}
else
{
LCD_CSA;
backup = count;
backupY = sy;
while(count--)
{
LCD_WriteCMD(LCD_CMD_PAGE|backupY++);
if(count == (ey-sy))
{
if(ey == sy)
mod = ((1<<((y1&0x07)+1))-1)^((1<<(y0&0x07))-1);
else
mod = 0xFF&(0xFF<<(y0&0x07));
}
else if(count == 0)
mod = ((y1&0x07)==0x07)?0xFF:((1<<((y1&0x07)+1))-1);
else
mod = 0xFF;
for(tmp=x0;tmp<64;tmp++)
{
LCD_WriteCMD(LCD_CMD_Y|tmp);
tmpDa = LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|tmp);
tmpDa = LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|tmp);
LCD_WriteDATA(tmpDa^mod);
}
}
count = backup;
backupY = sy;
LCD_CSB;
while(count--)
{
LCD_WriteCMD(LCD_CMD_PAGE|backupY++);
if(count == (ey-sy))
{
if(ey == sy)
mod = ((1<<((y1&0x07)+1))-1)^((1<<(y0&0x07))-1);
else
mod = 0xFF&(0xFF<<(y0&0x07));
}
else if(count == 0)
mod = ((y1&0x07)==0x07)?0xFF:((1<<((y1&0x07)+1))-1);
else
mod = 0xFF;
for(tmp=0;tmp<=x1-64;tmp++)
{
LCD_WriteCMD(LCD_CMD_Y|tmp);
tmpDa = LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|tmp);
tmpDa = LCD_ReadDATA();
LCD_WriteCMD(LCD_CMD_Y|tmp);
LCD_WriteDATA(tmpDa^mod);
}
}
}
}
//=========================================================================================
//
//=========================================================================================
void Interface_Init()
{
LCD_Init();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -