在LCD模块KM12864J3上画点函数并实现显示直线功能
在LCD模块KM12864J3上画点函数并实现显示直线功能
以下内容由"深圳市炜烨兴电子有限公司"提供,引用或转载请注明出处。购买液晶模块或者需要提供技术服务请联系:0755-86230436 QQ:56154083
KS0108控制驱动的12864液晶上画线一直是众多LCD使用者难跨的一首难题,以前也经常碰到客户问这样的问题,也没怎么上心,近段时间有空,就研究了一下,写出了以下的画点函数:在LCD屏上指定一个坐标画一个点(坐标的xy必须在(128,64)范围内)。请用户仔细研究dis_dot(x,y)实现的原理。利用它相信你也能写出任意形状的直线,曲线(有些地方可能需要读LCD显示内容这个请参考站内的另一篇文章: 汇编写的读12864DDRAM程序)
验证通过的液晶显示模块资料: KM12864J3 KM12864A3 以下左图显示的是规则直线,右图则显示任意两点间的线段

////////////////////////////////////////////////////////////////////////////////////////////////
//读LCD控制器状态
void LCD_BUSY(void)
{
unsigned char tmp;
L_DI=0; //指令
L_RW=1; //读
do{
DB=0xff;
L_E=1;
tmp=DB; //读取状态值
L_E=0;
}while(tmp&0x80==0x80);
}
//////////////////////////////////////////////////////////////////////////
//写一个数据到LCD
//flag=1 写入的数据为控制指令
//flag=0 写入的数据为显示数据
void LCD_WR(bit flag,unsigned char ldata)
{
LCD_BUSY();
L_DI=!flag;
L_RW=0;
DB=ldata;
_nop_();
L_E=1;
DB=ldata;
L_E=0;
}
//////////////////////////////////////////////////////
//函数名:LCD_RD(void)
//功 能:读取当前地址的数据,使用前应当先设置地址
/////////////////////////////////////////////////////
unsigned char LCD_RD(void)
{
unsigned char temp;
LCD_BUSY();
L_RW=1;
L_DI=1; //RS=1表示输入显示数据 RS=0表示输入控制指令
_nop_();
L_E=1;
temp=DB;
L_E=0;
return temp;
}
/////////////////////////////////////////////////////////////////
函数名: dis_dot(unsigned char x,unsigned char y)
功 能: 在指定坐标显示一个点dot
参 数:x x方向坐标,范围在0-127 列地址
y y方向坐标,范围在0-63 页地址
坐标定义: 左上角(0,0) 右下角(127,63)
////////////////////////////////////////////////////////////////
void dis_dot(unsigned char x,unsigned char y)
{
unsigned char dis_dat,page_add;
unsigned char rd_dat;
switch(y/8) //计算要显示的点所在的页地址
{
case 0:
page_add=0xb8;break;
case 1:
page_add=0xb9;break;
case 2:
page_add=0xba;break;
case 3:
page_add=0xbb;break;
case 4:
page_add=0xbc;break;
case 5:
page_add=0xbd;break;
case 6:
page_add=0xbe;break;
case 7:
page_add=0xbf;break; //这8个case语句可写成: page_add=0xb8+y/8;
}
switch(y%8) //计算要显示的点所在的当前页内的字节位地址
{
case 0:
dis_dat=0x01;break;
case 1:
dis_dat=0x02;break;
case 2:
dis_dat=0x04;break;
case 3:
dis_dat=0x08;break;
case 4:
dis_dat=0x10;break;
case 5:
dis_dat=0x20;break;
case 6:
dis_dat=0x40;break;
case 7:
dis_dat=0x80;break; //这8个case语句可以写成:dis_dat=0x01<<y%8;
}
if(x<64) //选择左显示区
{
L_CS1=1;
L_CS2=0;
}
else //选择右显示区
{
L_CS1=0;
L_CS2=1;
x=x-64;
}
LCD_WR(1,page_add); //定位页地址
LCD_WR(1,x+col_add_start); //定位列地址(这里的col_add_start=0x40)
LCD_WR(0,dis_dat); //显示一个点
}
//应用举例: 显示一条斜线 ( 左上角向右下角方向)
unsigned char data x,y,a,b;
a=1;b=3;
for(x=0;x<40;x++)
{
y=a*x+b;
while(y>63) //强制y<64
y=y-64;
dis_dot(x,y);
}
如果要显示一条曲线,可以根据曲线的方程式构造一个曲线函数,然后调用dis_dot(x,y)直接显示就可以了。是不是很方便呢?以上只是提供了一种思路 !
- 相关文章
- 用51汇编写的读12864液晶(KS0108驱动)显示数据[08-07]
- 汇编驱动内置ST7920的字库液晶程序|LCD12864,S..[07-30]
- 中文字库模块-KM24064A-GB规格,接口说明[06-30]
- 图形点阵液晶KM240128A|T6963或兼容控制器[06-08]
- Step by step教你写HT1621/HT1622驱动..[04-22]
- KM12832A-图形点阵液晶模块|LCD12832[04-20]
- 最新文章
- 用51汇编写的读12864液晶(KS0108驱动)显示数据[08-07]
- 汇编驱动内置ST7920的字库液晶程序|LCD12864,S..[07-30]
- 中文字库模块-KM24064A-GB规格,接口说明[06-30]
- 串行FLASH SSF1101 入门介绍[06-13]
- 图形点阵液晶KM240128A|T6963或兼容控制器[06-08]
- Step by step教你写HT1621/HT1622驱动..[04-22]
