打印

各位帮我看看我的液晶程序,控制芯片是T693C的

[复制链接]
2584|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
new1988|  楼主 | 2010-5-25 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是松山的24064液晶,控制芯片是T6963C。单片机是C8051F020。现在的问题是,数据能写进去,但是地址怎么也写不进去。无参数的命令也能写进去。不知道为什么带参数的命令就是写不进去。

相关帖子

沙发
new1988|  楼主 | 2010-5-25 09:38 | 只看该作者
这是我的程序:LCD20464.H文件
//防止被同个文件重复引用
#ifndef LCD24064_H
#define LCD24064_H

#define DISRAM_SIZE   0X7FFF   //设置显示ram的大小
#define TXTSTART      0x0000      //设置文本区的起始地址
#define GRSTART       0x6800       //设置图形区的起始地址

//端口定义
#define DATA_PORT          P6                   //数据口
#define CON_PORT          P4                   //控制口

//端口控制命令
#define READ_STATUS   0xcf                  //读状态字
#define WRITE_CMD           0xd7                  //写命令
#define READ_DATA          0x8f                  //读数据
#define WRITE_DATA          0x97                  //写数据

//液晶命令定义
#define LC_CUR_POS    0x21        // 光标位置设置
#define LC_CGR_POS    0x22        // CGRAM偏置地址设置
#define LC_ADD_POS    0x24        // 地址指针位置
#define LC_TXT_STP    0x40        // 文本区首址
#define LC_TXT_WID    0x41        // 文本区宽度
#define LC_GRH_STP    0x42        // 图形区首址
#define LC_GRH_WID    0x43        // 图形区宽度
#define LC_MOD_OR     0x80        // 显示方式:逻辑“或”
#define LC_MOD_XOR    0x81        // 显示方式:逻辑“异或”
#define LC_MOD_AND    0x82        // 显示方式:逻辑“与”
#define LC_MOD_TCH    0x83        // 显示方式:文本特征
#define LC_DIS_SW     0x90        // 显示开关:D0=1/0:光标闪烁启用/禁用;
                                  //              D1=1/0:光标显示启用/禁用;
                                  //              D2=1/0:文本显示启用/禁用;
                                  //              D3=1/0:图形显示启用/禁用;
#define LC_CUR_SHP    0xA0        // 光标形状选择:0xA0-0xA7表示光标占的行数
#define LC_AUT_WR     0xB0        // 自动写设置
#define LC_AUT_RD     0xB1        // 自动读设置
#define LC_AUT_OVR    0xB2        // 自动读/写结束
#define LC_INC_WR     0xC0        // 数据一次写,地址加1
#define LC_INC_RD     0xC1        // 数据一次读,地址加1
#define LC_DEC_WR     0xC2        // 数据一次写,地址减1
#define LC_DEC_RD     0xC3        // 数据一次读,地址减1
#define LC_NOC_WR     0xC4        // 数据一次写,地址不变
#define LC_NOC_RD     0xC5        // 数据一次读,地址不变
#define LC_SCN_RD     0xE0        // 屏读
#define LC_SCN_CP     0xE8        // 屏拷贝
#define LC_BIT_OP     0xF0        // 位操作:D0-D2:定义D0-D7位;D3:1置位;0:清除

// ASCII 字模宽度及高度定义
#define ASC_CHR_WIDTH         8
#define ASC_CHR_HEIGHT        12

//汉字显示的数据结构
typedef struct typFNT_GB16        // 汉字字模显示数据结构
{
    char Index[2];
    char Msk[32];
};         


#define uchar unsigned char
#define uint  unsigned int

//外部函数申明
extern void InitLCD( void );
extern void ddd(uchar a, uchar b, uchar c);


#endif

使用特权

评论回复
板凳
new1988|  楼主 | 2010-5-25 09:41 | 只看该作者
本帖最后由 new1988 于 2010-5-25 09:46 编辑

LCD24064.C文件
#include <c8051f020.h>
#include <intrins.h>
#include "LCD24064.h"

extern ucControl;                //对端口操作的变量,因为P4口不能位寻址,所以用个全局变量来保存端口的值。从而在操作液晶时不影响P4口的其他端口的电平。
uchar xdata ucTxtHome;                //当前文本窗口的序号


/***************************************************
*函数原型:                uchar ReadStatus( void )
*输入:                        无
*输出:                        读出来的状态字
*功能:                        读出液晶当前状态字的值
***************************************************/
uchar ReadStatus( void )
{
        uchar xdata ucStatus;
        DATA_PORT = 0xff;                  //设置数据口为读
        ucControl |= 0xf8;                  
        ucControl &= READ_STATUS;
        CON_PORT = ucControl;
        _nop_();
        _nop_();
        _nop_();  
        ucStatus = DATA_PORT;
        _nop_();
        _nop_();
        _nop_();
        ucControl |= 0x30;                 //RD=1, CE = 1;
        CON_PORT = ucControl;
        return ucStatus;
}               


