📄 avrmega8_ssd1815c.c
字号:
/*画线。任意方向的斜线,不支持垂直的或水平线 */
/************************************************/
void Linexy(Uchar endx,Uchar endy)
{
register Uchar t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
Uchar incx,incy;
/* compute the distance in both directions */
delta_x=endx-col;
delta_y=endy-row;
/* compute the direction of the increment ,
an increment of "0" means either a vertical or horizontal lines */
if(delta_x>0) incx=1;
else if( delta_x==0 ) incx=0;
else incx=-1;
if(delta_y>0) incy=1;
else if( delta_y==0 ) incy=0;
else incy=-1;
/* determine which distance is greater */
//求绝对值
if(delta_x<0)delta_x=-delta_x;
if(delta_y<0)delta_y=-delta_y;
if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;
/* draw the line */
for( t=0;t <= distance+1; t++ ) {
point();
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance ) {
xerr-=distance;
col+=incx;
}
if( yerr > distance ) {
yerr-=distance;
row+=incy;
}
}
}
/****************************************/
/*画线。只提供X或Y方向的,不支持斜线 */
/****************************************/
void Linehv(Uchar length)
{
Uchar xs,ys;
if (xy)
{ys = col; //横线
for (xs=0;xs<length;xs++)
{
col = ys + xs;
point();
}
}
else
{
xs = row; //竖线
for (ys=0;ys<length;ys++)
{
row = xs + ys;
point();}
}
}
/****************************************/
/* 画点 */
/****************************************/
void point(void)
{
Uchar x1,y1,x,y;
x1=col;
y1=row;
row=y1; /*取Y方向分页地址 */
Rddata();
y=y1&0x07; /*字节内位置计算 */
x=0x01;
x=x<<y; /*移入所画点 */
Wrdata(cbyte|x); /*画上屏幕 */
col=x1; /*恢复xy坐标 */
row=y1;
}
/****************************************/
/* 屏幕滚动定位 */
/****************************************/
void Rollscreen(Uchar x)
{
cbyte = DISPFIRST|x; /*定义显示起始行为x?*/
Wrcmd(cbyte);
}
/****************************************/
/* 一个字串的输出 */
/****************************************/
void Putstr(Uchar *puts,Uchar i)
{
Uchar j,X;
for (j=0;j<i;j++)
{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位*/
}
else Putedot(X-0x20); /*ascii码表从0x20开始*/
}
}
/****************************************/
/* 半角字符点阵码数据输出 */
/****************************************/
void Putedot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定义4个局部变量 */
int x; /*偏移量,字符量少的可以定义为UCHAR */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码,rom数组 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row+=18;}; /*下一列,如果列越界换行*/
if (row>7*8) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
col = bakerx; /*列对齐 */
row = bakery+8; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+16;}; /*下一列,如果列越界换行*/
if (row>7*8) row=8; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row=bakery;
} /*整个字符输出结束 */
/****************************************/
/* 全角字符点阵码数据输出 */
/****************************************/
void Putcdot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定义3个局部变量 */
int x; /*偏移量,字符量少的可以定义为UCHAR */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x20; /*每个字符32字节 */
/*上半个字符输出,16列 */
for(i=0;i<16;i++)
{
Wrdata(Hzk[x]); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){ col=0;row+=16;} /*下一列,如果列越界换行*/
if (row>6*8) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
/*下半个字符输出,16列 */
col = bakerx;
row = bakery+8;
for(i=0;i<16;i++) /*下半部分*/
{
Wrdata(Hzk[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row+=16;} /*下一列,如果列越界换行*/
if (row>7*8) row=8; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row = bakery;
} /*整个字符输出结束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<64;row+=8)
{ //col=20;
// Locatexy(); /*坐标定位 */
for(col=20;col<132;col++)
{
// Locatexy(); /*坐标定位 */
Wrdata(0x00);
// TestPin();
}
}
}
/****************************************/
/* 从液晶片上读数据,保留在全局变量中 */
/****************************************/
void Rddata(void)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
DDRB=0x00;
DilcmON; /*数据*/
WrlcmON; /*读数据*/
RDlcmOFF; /*读入到LCM*/
CS1lcmOFF;//选中芯片
//DelayLCM();
cbyte = PINB; /*虚读一次 */
RDlcmON;
//Locatexy(); /*坐标定位,返回时保留分区状态不变 */
//DelayLCM();
DilcmON; /*数据*/
WrlcmON; /*读数据*/
RDlcmOFF; /*读入到单片机*/
//DelayLCM();
DDRB=0x00;
cbyte = PINB; /*从数据口读数据,真读 */
RDlcmON;
CS1lcmON;
}
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(Uchar X)
{
RDlcmON;
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
lcdbusy();
DDRB=0xff;
DilcmON; /*数据输出*/
WrlcmOFF; /*写输出 */
CS1lcmOFF; //片选
Datalcm = X; /*数据输出到数据口 */
WrlcmON; /*读入到LCM*/
CS1lcmON; //片选
RDlcmON;
}
/********************************/
/* 命令输出到液晶控制口 */
/********************************/
void Wrcmd(Uchar X)
{
lcdbusy(); /*确定分区,返回时保留分区状态不变*/
DDRB=0xFF;
DilcmOFF; /*命令操作 */
RDlcmON;
WrlcmOFF; /*写输出 */
CS1lcmOFF;
Datalcm = X; /*数据输出到数据口 */
WrlcmON;
CS1lcmON;
DilcmON; //写到LCM中
//RDlcmON;DelayLCM();RDlcmON; /*读入到LCM*/
}
/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态 */
/********************************************************/
void lcdbusy(void)
{
//return;//debug
DilcmOFF; /*CLR DI */
WrlcmON; /*SETB RW */
RDlcmOFF;
CS1lcmOFF; // CS1LCM = 0; /*CLR CS1 */
DDRB=0x00;
//
while(PINB & Lcdbusy);
CS1lcmON;
RDlcmON;
WrlcmON;
DilcmON;
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
{
cbyte=((row&0x3F) >>3) |SETP;
Wrcmd(cbyte);//设置页地址
cbyte=col&0x0f |SETCL;
Wrcmd(cbyte); //设置列地址 低
cbyte=((col&0xF0)>>4)|SETCH;
Wrcmd(cbyte); //设置列地址 高
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
int i;
DilcmOFF;//LCD的D/C脚在一开始的时候应该设为0
cbyte = 0xA0; /*段重排*/
Wrcmd(cbyte);
cbyte = 0xC0; /*设置输出扫描方向*/
Wrcmd(cbyte);
cbyte = 0xA2; /*设置偏压1/9*/
Wrcmd(cbyte);
// cbyte = 0xA7; /*设置反显*/
// Wrcmd(cbyte);
cbyte = 0x2F; /*设置电源控制寄存器 内部负压生成,内部调理模块,内部输出缓冲*/
Wrcmd(cbyte);
cbyte = 0x27; /*设置内部电阻调整比*/
Wrcmd(cbyte);
cbyte = 0x81; /*设置对比度*/
Wrcmd(cbyte);
cbyte = 0xff; /*对比度选择*/
Wrcmd(cbyte);
cbyte = 0xAF; /*打开显示屏 */
Wrcmd(cbyte);
cbyte = DISPFIRST; /*定义显示起始行为零 */
Wrcmd(cbyte);
Wrcmd(0xE0); //进入读改写模式
// Wrcmd(0xEE);
Lcmcls();
col=20; /*清屏 */
row=0;
Locatexy();
}
void DelayLCM(void) /*液晶指令延时*/
{
Uchar i;
for(i=0;i<2;i++);
}
/********************************/
/* 延时 */
/********************************/
void Delay(Uchar MS)
{
Uchar us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -