导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→关于液晶屏上插入/删除显示字符的问题[qiucj001]

 *第42760篇: 关于液晶屏上插入/删除显示字符的问题

  
楼 主:qiucj001 2006年8月19日14:33
 关于液晶屏上插入/删除显示字符的问题
我在写一个液晶屏的驱动,是OCM12832 的,存在一个光标移动的问题。在光标移动后的位置插入/删除字符
很麻烦。我的设想是:
插入:  光标后面的字符从最后一个开始依次向后移动一个
删除:  光标后面的字符从第一个开始依次向前移动一个
说着容易,到我现在一头雾水,被其中的问题搞得晕头转向,希望有人能和我讨论讨论,
不胜感激。


  
2楼:qiucj001 2006年8月19日14:40
 关于代码
注意:ShowChar, ShowCursor, 以及光标移动的函数是有问题的或没写,我改了一半,没心情了


#include "CHR.h"  //字库

unsigned char current_column; //当前要写入字符的列号
unsigned char end_column;     //最后写入字符的下一个列号
unsigned char cursor_column;  //光标所在列号
unsigned char line_ column;  //上一行最后一个字的起始列号
unsigned char current_page;   //当前页数
/*
 ****函数列表****
//状态检查
void CheckState(void)

//向LCD发送命令
//command :命令
SendCommandToLCD(unsigned char command)

//液晶复位
void Reset(void) 

//开关显示
void SetOnOff(unsigned char onoff)

//初始化LCD
void InitLCD(void)

//选择屏幕
//screen: 0-右屏,1-左屏
void SelectScreen(unsigned char screen)

//清屏
//screen: 0-右屏,1-左屏
void ClearScreen(unsigned char screen)

//设定页地址--X 0-7
void SetPage(unsigned char page)

//设定列地址--Y 0-63
void SetColumn(unsigned char column)

//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--32

//延时
void OCM12832delay(unsigned char i)

//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)

//读显示数据
unsigned char ReadByte(void)

//单字符显示
void ShowChar(char c)

//显示字符串
void ShowString(int num, char *buffer)

//清除一个字符
void ClearChar(void)

//光标显示
void ShowCursor(void)

//功能键 左移光标
void left_cursor(void)

//功能键 右移光标
void right_cursor(void)

//功能键 上移光标
void up_cursor(void)

//功能键 下移光标
void down_cursor(void)


****函数列表结束**** 
*/

//状态检查
void CheckState()
{
    unsigned char dat;
    OCM_RW_READ;
    OCM_RS_COM;
    do{
    OCM12832Port = 0xff;
    OCM_E_SET;
    dat = OCM12832Port;
  OCM_E_CLR;
    dat=0x90 & dat; //仅当第4,7位为0时才可操作
    }while(!(dat==0x00));
    return;
}

//向LCD发送命令
//command :命令
void SendCommandToLCD(unsigned char command)
{
    CheckState();
    OCM_RW_WRITE;
    OCM_RS_COM;
    OCM12832Port = command;
    OCM_E_SET; 
    OCM_E_CLR;
    return;
}

//液晶复位
void Reset()
{
    OCM_RET_SET;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_
(); _nop_(); _nop_(); 
    OCM_RET_CLR;
    return;
}

//开关显示
void SetOnOff(unsigned char onoff)
{
    onoff=0x3e | onoff; //0011 111x
    SendCommandToLCD(onoff);
    return;
}

//初始化LCD
void InitLCD()  0-右屏,1-左屏
{
    unsigned char i=250; //延时
    while(i--);

    Reset();
    SelectScreen(1);
    SetOnOff(0); //关显示
    SelectScreen(0);
    SetOnOff(0); //关显示
    
    ClearScreen(1);//清屏
    ClearScreen(0);

    SelectScreen(1);
    SetOnOff(1); //开显示
    SelectScreen(0);
    SetOnOff(1); //开显示

    SelectScreen(1);
    SetStartLine(0); //开始行:0
    
    current_column = 0;
    end_column = 0;
    cursor_column = 0; 
    line_ column = 0; 
    current_page = 0;
    
    return;

}

//选择屏幕
//screen: 0-右屏,1-左屏
void SelectScreen(unsigned char screen)
{
    switch(screen)
    {
        case 0: OCM_CS_RIGHTSET;
                        _nop_(); _nop_
(); _nop_(); _nop_(); _nop_(); _nop_(); 
                        break;
        case 1: OCM_CS_LEFTSET;
                        _nop_(); _nop_
(); _nop_(); _nop_(); _nop_(); _nop_(); 
                        break; 
    }
    return;
}