/***************************************************
*函数原型:                uchar CheckST01( void )
*输入:                        无
*输出:               
*功能:                        检测状态字的第一和第二位,读和写位
***************************************************/
uchar CheckST01( void )
{
        uchar i, j;
        for( i = 10; i >0; i-- )
        {
                j = ReadStatus();
                if( ( j & 0x3 ) == 0x3 )
                break;
        }
        return i;
}

/***************************************************
*函数原型:                uchar CheckST02( void )
*输入:                        无
*输出:                        
*功能:                        检测状态字的第三位,连读位
***************************************************/
uchar CheckST02( void )
{
        uchar i, j;
        for( i = 10; i >0; i-- )
        {
                j = ReadStatus();
                if( ( j & 0x4 ) == 0x4 )
                break;
        }
        return i;
}

/***************************************************
*函数原型:                uchar CheckST03( void )
*输入:                        无
*输出:                        
*功能:                        检测状态字的第四位,连写位
***************************************************/
uchar CheckST03( void )
{
        uchar i, j;
        for( i = 10; i > 10; i-- )
        {
                j = ReadStatus();
                if( ( j & 0x8 ) == 0x8 )
                break;
        }
        return i;
}

/***************************************************
*函数原型:                uchar WriteLCDCmd( uchar ucCmd )
*输入:                        要写入的命令
*输出:                        
*功能:                        向LCD中写入命令
***************************************************/
uchar WriteLCDCmd( uchar ucCmd )
{
        if( CheckST01() == 0 )
        return 1;
        else
        {        
                DATA_PORT = ucCmd;
                ucControl |= 0xf8;                  
                ucControl &= WRITE_CMD;
                CON_PORT = ucControl;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                ucControl |= 0x28;                 //WR=1, CE =1;
                CON_PORT = ucControl;               
                return 0;        
        }
}

/***************************************************
*函数原型:                uchar WriteLCDData( uchar ucData )
*输入:                        要写入的数据
*输出:                        
*功能:                        向LCD中写入数据
***************************************************/
uchar WriteLCDData( uchar ucData )
{
        if( CheckST01() == 0 )
        return 1;
        else
        {        
                DATA_PORT = ucData;
                ucControl |= 0xf8;                  
                ucControl &= WRITE_DATA;
                CON_PORT = ucControl;
                _nop_();
                _nop_();
                _nop_();   
                _nop_();
                _nop_();
                _nop_();
                ucControl |= 0x28;                 //WR=1,CE = 1;
                CON_PORT = ucControl;               
                return 0;        
        }
}

/***************************************************
*函数原型:                void WriteCmdChar( uchar ucCmd, uchar ucPar)
*输入:                        要写入命令和其参数
*输出:                        
*功能:                        向LCD中写入带一个参数的命令
***************************************************/
void WriteCmdChar( uchar ucCmd, uchar ucPar)
{
        WriteLCDData( ucPar );
        WriteLCDCmd( ucCmd );
}

/***************************************************
*函数原型:                void WriteCmdByte( uchar ucCmd, uint uiPar)
*输入:                        要写入命令和其参数
*输出:                        
*功能:                        向LCD中写入带两个参数的命令
***************************************************/
void WriteCmdByte( uchar ucCmd, uchar ucPar1, uchar ucPar2)
{
        WriteLCDData( ucPar1 );
        _nop_();
        _nop_();
        _nop_();
        WriteLCDData( ucPar2 );
        _nop_();
        _nop_();
        _nop_();
        WriteLCDCmd( ucCmd );
        _nop_();
        _nop_();
        _nop_();
}


/***************************************************
*函数原型:                void RunningWrite( uchar ucData )
*输入:                        连续写入的数据
*输出:                        
*功能:                        向LCD中连续写入数据,地址自动加一
***************************************************/
void RunningWrite( uchar ucData )
{
        if( CheckST03() == 0 )
                return;
        else
        {
                WriteLCDData( ucData );
        }        
}

/***************************************************
*函数原型:                void CharAddPos( uchar ucCol, uchar ucRow )
*输入:                        行值和列值
*输出:                        
*功能:                        设置地址指针
*说明:                        文本窗口宽度为30个字节
***************************************************/
void CharAddPos( uchar ucRow, uchar ucCol )
{
        uint uiPos;
        uiPos = ucRow * 30 + ucCol;
        WriteCmdByte( LC_ADD_POS, uiPos & 0xff,  ( uiPos>>8) & 0xff );
}

