打印
[AVR单片机]

请教各位老师关于液晶12864显示点函数的问题

[复制链接]
2291|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sayer21011|  楼主 | 2012-4-9 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在这里向大家问好,我是一个初学者,刚接触单片机,个人原因比较笨拙再加上比较浮躁,所以很多东西搞不懂。我使用的ATMEGA128的单片机HD61202控制芯片的128×64的lcd(左右分屏),用事先有的例程实现了一些基础功能,但是通过看前辈们的学习路程才知道,不能在液晶的任意点上写数据,就算是没把液晶弄懂,所以现在正在研究最基本的画点函数,之后还有划线,曲线,滚屏,任意位置显示汉字等应用,想得很多,但是在画点函数上就卡住了,在这里求助各位高手老师帮忙指教,在此感激不尽!
     我把我的画点函数贴出来,本意是想做一个点函数,给出x,y坐标,就可以在液晶屏幕的相应位置显示出该点。x坐标显示正常,可是不能在任意纵坐标上(就是某一页的某一位)显示某个点,比如第0页的第0-7位都显示在0位置上,第1页的第0-7位都显示在第一页的0位置上,在程序里面也做了对各字节里的每一bit位的条件选择,可是不执行,不知道是哪里出现了问题。
void wr_lcd_point ( uchar x,uchar y )
{
uchar cod ;
uchar   bit ;
uchar   point ;
if ( x > 0x3f )
{
  cod = x - 0x40 ;
  cod = cod | 0x40 ;  //列地址
  CWE ( cod , 2 ) ;
    y = y /8 ;
  cod = y | 0xb8 ;      //页地址
        bit = y % 8 ;     //通过页地址算出给出坐标占这个字节的那一位
     switch ( bit )
    {
     case 0 :point=0x01;break;
     case 1 :point=0x02;break;
     case 2 :point=0x04;break;
     case 3 :point=0x08;break;
     case 4 :point=0x10;break;
     case 5 :point=0x20;break;
     case 6 :point=0x40;break;
     case 7 :point=0x80;break;
    }
  CWE ( cod , 2 ) ;
  DWE ( point , 2 ) ;
}
else
{
  cod = x | 0x40 ;
  CWE ( cod , 1 ) ;
    y = y /8 ;
  cod = y | 0xb8 ;
  bit = y % 8 ;
        switch ( bit )
    {
     case 0 :point=0x01;break;
     case 1 :point=0x02;break;
     case 2 :point=0x04;break;
     case 3 :point=0x08;break;
     case 4 :point=0x10;break;
     case 5 :point=0x20;break;
     case 6 :point=0x40;break;
     case 7 :point=0x80;break;
    }
        CWE ( cod , 1 ) ;
        DWE ( point , 1 ) ;
}

///////////////////////////////////////////////////////
下面是所用到的指令函数和写数据函数
//对液晶显示器发指令子程序(指令保存在cod寄存器中)
void  CWE(uchar cod,uchar n)
{
if(n!=1)
{
  CSB=1;  //CS2=1;PA6
  CSA=0;  //CS1=0;PA7
}
else
{
  CSB=0;  //CS2=0
  CSA=1;  //CS1=1
}
LCDSTA();       //判断液晶是否为忙
DI=0;              //DI=0:指令状态
DDRC=0XFF;    //D口为输出
RW=0;            //RW=0:写状态
PORTC=cod;    //需要写入的命令字送入数据线
asm("nop");
CE=1;             //EN=1:使能
asm("nop");
CE=0;             //EN=0
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//对液晶显示器写数据子程序(数据保存在dat寄存器中)
void  DWE(uchar dat,uchar n)
{
if(n!=1)
{
  CSB=1;          //CS2=1
  CSA=0;          //CS1=0
}
else
{
  CSB=0;          //CS2=0
  CSA=1;          //CS1=1
}
LCDSTA();       //判断液晶是否为忙
DI=1;             //DI=0:指令状态
DDRC=0XFF;  //C口为输出
RW=0;           //RW=0:写状态
PORTC=dat;   //需要写入的数据送入数据线
asm("nop");
CE=1;            //EN=1:使能
asm("nop");
CE=0;            //EN=0
}
本人刚学单片机,还没有找到门,请各位老师指点,感谢感谢!

相关帖子

沙发
airwill| | 2012-4-9 13:46 | 只看该作者
一个初学者,刚接触单片机,先还是不要玩液晶程序, 从基本的IO 控制和 CPU 的外设资源控制开始学习吧

使用特权

评论回复
板凳
joyme| | 2012-4-9 14:07 | 只看该作者
没看到你的初始化程序,估计你没有把它设置为画图模式

使用特权

评论回复
地板
sayer21011|  楼主 | 2012-4-9 14:15 | 只看该作者
/////////////////////////////////液晶模块复位////////////////////////////////////      
void    RST_LCD()               //液晶模块复位信号PC7=0并持续100US然后回到高电平
{
        LCD_RST=0;
        delay10us(20);           
        LCD_RST=1;
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void                LCDSTA()
{
        uchar        lcdstatus,n=0;       
        do
        {
                DI=0;                                        //DI=0:指令状态
                RW=1;                                        //RW=1:读状态
                CE=1;                                        //EN=1:使能
                n++;
                DDRC=0X00;                                //设置C口为输入
                lcdstatus=PINC;                                //为忙状态,则继续等待其为空闲
                lcdstatus=lcdstatus&0x80;
                CE=0;                                        //EN=0;
        }while(lcdstatus!=0x00&&n>3);
}
这个是液晶的初始化函数,我用的液晶只有显示开/关,显示起始行,页,列,读状态,和读写7个指令,您说的画图模式值得是哪里,我感觉就是我程序的问题,由于没有经验找不到错误点

使用特权

评论回复
5
joyme| | 2012-4-9 16:54 | 只看该作者
cod = x - 0x40 ;
  cod = cod | 0x40 ;  //列地址
  CWE ( cod , 2 ) ;

试试 cod = cod | 0xC0;           //0x40 改0xC0
point的计算一句话就可以实现 point = (1<<(y&0x07));

使用特权

评论回复
6
joyme| | 2012-4-9 16:56 | 只看该作者
还有我没有看到你写0x3f的命令(显示RAM里的内容)

使用特权

评论回复
7
sayer21011|  楼主 | 2012-4-9 17:58 | 只看该作者
试试 cod = cod | 0xC0;           //0x40 改0xC0
这块没问题 ,横坐标的显示是没问题的,关键就是用这种办法不能精确到页地址的某一位,
还有一个是我没有对液晶进行读和写,经过高手的指点我用了一种比较笨的方法,大致上实现了
画点但是我还是想搞清楚,用这种方法为什么不对,还请高手继续指教

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

0

粉丝