📄 smg12864d3_m_exsample_c51.c
字号:
{ a1=~a1;
a2=~a2;
}
for(p=0;p<k;p++)
{ a2>>=1;
if((a1&0x1)==1)
a2+=0x80;
a1>>=1;
}
if((k==0) && (YSIZE<ly+8))
{ lcdpos();
ly+=8;
YPOS+=8;
}
else
{ lcdpos();
a1=lcdrd();
lcdpos();
ly+=8;
YPOS+=8;
Lcd_Mask=0xff;
p=YSIZE&0x7;
while(p>0)
{ Lcd_Mask>>=1;
YPOS--;
p--;
}
p=0xff;
while(YSIZE<ly)
{ ly--;
YPOS--;
p<<=1;
}
Lcd_Mask&=p;
a2&=Lcd_Mask;
a2|=a1&(~Lcd_Mask);
}
lcdwd(a2);
}
if((k!=0) && (YSIZE&0x7 != 0) && (k >= YSIZE&0x7)) s--;
}
YPOS=y;
}
//-------------------------------------------------------------------------------
//子程序名称:void putimage(unsigned char code *s).
//功能:在(XPOS,YPOS)位置绘制XSIZE[*s]列及YISZE[*(s+1)]行点阵的图形[*(s+2)].
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void putimage(unsigned char code *s) //显示图形子程序
{ unsigned char XSIZE,YSIZE;
XSIZE=*s;
s++;
YSIZE=*s;
s++;
putsizeimage(XSIZE,YSIZE,s);
}
//-------------------------------------------------------------------------------
//以下point为绘图操作的基本子程序,line,lineto,rect为绘图操作的扩充子程序.
//-------------------------------------------------------------------------------
//子程序名称:void point(bit b).
//功能:按b的数据在(XPOS,YPOS)位置绘制点.
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void point(bit b)
{ unsigned char i,Lcd_Mask,j;
Lcd_Mask=0x01;
i=YPOS&0x7;
while(i>0)
{ Lcd_Mask<<=1;
i--;
}
lcdpos();
j=lcdrd();
lcdpos();
if(b)
lcdwd(j|Lcd_Mask);
else
lcdwd(j&(~Lcd_Mask));
}
//-------------------------------------------------------------------------------
//子程序名称:void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
//功能:按b的数据绘制(x0,y0)-(x1,y1)的直线
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
{ unsigned char dx,dy;
unsigned int dk;
XPOS=x0;
YPOS=y0;
point(b);
dx=(x1>=x0)?x1-x0:x0-x1;
dy=(y1>=y0)?y1-y0:y0-y1;
if(dx==dy)
{ while(XPOS!=x1)
{ if(x1>x0) XPOS++;else XPOS--;
if(y1>y0) YPOS++;else YPOS--;
point(b);
}
}
else if (dx>dy)
{ dk=dy;
dy=0;
while(XPOS!=x1)
{ if(x1>x0) XPOS++;else XPOS--;
dy++;
if(y1>y0) YPOS=y0+(dk*dy+dx/2)/dx;else YPOS=y0-(dk*dy+dx/2)/dx;
point(b);
}
}
else
{ dk=dx;
dx=0;
while(YPOS!=y1)
{ if(y1>y0) YPOS++;else YPOS--;
dx++;
if(x1>x0) XPOS=x0+(dk*dx+dy/2)/dy;else XPOS=x0-(dk*dx+dy/2)/dy;
point(b);
}
}
}
//-------------------------------------------------------------------------------
//子程序名称:void lineto(unsigned char x1,unsigned char y1,bit b)
//功能:按b的数据绘制(XPOS,YPOS)-(x1,y1)的直线
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lineto(unsigned char x1,unsigned char y1,bit b)//绘制(XPOS,YPOS)-(X1,Y1)的直线
{ line(XPOS,YPOS,x1,y1,b);
}
//-------------------------------------------------------------------------------
//子程序名称:void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
//功能:按b的数据绘制(x0,y0)-(x1,y1)的矩形
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
{ line(x0,y0,x1,y0,b);
line(x1,y0,x1,y1,b);
line(x1,y1,x0,y1,b);
line(x0,y1,x0,y0,b);
}
//-------------------------------------------------------------------------------
//以下lcdfill,lcdpos,lcdreset为KS0108B型硬件接口的12864液晶显示模块的基本子程序
//-------------------------------------------------------------------------------
//子程序名称:void lcdfill(unsigned char d).
//功能:整屏显示d表示的字节数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdfill(unsigned char d) //整屏显示d代表的字节数据子程序
{ unsigned char j;
for(YPOS=0;YPOS<64;YPOS+=8) //8页
{ XPOS=0;
lcdpos();
for(j=0;j<64;j++) //64列
lcdwd1(d); //送图形数据
XPOS=64;
lcdpos();
for(j=0;j<64;j++) //64列
lcdwd2(d); //送图形数据
}
XPOS=0;
YPOS=0;
}
//-------------------------------------------------------------------------------
//子程序名称:void lcdpos(void).
//功能:设置坐标点(XPOS,YPOS)位置对应的内部RAM地址.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdpos(void) //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
{ unsigned char Column;
if(XPOS<64)
{ lcdwc1(0xB8|((YPOS/8)&0x7)); //页地址设置
lcdwc1(0x40|XPOS); //列地址设置
}
else
{ lcdwc2(0xB8|((YPOS/8)&0x7)); //页地址设置
lcdwc2(0x40|(XPOS&0x3F)); //列地址设置
}
}
//-------------------------------------------------------------------------------
//子程序名称:void lcdreset(void)
//功能:液晶显示控制器初始化
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdreset(void) //液晶显示控制器初始化子程序
{
lcdwc1(0xC0); //设置显示初始行
lcdwc2(0xC0); //设置显示初始行
lcdwc1(0x3F); //开显示
lcdwc2(0x3F); //开显示
}
//-------------------------------------------------------------------------------
//以下lcdwc1,lcdwc2,lcdwd,lcdrd为MCS51模拟口线接口的KS0108B液晶显示控制器的基本
//子程序,lcdwd1,lcdwd2,lcdrd1,lcdrd2,lcdwaitidle1,lcdwaitidle2为内部子程序.
//-------------------------------------------------------------------------------
//子程序名称:unsigned char lcdrd(void).
//功能:从液晶显示控制器中读图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
unsigned char lcdrd(void)
{unsigned char d;
if(XPOS<64)
{ d=lcdrd1();
d=lcdrd1();
}
else
{ d=lcdrd2();
d=lcdrd2();
}
return d;
}
//-------------------------------------------------------------------------------
//子程序名称:void lcdwd(unsigned char d).
//功能:向液晶显示控制器写图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwd(unsigned char d)
{ if(XPOS<64)
lcdwd1(d);
else
lcdwd2(d);
}
//-------------------------------------------------------------------------------
//子程序名称:void lcdwd1(unsigned char d).
//功能:向液晶显示控制器1写图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwd1(unsigned char d)
{ lcdwaitidle1();
P1=d;
RSPIN=1;
RWPIN=0;
CS1PIN=1;
CS2PIN=0;
EPIN=1;
_nop_();
EPIN=0;
CS1PIN=0;
}
//-------------------------------------------------------------------------------
//子程序名称:void lcdwd2(unsigned char d).
//功能:向液晶显示控制器2写图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwd2(unsigned char d)
{ lcdwaitidle2();
P1=d;
RSPIN=1;
RWPIN=0;
CS1PIN=0;
CS2PIN=1;
EPIN=1;
_nop_();
EPIN=0;
CS2PIN=0;
}
//-------------------------------------------------------------------------------
//子程序名称:unsigned char lcdrd1(void).
//功能:从液晶显示控制器1中读图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
unsigned char lcdrd1(void) //读图形数据子程序
{ unsigned char d;
lcdwaitidle1(); //检测液晶显示控制器是否空闲
P1=0xff;
RSPIN=1;
RWPIN=1;
CS1PIN=1;
CS2PIN=0;
EPIN=1;
_nop_();
d=P1;
EPIN=0;
CS1PIN=0;
return d;
}
//-------------------------------------------------------------------------------
//子程序名称:unsigned char lcdrd2(void).
//功能:从液晶显示控制器2中读图形数据.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
unsigned char lcdrd2(void) //读图形数据子程序
{ unsigned char d;
lcdwaitidle2(); //检测液晶显示控制器是否空闲
P1=0xff;
RSPIN=1; //DUMMY READ
RWPIN=1;
CS1PIN=0;
CS2PIN=1;
EPIN=1;
_nop_();
d=P1;
EPIN=0;
CS2PIN=0;
return d;
}
//-------------------------------------------------------------------------------
//子程序名称:lcdwc1(unsigned char c).
//功能:向液晶显示控制器1送指令.
//修改日期:2009.10.30
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwc1(unsigned char c) //向液晶显示控制器1送指令
{ lcdwaitidle1();
P1=c;
RSPIN=0;
RWPIN=0;
CS1PIN=1;
CS2PIN=0;
EPIN=1;
_nop_();
EPIN=0;
CS1PIN=0;
}
//-------------------------------------------------------------------------------
//子程序名称:lcdwc2(unsigned char c).
//功能:向液晶显示控制器2送指令.
//修改日期:2009.10.30
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwc2(unsigned char c) //向液晶显示控制器2送指令
{ lcdwaitidle2();
P1=c;
RSPIN=0;
RWPIN=0;
CS1PIN=0;
CS2PIN=1;
EPIN=1;
_nop_();
EPIN=0;
CS2PIN=0;
}
//-------------------------------------------------------------------------------
//子程序名称:voidlcdwaitidle1(void).
//功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
//修改日期:2009.10.30
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwaitidle1(void) //控制器1忙检测子程序
{ unsigned char i;
P1=0xff;
RSPIN=0;
RWPIN=1;
CS1PIN=1;
CS2PIN=0;
EPIN=1;
for(i=0;i<20;i++) //
if( (P1&0x80) != 0x80 ) break; //D7=0 空闲退出
EPIN=0;
CS1PIN=0;
}
//-------------------------------------------------------------------------------
//子程序名称:voidlcdwaitidle2(void).
//功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
//修改日期:2009.10.30
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwaitidle2(void) //控制器2忙检测子程序
{ unsigned char i;
P1=0xff;
RSPIN=0;
RWPIN=1;
CS1PIN=0;
CS2PIN=1;
EPIN=1;
for(i=0;i<20;i++) //
if( (P1&0x80) != 0x80 ) break; //D7=0 空闲退出
EPIN=0;
CS2PIN=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -