深圳市炜烨兴电子有限公司|LCD在线|智能串口液晶
注册| 登录| 通行证 生产液晶显示模块哪家强?Wayeah LCM!专业的液晶显示模块研发、生产厂家!

首页 新闻 字符型| 图形型| 定制型| 智能型| 技术应用 留言反馈 联系方式 |

当前位置液晶应用技术 >> 在LCD模块KM12864J3上画点函数并实现显示直线功能

在LCD模块KM12864J3上画点函数并实现显示直线功能

在LCD模块KM12864J3上画点函数并实现显示直线功能

以下内容由"深圳市炜烨兴电子有限公司"提供,引用或转载请注明出处。购买液晶模块或者需要提供技术服务请联系:0755-86230436 QQ:56154083  淘宝店:http://mylcd.taobao.com

KS0108控制驱动的12864液晶上画线一直是众多LCD使用者难跨的一首难题,以前也经常碰到客户问这样的问题,也没怎么上心,近段时间有空,就研究了一下,写出了以下的画点函数:在LCD屏上指定一个坐标画一个点(坐标的xy必须在(128,64)范围内)。请用户仔细研究dis_dot(x,y)实现的原理。利用它相信你也能写出任意形状的直线,曲线(有些地方可能需要读LCD显示内容这个请参考站内的另一篇文章: 汇编写的读12864DDRAM程序)
验证通过的液晶显示模块资料: KM12864J3  KM12864A3      以下左图显示的是规则直线,右图则显示任意两点间的线段

KM12864A3/J3显示直线 文本 深圳市炜烨兴电子 液晶上画线段图片

////////////////////////////////////////////////////////////////////////////////////////////////
//读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)直接显示就可以了。

[来源:深圳市炜烨兴电子有限公司] [作者:yesever] [日期:09-09-01] [热度:]

评论

© 2004-2015 Wayeah LCM All rights reserved.

Powered by: KingCMS 5.1.0.0812

|2009旧版 | 联系方式 | 付款方式 | 淘宝店|