在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2236|回复: 1

12864点阵液晶驱动开发问题求教

[复制链接]
发表于 2008-6-29 17:18:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近几天在LPC2368的开发板上写液晶的驱动,可是读状态都读的不对,写命令的时候在FIO1PIN3引脚上写的是什么,再读状态就读出来的是什么,应该是根本就没有写进去,搞了好几天也没有解决,好郁闷,有没有哪位大侠开发过啊,我用的是WJ12864J,不带中文字库的,如果哪位高手做过相关的程序能不能给我发一份啊,谢谢!!!~~~
zgl_517@163.com



下面是我的读状态的函数:
unsigned char iLCDD_ReadStatus()
{
DWORD rt ;
LCDD_iSetBusDir(FALSE); /设置数据总线方向为输入/
LCDD_SetCmdMode();  /设置命令模式/
LCDD_Delay();延时
LCDD_SetReadMode();  /设置为读模式/
LCDD_Delay();
LCDD_SelectLeft();/选择左屏
LCDD_Delay();
LCDD_Enable();   /使能
LCDD_Enable();   //
LCDD_Delay();
LCDD_Disable();   /锁存数据/
LCDD_GetData(rt);  /* 读状态*/
LCDD_iSetBusDir(TRUE); /设置数据总线为输出方向/
return rt ;
}
发表于 2008-6-29 20:00:11 | 显示全部楼层
这是8051的,你可以看看,不知能够帮助否?


#include "absacc.h"
#include "intrins.h"

//自定义库 在"C:\comp51\UserLib\"文件夹中
#include ".\inc\ASCII816.h" //标准ASCII库
#include ".\inc\HZTable.h" //汉字点阵库(自做)
#include ".\inc\Menu.h" //菜单库(自做)


// LCD128*64 数据线
#define LCD12864DataPort P1

// LCD128*64 I/O 信号管脚
sbit di =P3^1; // 数据\指令 选择
sbit rw =P3^3; // 读\写 选择
sbit en =P3^2; // 读\写使能
sbit cs1 =P3^4; // 片选1,低有效(前64列)
sbit cs2 =P3^5; // 片选2,低有效(后64列)

sbit reset=P0^7; // 复位