/***************************************************
*函数原型:                void ClearScreen( void )
*输入:                        
*输出:                        
*功能:                        清屏
*说明:                        文本窗口宽度为30个字节
***************************************************/
void ClearScreen( void )
{
        uint i;
        CharAddPos( 2, 2 );     //这里无论写什么地址都没用,都是从头始              WriteLCDCmd( LC_AUT_WR );                           //自动写开始
        for( i = 0; i < 64*30 ; i++ )
        {
                RunningWrite( 0x00);                      //这里无论写什么数都能写进去
        }
        WriteLCDCmd( LC_AUT_OVR );                           //自动写结束
        CharAddPos( 0, 0 );                                           //恢复起始指针
}

/***************************************************
*函数原型:                void ResetLCD
*输入:                        
*输出:                        
*功能:                        复位液晶
*说明:                        
***************************************************/
void ResetLCD( void )
{
        ucControl &= 0x7f;
        CON_PORT = ucControl;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ucControl |= 0x80;
        CON_PORT = ucControl;
}

/***************************************************
*函数原型:                void InitLCD( void )
*输入:                        
*输出:                        
*功能:                        初始化LCD
*说明:                        
***************************************************/
void InitLCD( void )
{
        ResetLCD();                                                                  //复位液晶
        WriteLCDCmd( LC_MOD_OR );                                //显示方式设置
        WriteLCDCmd( LC_DIS_SW | 0x06 );                //开显示
                                                        
/*        WriteCmdByte( LC_TXT_STP, 0x0, 0x0 );        //设置文本显示的起始地址
        WriteCmdByte( LC_TXT_WID, 0x1e,0x0 );                //设置文本显示的宽度
        ucTxtHome = TXTSTART;                                                                                          */
        WriteCmdByte( LC_GRH_STP, 0x0, 0x0 );        //设置文本显示的起始地址
        WriteCmdByte( LC_GRH_WID, 0x1e,0x0 );        //设置文本显示的宽度                    
        ClearScreen();
}

使用特权

评论回复
地板
new1988|  楼主 | 2010-5-25 09:47 | 只看该作者
显示的问题是在复位之后只能做清屏操作。我想在指定的位置显示指定的数,但是就是写不进去。请各位大侠帮帮忙,看一下。单片机的频率为9.216M。

使用特权

评论回复
5
ayb_ice| | 2010-5-25 10:01 | 只看该作者
这种程序网上大把的GOOGLE吧

使用特权

评论回复
6
new1988|  楼主 | 2010-5-25 10:15 | 只看该作者
我的程序就是对着网上改的啊。开始的时候我就是在别人的程序上改了下管脚,但是不行。后面的才想起自己写的。

使用特权

评论回复
7
ayb_ice| | 2010-5-25 10:27 | 只看该作者
LCD驱动不难,还是自动搞定吧,估计没有人愿意看这么长的代码,何况这些代码还和硬件相关
建议慢慢调,开始不要写全代码,写一点调一点,020调试是很方便的

使用特权

评论回复
8
new1988|  楼主 | 2010-5-25 10:49 | 只看该作者
本帖最后由 new1988 于 2010-5-25 10:51 编辑

谢谢您,我也是自己慢慢在调啊,可是调了几天了,还是没什么效果,网上的程序都是挂总线的,而且C8051F比普通的51快很多。还有个疑问,我在单步仿真液晶清屏的时候,它清屏怎么不是一个字节一个字节的清屏啊,而是每次一列一列的清。一列的宽度是一个字节。就是8*64个点。

使用特权

评论回复
9
ayb_ice| | 2010-5-25 10:53 | 只看该作者
6963我以前用过,如果你用过其它的点阵的话,这个应该比较容易的
因为我觉得6963是比较规范的控制器,比7920好用多了,关键是基本的读写函数要可靠
好久没有用了,细节不记得了,
祝你好运

使用特权

评论回复
10
ayb_ice| | 2010-5-25 10:53 | 只看该作者
6963我以前用过,如果你用过其它的点阵的话,这个应该比较容易的
因为我觉得6963是比较规范的控制器,比7920好用多了,关键是基本的读写函数要可靠
好久没有用了,细节不记得了,
祝你好运

使用特权

评论回复
11
new1988|  楼主 | 2010-5-25 10:59 | 只看该作者
本帖最后由 new1988 于 2010-5-25 15:25 编辑

我的液晶的显示怎么是64*8个点一起显示啊?就是我送一个数据进去,一个字节宽度的一列都是相同的数据!这是什么原因啊,哪位大侠可以指点我一下

使用特权

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

本版积分规则

27

主题

470

帖子

0

粉丝