LCD12864程序.docx
- 文档编号:10842812
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:17
- 大小:17.49KB
LCD12864程序.docx
《LCD12864程序.docx》由会员分享,可在线阅读,更多相关《LCD12864程序.docx(17页珍藏版)》请在冰豆网上搜索。
LCD12864程序
#defineuintunsignedint
#defineucharunsignedchar
/*======================================
变量宏定义
=======================================*/
#definex10x80//第1页的起始地址
#definex20x88//第2页的起始地址
#definey0x80//竖向的起始地址
#definecomm0//选择写命令
#definedat1//选择写数据
/*======================================
单片机管脚定义
=======================================*/
sbitrs=P2^5;//H=data;L=comm;
sbitrw=P2^6;//H=read;L=wr_lcd;
sbite=P2^7;//inputenable;
sbitpsb=P2^4;//H=并口;L=串口;
sbitrst=P2^3;//ResetSignal低电平有效
sbitbusy=P0^7;//lcdbusybit
ucharcodetab1[]={
"Dig-Oscillograph"
};
/*======================================
子函数声明
=======================================*/
voidDelay_12864(ucharnum);
voidchk_busy(void);
voidwr_lcd(uchardat_comm,ucharcontent);
voidinit_lcd_12864(void);
voidclear_Wdisp(void);
voiddisp(ucharc,ucharr,uchardata1,uchardata2);
voidword_disp(ucharc,ucharr,ucharword1,ucharword2);
voiddisp_frame(void);
ucharrd_lcd(void);
voidClear_DDRAM(void);
voiddot(ucharc,ucharr);
voidclear_Bdisp(void);
voidDrawLine_12864(ucharStartX,ucharStartY,ucharEndX,ucharEndY);
voidDrawLineY_12864(ucharxx,ucharY0,ucharY1);
voidDrawLineX_12864(ucharX0,ucharX1,ucharY);
voidCon_Disp(uchardata1,uchardata2,ucharx0,uchary0,ucharxl,ucharyl);
voidstr_disp(ucharcode*str,ucharcol);
voidSINword_disp(ucharcode*str,ucharc,ucharnum);
/*======================================
延时函数
=======================================*/
voidDelay_12864(ucharnum)
{
while(num--);
}
/*======================================
查忙函数
=======================================*/
voidchk_busy(void)
{
P0=0xff;//先将P0的BF忙标志位置高,如果当前状态不忙则自动清零,防止误判。
rs=0;
rw=1;//这两条设置参见上文中寄存器读写状态
e=1;//使能LCD
while(busy==1);//等待BF位不为1
e=0;//关闭LCD
}
/*======================================
写函数
=======================================*/
voidwr_lcd(uchardat_comm,ucharcontent)
{
chk_busy();//查忙,不为忙时才执行下面的语句
if(dat_comm)//dat_comm=1时表示写数据
{
rs=1;
rw=0;//参见上文寄存器读写状态
}
else//dat_comm=0时表示写指令
{
rs=0;
rw=0;//参见上文寄存器读写状态
}
P0=content;//将8位数据代码或指令代码先付给数据端口P0,
//确保在有效地脉冲信号到来时数据已到位
e=1;//脉冲信号
Delay_12864(10);//确保TPW的持续时间大于1500ns
e=0;
}
/*======================================
读函数
=======================================*/
ucharrd_lcd(void)
{
ucharshuju;
chk_busy();//查忙,不为忙时才执行下面的语句
rs=1;
rw=1;//参见上文寄存器读写状态
e=1;//脉冲信号
Delay_12864(10);//确保读取的数据稳定在P0口
shuju=P0;//将P0口对应的值赋予变量
e=0;
return(shuju);
}
/*======================================
初始化函数
=======================================*/
voidinit_lcd_12864(void)
{
rst=1;//rst=0时复位
psb=1;//并行传输方式
wr_lcd(comm,0x30);//进入基本指令动作,8位MPU
wr_lcd(comm,0x01);//清DDRAM
wr_lcd(comm,0x06);//光标左移,AC自动加一
wr_lcd(comm,0x0c);//开显示,关游标
clear_Wdisp();//清除GDRAM
disp_frame();
//str_disp(tab1,4);
}
/*======================================
DDRAM清除函数
=======================================*/
/*voidClear_DDRAM(void)
{
wr_lcd(comm,0x30);//确保在基本指令模式下
wr_lcd(comm,0x01);//清DDRAM
}
/*======================================
全清屏函数
=======================================*/
voidclear_Wdisp(void)
{
uchari,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x34);//扩展功能:
绘图显示关
wr_lcd(comm,y+j);
wr_lcd(comm,x+i);
wr_lcd(dat,0x00);
wr_lcd(dat,0x00);
}
}
x=x2;
}
wr_lcd(comm,0x36);//扩展功能:
绘图显示开
}
/*======================================
清波形显示区函数
=======================================*/
voidclear_Bdisp(void)
{
uchari,j,x;
x=0x80;
for(j=1;j<32;j++)//第一行不清除,控制行
{
for(i=0;i<8;i++)//控制列
{
wr_lcd(comm,0x36);//扩展功能:
绘图显示开不必关显示,可防止闪烁
wr_lcd(comm,y+j);
wr_lcd(comm,x+i);
if((j==12)||(j==24))
{
wr_lcd(dat,0x11);
wr_lcd(dat,0x11);
}
elseif((i%2==1)&&(i!
=7)&&(j%4==0))
{
wr_lcd(dat,0x00);
wr_lcd(dat,0x01);
}
else
{
wr_lcd(dat,0x00);
wr_lcd(dat,0x00);
}
}
}
x=x2;
for(j=0;j<17;j++)
{
for(i=0;i<8;i++)
{
wr_lcd(comm,0x36);//扩展功能:
绘图显示关
wr_lcd(comm,y+j);
wr_lcd(comm,x+i);
if(j==4)
{
wr_lcd(dat,0x11);
wr_lcd(dat,0x11);
}
elseif((i%2==1)&&(i!
=7)&&(j%4==0))
{
wr_lcd(dat,0x00);
wr_lcd(dat,0x01);
}
else
{
wr_lcd(dat,0x00);
wr_lcd(dat,0x00);
}
}
}
//wr_lcd(comm,0x36);//扩展功能:
绘图显示开
}
/*======================================
显示点函数
=======================================*/
voiddisp(ucharc,ucharr,uchardata1,uchardata2)
{
wr_lcd(comm,0x34);//确保关闭绘图模式
wr_lcd(comm,r);//列地址
wr_lcd(comm,c);//行地址
wr_lcd(dat,data1);//在(x,y)处前八个点的数据,将写入GDRAM
wr_lcd(dat,data2);//在(x,y)处后八个点的数据
wr_lcd(comm,0x36);//开启绘图模式,即显示GDRAM中的内容
}
//先X后Y
/*======================================
显示字符函数
=======================================*/
voidword_disp(ucharc,ucharr,ucharword1,ucharword2)
{
wr_lcd(comm,0x30);//确保在基本指令模式,此模式下所写的数据存在DDRAM中
wr_lcd(comm,r);//列地址
wr_lcd(comm,c);//行地址,此处的行地址只能是0x80或0x90
wr_lcd(dat,word1);//以(x,y)为起点的8*16区域内显示一个字符,格式为'字符',如显示a则写为'a'。
wr_lcd(dat,word2);//接着前一个字在显示一个字符,均写入DDRAM
}
/*======================================
显示框架函数
=======================================*/
voiddisp_frame(void)
{
uchari,col;
wr_lcd(comm,0x34);//关闭绘图显示
col=0x80;
for(i=0;i<8;i++)
disp(col+i,0x80,0xff,0xff);
col=0x88;
for(i=0;i<8;i++)
disp(col+i,0x91,0xff,0xff);
col=0x98;
for(i=0;i<8;i++)
disp(col+i,0x9f,0xff,0xff);
wr_lcd(comm,0x36);
}
/*======================================
单汉字显示函数
=======================================*/
/*voidSINword_disp(ucharcode*str,ucharc,ucharnum)
{
uchari;
wr_lcd(comm,0x30);//确认在基本指令模式
wr_lcd(comm,c);//列坐标
for(i=0;i wr_lcd(dat,str[i]); } /*====================================== 单行字符串显示函数 =======================================*/ voidstr_disp(ucharcode*str,ucharcol) { uchari,row_numb; wr_lcd(comm,0x30); switch(col) { case1: row_numb=0x80;break; case2: row_numb=0x90;break; case3: row_numb=0x88;break; case4: row_numb=0x98;break; default: row_numb=0x98; } wr_lcd(comm,row_numb); for(i=0;i<16;i++) wr_lcd(dat,str[i]); } /*====================================== 打点函数 =======================================*/ voiddot(ucharc,ucharr)//在任意位置画点输入范围c0-127,r0-63 { ucharrow,tier,tier_y,Gram_old_1,Gram_old_2; //wr_lcd(comm,0x34); wr_lcd(comm,0x36); tier=c>>4;///16 tier_y=c&0x0f;//%16 if(r<32) { row=r; } else { row=r-32; tier+=8; } wr_lcd(comm,row+0x80);//写行地址 wr_lcd(comm,tier+0x80);//写列地址 rd_lcd();//当前地址读,第一次虚读 Gram_old_1=rd_lcd();//连续读两次 Gram_old_2=rd_lcd(); wr_lcd(comm,row+0x80);//写行地址 wr_lcd(comm,tier+0x80);//写列地址 if(tier_y<8) { wr_lcd(dat,Gram_old_1|(0x01<<(7-tier_y))); wr_lcd(dat,Gram_old_2); } else { wr_lcd(dat,Gram_old_1); wr_lcd(dat,Gram_old_2|(0x01<<(15-tier_y))); } wr_lcd(comm,0x30); } /*====================================== 水平线函数 =======================================*/ voidDrawLineX_12864(ucharX0,ucharX1,ucharY) { ucharTemp; if(X0>X1) { Temp=X1; X1=X0; X0=Temp; } for(;X0<=X1;X0++) dot(X0,Y); } /*====================================== 反白显示函数 说明: 在x0,y0处反白显示,宽为x1,高为y1. =======================================*/ voidCon_Disp(uchardata1,uchardata2,ucharx0,uchary0,ucharxl,ucharyl) { uchari,j; for(j=0;j { for(i=0;i { wr_lcd(comm,0x34); wr_lcd(comm,y0+j); wr_lcd(comm,x0+i); wr_lcd(comm,0x30); wr_lcd(dat,data1); wr_lcd(dat,data2); } } wr_lcd(comm,0x36); } /*====================================== 垂直线函数 =======================================*/ voidDrawLineY_12864(ucharxx,ucharY0,ucharY1) { ucharTemp; if(Y0>Y1) { Temp=Y1; Y1=Y0; Y0=Temp; } for(;Y0<=Y1;Y0++) dot(xx,Y0); } /*====================================== 任意线函数 =======================================*/ voidDrawLine_12864(ucharStartX,ucharStartY,ucharEndX,ucharEndY) { intt,distance,delta_x,delta_y,xx=0,yy=0; charincx,incy; delta_x=EndX-StartX; delta_y=EndY-StartY; if(delta_x>0) { incx=1; } elseif(delta_x==0) { DrawLineY_12864(StartX,StartY,EndY); return; } else { incx=-1; } if(delta_y>0) { incy=1; } elseif(delta_y==0) { DrawLineX_12864(StartX,EndX,StartY); return; } else { incy=-1; } delta_x=abs(delta_x); delta_y=abs(delta_y); if(delta_x>delta_y) { distance=delta_x; } else { distance=delta_y; } dot(StartX,StartY); for(t=0;t<=distance+1;t++) { dot(StartX,StartY); xx+=delta_x; yy+=delta_y; if(xx>distance) { xx-=distance; StartX+=incx; } if(yy>distance) { yy-=distance; StartY+=incy; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD12864 程序