📄 subdisply.c
字号:
#include "zimo.h"
#include "data.h"
int DisplyCh(int x,int y,const int *chinese,int mode) {
int i;
int SetX,SetY;
SetY=y;
SetX=(x-x%8)/8;
LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_CSRDOWN;
LCDDELAY;
LCDPORTCMD = LCD_MWRITE;
for( i=0;i<8;i++)
{
LCDDELAY;
LCDPORTDATA = chinese[i];
vramValue[SetY++][SetX]=chinese[i]; //保存图形区信息,左上
}
SetY=y;
SetX=(x-x%8)/8+1;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_CSRDOWN;
LCDPORTCMD = LCD_MWRITE;
for(i=8; i<16; i++) {
LCDDELAY;
LCDPORTDATA = chinese[i];
vramValue[SetY++][SetX]=chinese[i]; //保存图形区信息,右上
}
SetY=y+8;
SetX=(x-x%8)/8;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_CSRDOWN;
LCDPORTCMD = LCD_MWRITE;
for(i=16; i<24; i++) {
LCDDELAY;
LCDPORTDATA = chinese[i];
vramValue[SetY++][SetX]=chinese[i]; //保存图形区信息,左下
}
SetY=y+8;
SetX=(x-x%8)/8+1;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) >> 8 ;
LCDPORTCMD = LCD_MWRITE;
for(i=24; i<32; i++) {
LCDDELAY;
LCDPORTDATA = chinese[i];
vramValue[SetY++][SetX]=chinese[i]; //保存图形区信息,右下
}
return 0;
}
int DisplyBigNum(int x,int y,const int *chinese,int mode) {
int i,MaxX=0;
int SetX,SetY;
if(mode==LCD_Z)
i=0;
else
if (mode==LCD_F)
{
i=16;
MaxX=16;
}
SetY=y;
SetX=(x-x%8)/8;
LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_CSRDOWN;
LCDDELAY;
LCDPORTCMD = LCD_MWRITE;
for( ;i<8+MaxX;i++)
{
LCDDELAY;
LCDPORTDATA = chinese[i];
vramValue[SetY++][SetX]=chinese[i]; //保存图形区信息,左上
}
SetY=y+8;
SetX=(x-x%8)/8;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+SetY*PSystemSet[6]+SetX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+SetY*PSystemSet[6]+SetX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_CSRDOWN;
LCDPORTCMD = LCD_MWRITE;
for(; i<16+MaxX; i++) {
LCDDELAY;
LCDPORTDATA = chinese[i];
vramValue[SetY++][SetX]=chinese[i]; //保存图形区信息,左下
}
}
//汉字图形方式显示子程序
int writechar(int x,int y,int codeno,int mode){
int i;
if( x < 0 || x >= PSystemSet[6] || y < 0 || y >= LCD_MAXY )
return -1;
if( codeno > 0x0ff || codeno < 0 )
return -1;
if(codeno < 0x80){ //写ASCII字符
LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = (y*PSystemSet[6] + x) & 0x0ff; //
LCDDELAY;
LCDPORTDATA = (y*PSystemSet[6] + x) >> 8; //
LCDDELAY;
LCDPORTCMD = LCD_CSRRIGHT;
LCDDELAY;
LCDPORTCMD = LCD_MWRITE; //
LCDDELAY;
LCDPORTDATA = codeno;
return 0;
}
}
//英文以及数字显示子程序,文本方式,字源来于液晶内部的ROM
int line(int x1, int y1, int x2, int y2, int mode){
int i,value;
if( x1 < 0 || x1 >= LCD_MAXX || y1 < 0 || y1 >= LCD_MAXY )
return -1;
if( x2 < 0 || x2 >= LCD_MAXX || y2 < 0 || y2 >= LCD_MAXY )
return -1;
if( x1 != x2 && y1 != y2 ) //非水平或垂直直线。
return -1;
if( x1 == x2 ){ //垂直直线
if( y1 > y2 ){
value = y1;
y1 = y2;
y2 = value;
}
switch (mode){
case LCD_SET:
for(i=y1;i<=y2;i++)
vramValue[i][(x1-x1%8)/8] = vramValue[i][(x1-x1%8)/8] | (1<<(7-x1%8));
break;
case LCD_CLR:
for(i=y1;i<=y2;i++)
vramValue[i][(x1-x1%8)/8] = vramValue[i][(x1-x1%8)/8] & (0x0ff-(1<<(7-x1%8)));
break;
case LCD_TOG:
for(i=y1;i<=y2;i++)
vramValue[i][(x1-x1%8)/8] = vramValue[i][(x1-x1%8)/8] ^ (1<<(7-x1%8));
break;
}
}else if( y1 == y2 ){ //水平直线
if( x1 > x2 ){
value = x1;
x1 = x2;
x2 = value;
}
switch (mode){
case LCD_SET:
for(i=x1;i<=x2;i++)
vramValue[y1][(i-i%8)/8] = vramValue[y1][(i-i%8)/8] | (1<<(7-i%8));
break;
case LCD_CLR:
for(i=x1;i<=x2;i++)
vramValue[y1][(i-i%8)/8] = vramValue[y1][(i-i%8)/8] & (0x0ff-(1<<(7-i%8)));
break;
case LCD_TOG:
for(i=x1;i<=x2;i++)
vramValue[y1][(i-i%8)/8] = vramValue[y1][(i-i%8)/8] ^ (1<<(7-i%8));
break;
}
}
LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y1)*PSystemSet[6]+(x1-x1%8)/8) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y1)*PSystemSet[6]+(x1-x1%8)/8) >> 8 ; //
if( x1 == x2 ){
LCDDELAY;
LCDPORTCMD = LCD_CSRDOWN;
}else if( y1 == y2 ){
LCDDELAY;
LCDPORTCMD = LCD_CSRRIGHT;
}
LCDDELAY;
LCDPORTCMD = LCD_MWRITE; //
if( x1 == x2 ){
for(i=y1;i<=y2;i++){
LCDDELAY;
LCDPORTDATA = vramValue[i][(x1-x1%8)/8];
}
}else if( y1 == y2 ){
for(i=(x1-x1%8)/8;i<=(x2+7-(x2+7)%8)/8;i++){
LCDDELAY;
LCDPORTDATA = vramValue[y1][i];
}
}
LCDDELAY;
LCDPORTCMD = LCD_CSRR;
LCDDELAY;
value = LCDPORTDATA;
LCDDELAY;
value = LCDPORTDATA;
return 0;
}
//画线子程序:水平或者垂直直线
//画任意直线的程序
int DrawLine(int StartX,int StartY,int EndX,int EndY,int mode)
{
int Error=0;
int temp,Addx,Addy;
int X,Y;
//首先判断Y值大者
if(StartY>EndY)
{
temp=StartX;
StartX=EndX;
EndX=temp;
temp=StartY;
StartY=EndY;
EndY=temp;
} //交换
Addx=EndX-StartX;
Addy=EndY-StartY;
X=StartX;
Y=StartY;
if(Addx>=Addy && Addx>=0) // 0<k<1
{ temp=Addy-Addx;
do
{
dot(X, Y, mode);
if(Error>0)
{
X++;
Y++;
Error+=temp;
}
else
{
X++;
Error+=Addy;
}
}
while(X<=EndX);
}
else
if(Addx<Addy && Addx>=0) // 1<k
{
temp=Addy-Addx;
do
{
dot(X, Y, mode);
if(Error<0)
{
X++;
Y++;
Error+=temp;
}
else
{
Y++;
Error-=Addx;
}
}
while(Y<=EndY);
}
else
if(abs(Addx)>=Addy && Addx<0) // -1<k<0
{
temp=Addy-abs(Addx);
do
{
dot(X, Y, mode);
if(Error<0)
{
X--;
Error+=Addy;
}
else
{
X--;
Y++;
Error+=temp;
}
}
while(X>=EndX);
}
else
if(abs(Addx)<Addy && Addx<0) // k<-1
{
temp=Addy-abs(Addx);
do
{
dot(X, Y, mode);
if(Error<0)
{
X--;
Y++;
Error+=temp;
}
else
{
Y++;
Error+=Addx;
}
}
while(Y<=EndY);
}
return 0;
}
//填充矩形
int FillRect(int LeftTopX,int LeftTopY,int RightBottomX,int RightBottomY,int mode)
{
/* for(;LeftTopY<=RightBottomY;LeftTopY++)
line(LeftTopX,LeftTopY,RightBottomX,LeftTopY,mode); */
//以下部分原来打算另写一个程序来改善效率,感觉差不多
int LineX,LineY,XStartRemain,XEndRemain; //
//////////////////////////
LCDPORTCMD = LCD_CSRDOWN; //关标向下
XStartRemain=((LeftTopX>>3)<<3)+7-LeftTopX;
LeftTopX>>=3;
XEndRemain=RightBottomX-((RightBottomX>>3)<<3);
RightBottomX>>=3;
//设置关标位置
if(XStartRemain<=7)
{
LCDPORTCMD = LCD_CSRW; //设置关标位置
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LeftTopX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LeftTopX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_MWRITE;
if(LeftTopX<RightBottomX)
{
for(LineY=LeftTopY;LineY<=RightBottomY;LineY++) //画左边界
{
Set_Varam_Code(&vramValue[LineY][LeftTopX],0,XStartRemain,mode);
LCDDELAY;
LCDPORTDATA = vramValue[LineY][LeftTopX];
}
}
else //处于同一块区域
{
for(LineY=LeftTopY;LineY<=RightBottomY;LineY++) //画左边界
{
Set_Varam_Code(&vramValue[LineY][LeftTopX],7-XEndRemain,XStartRemain,mode);
LCDDELAY;
LCDPORTDATA = vramValue[LineY][LeftTopX];
}
return 0;
}
LeftTopX++;
}
//中间区域
for(LineX=LeftTopX;LineX<RightBottomX;LineX++)
{
//设置光标位置
LCDPORTCMD = LCD_CSRW; //设置关标位置
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LineX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LineX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_MWRITE;
for(LineY=LeftTopY;LineY<=RightBottomY;LineY++) //画左边界
{
Set_Varam_Code(&vramValue[LineY][LineX],0,7,mode);
LCDDELAY;
LCDPORTDATA = vramValue[LineY][LineX];
}
}
//右边区域
if(XEndRemain>0)
{
//设置关标位置
LCDPORTCMD = LCD_CSRW; //设置关标位置
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+RightBottomX) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+RightBottomX) >> 8 ;
LCDDELAY;
LCDPORTCMD = LCD_MWRITE;
for(LineY=LeftTopY;LineY<=RightBottomY;LineY++) //画左边界
{
Set_Varam_Code(&vramValue[LineY][RightBottomX],7-XEndRemain,7,mode);
LCDDELAY;
LCDPORTDATA = vramValue[LineY][RightBottomX];
}
}
return 0;
}
//打点子程序
int dot(int x, int y, int mode){
int value;
if( x < 0 || x >= LCD_MAXX || y < 0 || y >= LCD_MAXY )
return -1;
/* LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) >> 8 ; //
LCDDELAY;
LCDPORTCMD = LCD_MREAD; //
LCDDELAY;
value = LCDPORTDATA ; */
value = vramValue[y][(x-x%8)/8];
switch (mode){
case LCD_SET:
value = value | (1<<(7-x%8));
break;
case LCD_CLR:
value = value & (0x0ff-(1<<(7-x%8)));
break;
case LCD_TOG:
value = value ^ (1<<(7-x%8));
break;
}
vramValue[y][(x-x%8)/8] = value;
LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) & 0x0ff ; //
LCDDELAY;
LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) >> 8 ; //
LCDDELAY;
LCDPORTCMD = LCD_MWRITE; //
LCDDELAY;
LCDPORTDATA = value;
LCDDELAY;
LCDPORTCMD = LCD_CSRR; //
LCDDELAY;
value = LCDPORTDATA;
LCDDELAY;
value = LCDPORTDATA;
return value;
}
//打点子程序
void CLEAR(void){
long i,j;
LCDDELAY;
LCDPORTCMD = LCD_CSRRIGHT;
LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = 0; //
LCDDELAY;
LCDPORTDATA = 0; //
LCDDELAY;
LCDPORTCMD = LCD_MWRITE; //
for(i=0;i<32768;i++){ //清缓冲内存240×40
LCDDELAY;
LCDPORTDATA = 0X00;
}
for(i=0;i<LCD_MAXY;i++)
for(j=0;j<LCD_MAXX/8;j++)
vramValue[i][j]=0;
}
//清除液晶显示RAM缓冲区
void Black(void){
long i;
LCDDELAY;
LCDPORTCMD = LCD_CSRRIGHT;
LCDDELAY;
LCDPORTCMD = LCD_CSRW;
LCDDELAY;
LCDPORTDATA = 0; //
LCDDELAY;
LCDPORTDATA = 0; //
LCDDELAY;
LCDPORTCMD = LCD_MWRITE; //
for(i=0;i<32768;i++){
LCDDELAY;
LCDPORTDATA = 0xFf;
}
}
//刷新显示RAM缓冲区
void Delay_ns(int time)
{ int i;
for(i=0;i<time;i++)
asm(" nop");
return;
}
void Set_Varam_Code(unsigned int *Code,int Startbit,int Endbit,int Mode)
{
int i,StartCode,MaskCode;
StartCode=(1<<Startbit);
MaskCode=StartCode;
for(i=Startbit;i<Endbit;i++)
{
MaskCode<<=1;
MaskCode+=StartCode;
}
switch(Mode)
{
case LCD_SET:
*Code = *Code | MaskCode;
break;
case LCD_CLR:
*Code = *Code & (0xff-MaskCode);
break;
case LCD_TOG:
*Code = *Code ^ MaskCode;
break;
}
}
void PHANTOM() {
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -