导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→关于代码

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

   qiucj001 
qiucj001发表的帖子 

 关于代码
注意: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)
{
}


发表时间:2006年8月19日14:40:52

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:求购51web开发板,谁有丢过来呀,QQ:11068644求购51web开发板,谁有丢过来呀,QQ:
[下一篇帖子]:请问一下?请问一下大家,现在用C8051F系列产品的人多 不 ?