/*----------------------------------------------------------------------------------------------------*/
/* ****函数列表****

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

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

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

//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(unsigned char lin,unsigned char column,unsigned int address)

//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,unsigned char column,unsigned char character)

//显示8*16字符串
//!!!只能显示在一行上即: 串长+column <=15
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//address : 字模区首地址
void ShowString(unsigned char lin,unsigned char column, unsigned char *string)

//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//hzcode: 汉字代码(自定义的)
void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)

//显示图片
//旋转90度 :字模被竖着切分
//startline :开始行
//startcolumn:开始列
//linechar :图片行点除8(图片以8*8点阵为单位)
//columnchar :图片列点除8(图片以8*8点阵为单位)
//address : 字模区首地址
void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address)
//!!问题大户
//显示一行汉字
//lin:行
//lineheadaddr: 此行汉字代码区首地址
void ShowLine(unsigned char lin,unsigned int lineheadaddr)

//显示一屏汉字
//pageheadaddr:此屏汉字代码地址区首地址
void ShowPage(unsigned int pageheadaddr)

//反显一个8*8字块
//lin:行(0-3), column: 列(0-7)
void ReverseShow88(unsigned char lin,unsigned char column)


//反显一个字符
//lin:行(0-4), column: 列(0-15)
void ReverseShowChar(unsigned char lin,unsigned char column)


//反显一个汉字
//lin:行(0-3), column: 列(0-7)
ReverseShowHZ(unsigned char lin,unsigned char column)

//反显一行汉字
//lin:行
ReverseShow(unsigned char lin)

//初始化LCD
void InitLCD()

****函数列表结束**** */
/*----------------------------------------------------------------------------------------------------*/
/*--基本函数源程序------------------------------------------------------------------------------------*/
//延时
Lcd12864delay()
{
    unsigned int i=500;
    while (i--)
    {
        ;
    }
}
/*----------------------------------------------------------------------------------------------------*/
//状态检查
void CheckState()
{
    unsigned char dat;
    di = 0;
    rw = 1;
    do
    {
        LCD12864DataPort = 0xff;
        en = 1; dat = LCD12864DataPort; en = 0;
        dat = 0x90 & dat; //仅当第4,7位为0时才可操作
    }
    while (!(dat == 0x00));
}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
{
    CheckState();
    di = 1; rw = 0;
    LCD12864DataPort = dat;
    en = 1; en = 0;
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
SendCommandToLCD(unsigned char command)
{
    CheckState();
    rw = 0;
    LCD12864DataPort = command;
    en = 1; en = 0;
}
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
    line = line & 0x07; // 0<=line<=7
    line = line 0xb8; //1011 1xxx
    SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
    column = column & 0x3f; // 0=<column<=63
    column = column 0x40; //01xx xxxx
    SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--63
{
    startline = startline & 0x07;
    startline = startline 0xc0; //1100 0000
    SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(unsigned char onoff)
{
    onoff = 0x3e onoff; //0011 111x
    SendCommandToLCD(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(unsigned char screen)
{
    //北京显示器:负有效 cs1: 0--右; cs2: 0--左
    switch (screen)
    {
        case 0:
            cs1 = 0;//全屏
            _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
            ); _nop_(); _nop_(); _nop_();
            cs2 = 0;
            _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
            ); _nop_(); _nop_(); _nop_();
            break;
        case 1:
            cs1 = 1;//左屏
            _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
            ); _nop_(); _nop_(); _nop_();
            cs2 = 0;
            _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
            ); _nop_(); _nop_(); _nop_();
            break;
        case 2:
            cs1 = 0;//右屏
            _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
            ); _nop_(); _nop_(); _nop_();
            cs2 = 1;
            _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
            ); _nop_(); _nop_(); _nop_();
            break;
    }
}
/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(unsigned char screen)
{
    unsigned char i,j;
    SelectScreen(screen);
    for (i = 0; i < 8; i++)
    {
        SetLine(i);
        for (j = 0; j < 64; j++)
        {
            WriteByte(0x00);
        }
    }
}
/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(unsigned char lin, unsigned char column, unsigned int address)
{
    unsigned char i;
    if (column > 16)
    {
        return;
    }
    if (column < 8)
    {
        SelectScreen(1);
    } //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
    else
    {
        SelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上
        column = column & 0x07; //防止越界
    }
    SetLine(lin);
    SetColumn(column << 3);
    for (i = 0; i < 8; i++)
    {
        WriteByte(CBYTE[address + i]);
    }
}
/*------------------------------------------------------------------------------------------------*/
//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,
              unsigned char column,
              unsigned char character)
{
    lin = lin << 1;
    Show88(lin, column, ASCII816[character - 0x20]);
    Show88(lin + 1, column, ASCII816[character - 0x20] + 8);
}
/*-----------------------------------------------------------------------------------------------*/
/*
//显示8*16字符串
//!!!只能显示在一行上即: 串长+column <=15
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//address : 字模区首地址
void ShowString(unsigned char lin,unsigned char column, unsigned char *string)
{ unsigned char ch;
unsigned char i=0;

while(*string!=''\0'')
{
ch=*string;
if(i+column >15) break; //(只能显示在一行上即: 串长+column <=15)
ShowChar(lin,i+column,ch);
string++; i++;
}
}
*/
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
//uchar code HZtable
void ShowHZ(unsigned char lin, unsigned char column, unsigned int hzcode)
{
    lin = lin << 1; //lin*2

    Show88(lin, column, HZTable[hzcode]);
    Show88(lin, column + 1, HZTable[hzcode] + 8);
    Show88(lin + 1, column, HZTable[hzcode] + 16);
    Show88(lin + 1, column + 1, HZTable[hzcode] + 24);
}
/*----------------------------------------------------------------------------------------------*/
//显示图片
//旋转90度 :字模被竖着切分
//startline :开始行
//startcolumn:开始列
//linechar :图片行点除8(图片以8*8点阵为单位)
//columnchar :图片列点除8(图片以8*8点阵为单位)
//address : 字模区首地址
void ShowPicture(unsigned char startline,
                 unsigned char startcolumn,
                 unsigned char linechar,
                 unsigned char columnchar,
                 unsigned int address)
{
    unsigned char i,j;
    for (i = 0; i < columnchar; i++)
    {
        for (j = 0; j < linechar; j++)
        {
            Show88(startline + i,
                   startcolumn + j,
                   address + (i * linechar + j) * 8);
        }
    }
}
/*----------------------------------------------------------------------------------------------*/
//显示一行字符串(汉字,字母混排,一行16字节)
//lin:行
//lineheadaddr: 此行汉字代码区首地址
void ShowLine(unsigned char lin, unsigned char linehead[])
{
    unsigned char i;
    unsigned char byte;
    unsigned int hzcode;
    for (i = 0; i < 16;)
    {
        byte = linehead;
        if (byte < 0x80) //字母
        {
            if (i > 15)
            {
                return;
            } //!!编译器有问题,须强制退出

            ShowChar(lin, i, byte);
            i = i + 1;
        }
        else // byte >= 0x80(汉字)
        {
            if (i > 15)
            {
                return;
            } //!!编译器有问题,须强制退出

            byte = byte & 0x7f; //最高位置0,即:减去0x8000
            hzcode = (unsigned int)byte << 8; //?? //高8位
            hzcode = hzcode + linehead[i + 1]; //加低8位,组合成整型数地址
            ShowHZ(lin, i, hzcode);
            i = i + 2;
        }
    }
}
/*----------------------------------------------------------------------------------------------------*/
//显示一屏汉字
//pageheadaddr:此屏汉字代码地址区首地址
void ShowPage(unsigned char pagehead[][16])
{
    unsigned char i;
    for (i = 0; i < 4; i++)
    {
        ShowLine(i, pagehead);
    } //1行8个汉字,16字节
}
/*----------------------------------------------------------------------------------------------------*/
//读显示数据
unsigned char ReadByte()
{
    unsigned char dat;
    CheckState();
    di = 1; rw = 1;
    LCD12864DataPort = 0xff;
    en = 1; dat = LCD12864DataPort; en = 0;
    return(dat);
}

/*----------------------------------------------------------------------------------------------------*/
//反显一个8*8字块
//lin:行(0-3), column: 列(0-7)
void ReverseShow88(unsigned char lin, unsigned char column)
{
    unsigned char i;
    unsigned char tab[8];

    if (column < 8)
    {
        SelectScreen(1);
    } //如果列数<4(0,1,2,3),则写在第一屏上
    else
    {
        SelectScreen(2);
    } //否则 (4,5,6,7), 写在第二屏上
    //读上部8列
    column = column << 3; //每个方块8*8大小
    SetLine(lin);
    SetColumn(column);
    tab[0] = ReadByte(); //空读!!!!! //?
    for (i = 0; i < 8; i++)
    {
        tab = ~ReadByte();
    }
    //写回
    SetLine(lin);
    SetColumn(column);
    for (i = 0; i < 8; i++)
    {
        WriteByte(tab);
    }
}
/*----------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
//反显一个字符
//lin:行(0-4), column: 列(0-15)
void ReverseShowChar(unsigned char lin, unsigned char column)
{
    lin = lin << 1;
    ReverseShow88(lin, column);
    ReverseShow88(lin + 1, column);
}
/*----------------------------------------------------------------------------------------------------*/
//反显一个汉字
//lin:行(0-3), column: 列(0-7)
ReverseShowHZ(unsigned char lin, unsigned char column)
{
    lin = lin << 1;
    column = column << 1;
    ReverseShow88(lin, column);
    ReverseShow88(lin, column + 1);
    ReverseShow88(lin + 1, column);
    ReverseShow88(lin + 1, column + 1);
}
/*----------------------------------------------------------------------------------------------------*/
//反显一行汉字
//lin:行
ReverseShow(unsigned char lin)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        ReverseShowHZ(lin, i);
    }
}
/*----------------------------------------------------------------------------------------------------*/
void InitLCD() //初始化LCD
{
    unsigned char i=250; //延时
    while (i--);

    //reset=0;//复位
    //reset=1;

    SelectScreen(0);
    SetOnOff(0); //关显示

    ClearScreen(1);//清屏
    ClearScreen(2);

    SelectScreen(0);
    SetOnOff(1); //开显示
    SelectScreen(0);
    SetStartLine(0); //开始行:0
}
/*----------------------------------------------------------------------------------------------------*/

void Reset() //液晶复位
{
    //reset 低复位 _ -
    reset = 0;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
    ); _nop_(); _nop_();
    reset = 1;

    //全屏
    cs1 = 0;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
    ); _nop_(); _nop_();
    cs2 = 0;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(
    ); _nop_(); _nop_();
    SendCommandToLCD(0x3F);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-26 12:34 , Processed in 0.016294 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表