//清屏
//screen: 0-右屏,1-左屏   8页?4页?
void ClearScreen(unsigned char screen)
{
    unsigned char i,j;//i是页码,j是行码
    SelectScreen(screen);
    for(i = 0; i   < 8; i ++)
    {
        SetPage(i);
        SetColumn(0);//从第一列开始
        for(j = 0; j   < 64; j++)
        {
            WriteByte(0x00);
        }
    }
    return;
}


//设定页地址--X 0-7
void SetPage(unsigned char page)
{
    page = page & 0x07; // 0  <=line  <=7
    page = page | 0xb8; //1011 1xxx
    SendCommandToLCD(page);
    return;
}


//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
    column=column &0x3f; // 0=  <column  <=63
    column=column | 0x40; //01xx xxxx
    SendCommandToLCD(column);
    return;
}


//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--31 芯片支持64行
{
    startline=startline & 0x1f; // 0=  <startline  <=31
    startline=startline|0xc0; //11xx xxxx
    SendCommandToLCD(startline);
    return;
}


//延时
void OCM12832delay(unsigned char n)
{
    unsigned char i,j;
    for(i = 0; i   < n; i++)
    {
        do
        {    for(j = 0; j != 1000; j++)
            {;}
        }while(--j);
    }
    return;
}


//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
{
    CheckState();
    OCM_RW_WRITE;
    OCM_RS_DATA;
    OCM12832Port = dat;
    OCM_E_SET; 
    OCM_E_CLR;
    
    current_column += 1;
    end_column += 1;
    return;
}

//读显示数据
unsigned char ReadByte()
{
    unsigned char dat;
    CheckState();
    OCM_RW_READ;
    OCM_RS_DATA;
    OCM12832Port = 0xff;
    OCM_E_SET;
    dat =  OCM12832Port;
    OCM_E_CLR;
    return(dat);
}


//单字符显示 6*8 每两个字符之间隔一列
void ShowChar(char c)
{
    unsigned char i,dat;
    unsigned char temp_column;  //用于列控制, 从光标处开始写
    
//    current_column = cursor_column; 
    temp_column = cursor_column;  //从光标处开始写
    line_column = cursor_column;  //记录前一个字的首列号
    
    
    if(current_column >   122)    //换行判断
    {
        current_page +=1;
        current_column = 0;       //另起一行
    }
    
    for(i = 0; i   < 6; i++)     //显示字符
    {
        if(current_column   <= 63)  //左半屏
        {
            SelectScreen(1);
            SetPage(current_page);
            SetColumn(current_column);
            dat = CTAB[c - 0x20][i];
            WriteByte(dat);
        }
        else
        {
            SelectScreen(0);       //右半屏
            SetPage(current_page);
            temp_column = current_column - 64;
            SetColumn(temp_column);
            dat = CTAB[c - 0x20][i];
            WriteByte(dat);
        }
    }
    
    corsur_column = current_column;  //记录光标应在位置列号
    

    
    return;
}


//显示字符串
void ShowString(int num, char *buffer)
{
    unsigned char i;
    for(i = 0; i   < num; i++)
    {
        showchar(buffer[i]);
    }
    return;
}


//清除一个字符
void ClearChar(void)
{
    current_column = line_column;
    showchar(0x20);
    cursor_column = line_column;
}


//光标显示
void ShowCursor(void)
{
    unsigned char temp_column;  //
    
    temp_column = cursor_column; //从光标处开始写
    SetPage(current_page);
    
    if(current_column >   122)    //换行判断
    {
        current_page +=1;
        SetPage(current_page);
        current_column = 0;       //另起一行
        cursor_column = 0;
    }
    
    
    if(current_column   <= 63)  //左半屏
        {
            SelectScreen(1);
            SetColumn(cursor_column);
            WriteByte(0xFF);
            OCM12832delay(500);
            SetColumn(cursor_column);
            WriteByte(0x00);
            OCM12832delay(500);
        }
    else
        {
            SelectScreen(0);         //右半屏
            temp_column = cursor_column- 64;
            SetColumn(temp_column);
            WriteByte(0xFF);
            OCM12832delay(500);
            SetColumn(temp_column);
            WriteByte(0x00);
            OCM12832delay(500);
        }
    
    current_column = cursor_column;

}


//功能键 左移光标
void left_cursor(void)
{
}


//功能键 右移光标
void right_cursor(void)
{
}


//功能键 上移光标
void up_cursor(void)
{
    if(current_page >   0)
    {
        current_page -= 1;
        SetPage(current_page);
    }
    SetColumn(cursor_column);
    while(!(ReadByte() == 0x00))
    {
        cursor_column -= 1;
        SetColumn(cursor_column);
    }
    
    return;
}


//功能键 下移光标
void down_cursor(void)
{
}


>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:请问一下?

[下一篇主题]:开发一个产品,请高手合作解决