在这里向大家问好,我是一个初学者,刚接触单片机,个人原因比较笨拙再加上比较浮躁,所以很多东西搞不懂。我使用的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
}
本人刚学单片机,还没有找到门,请各位老师指点,感谢感谢! |