打印

大哥大姐帮指导一下12864,驱动为st7920的lcd光标显示移位问题

[复制链接]
4788|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccjchen|  楼主 | 2007-4-28 14:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ccjchen|  楼主 | 2007-4-29 14:59 | 只看该作者

各位大虾给提示一下啊!刚入行不久,我第一次用lcd

我真的不知道该怎么写啊,下面是我在网上下的程序,哪位给写一下光标的移位程序,不胜感激!
//12864(ST7920)串口C51程序

//12864F(7920)的串行模式C51范例
#include <reg51.h>
#include <intrins.h>
sbit E_CLK =P3^0;//clock input                    同步时钟输入端
sbit RW_SID=P3^1;//data input/output            串行数据输入、输出端
//sbit RS_CS =P3^5;//chip select                    片选端
//sbit PSB   =P3^6;//serial mode select            串口模式
sbit RST   =P1^2;
void delay(unsigned int n)
{
  unsigned int i;
  for(i=0; i<n; i++) {;}
}
 //串行发送一字节数据
void SendByte(unsigned char dat)
{
     unsigned char i;
     for(i=0;i<8;i++)
           {
                 E_CLK=0;
                 if(dat&0x80)RW_SID=1;else RW_SID=0;
                 E_CLK=1;
                 dat=dat<<1;
            }
}
//串行接收一字节数据
unsigned char ReceieveByte(void)
{
     unsigned char i,d1,d2;
     for(i=0;i<8;i++)
           {
                 E_CLK=0;delay(100);
                 E_CLK=1;
                 if(RW_SID)d1++;
                 d1=d1<<1;
            }
     for(i=0;i<8;i++)
           {
                 E_CLK=0;delay(100);
                 E_CLK=1;
                 if(RW_SID)d2++;
                 d2=d2<<1;
            }
     return (d1&0xF0+d2&0x0F);
}
//读取标志位BF
bit ReadBF(bit bf)
{
     unsigned char dat;
     SendByte(0xFA);//11111,01,0 RW=1,RS=0
     dat=ReceieveByte();
     if(dat>0x7F)bf=1;else bf=0;
     return bf;
     }
//写控制命令
void SendCMD(unsigned char dat)
{
//      while(ReadBF){;}
//      RS_CS=1;
     SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
     SendByte(dat&0xF0);//高四位
     SendByte((dat&0x0F)<<4);//低四位
//      RS_CS=0;
}
//写显示数据或单字节字符
void SendDat(unsigned char dat)
{
//      while(ReadBF){;}
//      RS_CS=1;
     SendByte(0xFA);//11111,01,0 RW=0,RS=1
     SendByte(dat&0xF0);//高四位
     SendByte((dat&0x0F)<<4);//低四位
//      RS_CS=0;
}
/*      写汉字到LCD 指定的位置
     x_add显示RAM的地址
     dat1/dat2显示汉字编码
*/
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2)
{
     SendCMD(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC
     SendDat(dat1);
     SendDat(dat2);
}
//初始化 LCM
void initlcm(void)
{
     RST=0;
//      RS_CS=0;
//      PSB=0;//serial mode
     delay(100);
     RST=1;
     SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
    SendCMD(0x0C);//0000,1100  整体显示,游标off,游标位置off
     SendCMD(0x01);//0000,0001 清DDRAM
     SendCMD(0x02);//0000,0010 DDRAM地址归位
     SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
//      SendCMD(0x04);//点设定,显示字符/光标从左到右移位,DDRAM地址加 一
//      SendCMD(0x0F);//显示设定,开显示,显示光标,当前显示位反白闪动
}

void main(void)
{
     initlcm();
  for(;;)
   {
    }
}

使用特权

评论回复
板凳
hqgboy| | 2007-4-29 16:25 | 只看该作者

常常

我的程序中应该怎么实现光标左移,右移,并且在所到移位处删除对应字符的功能呢?
----------------------------------

左移,右移就是修改坐标,重新显示。
删除同样,修改坐标,刷为空白就可以。

使用特权

评论回复
地板
ccjchen|  楼主 | 2007-4-29 18:31 | 只看该作者

修改坐标固然可以,但是:

我的st7920光标移动是以整个汉字所占的单元,可是怎么才能使光标只占据一个英文字符的单元呢

使用特权

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

本版积分规则

175

主题

446

帖子

1

粉丝