原创 LCD240128(t6963c驱动程序)

2008-3-26 11:26 6993 7 12 分类: MCU/ 嵌入式

  最近写了一个液晶程序,是6963C的,写的时候花了我不少周折,主要是自模选取时有一些问题,想在液晶上竖着显示,可是不知道该怎么选取,我试了很多遍才成功。刚开始调试时,还以为是自己的程序不对呢,呵呵,水平有限,发来大家来共享!


#include<stdio.h>
#include<intrins.h>   
#include <reg52.h>
#include <math.h>
#include <absacc.h>
#include <string.h>
#include <lcd.h>


/*   地址定义   */
#define  d_c_add XBYTE[0x00] //数据口  命令口



/* T6963C 命令定义 */
#define  LCD_CUR_POS  0x21      /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
#define  LCD_CGR_POS  0x22      /* CGRAM偏置地址设置(可以增加自已的符号) */
#define  LCD_ADR_POS  0x24      /* 地址指针位置(设置读写操作指针) */


#define  LCD_TXT_STP  0x40      /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
#define  LCD_TXT_WID  0x41      /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
#define  LCD_GRH_STP  0x42      /* 图形区首址(从此地址开始向屏幕左上角显示点) */
#define  LCD_GRH_WID  0x43      /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */


#define  LCD_MOD_OR         0x80                        /* 显示方式:逻辑或 */
#define  LCD_MOD_XOR  0x81      /* 显示方式:逻辑异或 */
#define  LCD_MOD_AND  0x82      /* 显示方式:逻辑与 */
#define  LCD_MOD_TCH  0x83      /* 显示方式:文本特征 */


#define  LCD_DIS_SW      0x90      /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
              /*        D1=1/0,光标显示启用/禁用 */
              /*        D2=1/0,文本显示启用/禁用(打开后再使用) */
              /*        D3=1/0,图形显示启用/禁用(打开后再使用) */
              
#define  LCD_CUR_SHP  0xA0      /* 光标形状选择:0xA0-0xA7表示光标占的行数 */


#define  LCD_AUT_WR      0xB0      /* 自动写设置 */
#define  LCD_AUT_RD      0xB1      /* 自动读设置 */
#define  LCD_AUT_OVR  0xB2      /* 自动读/写结束 */


#define  LCD_INC_WR      0xC0      /* 数据一次写,地址加1 */
#define  LCD_INC_RD      0xC1      /* 数据一次读,地址加1 */
#define  LCD_DEC_WR   0xC2      /* 数据一次写,地址减1 */
#define  LCD_DEC_RD   0xC3      /* 数据一次读,地址减1 */
#define  LCD_NOC_WR   0xC4      /* 数据一次写,地址不变 */
#define  LCD_NOC_RD   0xC5      /* 数据一次读,地址不变 */
       
#define  LCD_SCN_RD   0xE0      /* 屏读 */
       
#define  LCD_SCN_CP   0xE8      /* 屏拷贝 */


#define  LCD_BIT_OP   0xF0      /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
/*  定义标志位  */
sbit CD    = P1^0;
sbit CE    = P1^1;
sbit light = P1^2;
uchar code ASCII_DOT_LIB[][16];
/********************************************************************************************************/
/***********************************************************************
* 名称:LCD_TestStaBit01()
* 功能:判断读写指令和读写数据是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
uchar   LCD_TestStaBit01(void)
{  uchar i;
   CD="1";CE=0;
   for(i=100; i>0; i--)
   {  if( (d_c_add&0x03)==0x03 ) break;
   }
   CE="1";
   return(i);
}
/***********************************************************************
* 名称:LCD_TestStaBit02()
* 功能:查询是否可数据自动读状态
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
uchar   LCD_TestStaBit02(void)
{  uchar i;
   CD="1"; CE="0";
   for(i=100; i>0; i--)
   {  if( (d_c_add&0x04)==0x04 ) break;
   }
   CE="1";
   return(i);
}
/***********************************************************************
* 名称:LCD_TestStaBit03()
* 功能:数据自动写状态是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
uchar LCD_TestStaBit03(void)
{  uchar i;
   CD="1";CE=0;
   for(i=100; i>0; i--)
   {  if( (d_c_add&0x08)==0x08 ) break;
   }
   CE="1";
   return(i);
}
/********************************************************************************************************/
/***********************************************************************
* 名称:LCD_ReadState()
* 功能:读取状态字子程序。
* 入口参数:无
* 出口参数:返回值即为读出的状态字
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
void LCD_WriteCommand(uchar command)
{
CD=1;CE=0;
d_c_add=command;
CE=1;
}
/********************************************************************************************************/
/***********************************************************************
* 名称:LCD_WriteData()
* 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)
* 入口参数:dat   要写入LCM的数据
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void LCD_WriteData(uchar dat)
{
CD=0;CE=0;
d_c_add=dat;
CE=1;
}
/********************************************************************************************************/
/***********************************************************************
* 名称:LCD_ReadData()
* 功能:读取数据子程序。
* 入口参数:无
* 出口参数:返回值即为读出的数据
* 说明:函数会设置LCM数据总线为输入方式
***********************************************************************/
uchar LCD_ReadData(void)
{
 uchar dat;
 CD=0;CE=0;
 dat=d_c_add;
 CE=1;
 return dat;
}
/**************************************LCD_WriteTCommand1******************************************************************/
/***********************************************************************
* 名称:LCD_WriteTCommand1()
* 功能:写无参数命令子程序。会先判断LCM状态字。
* 入口参数:command    要写入LCM的命令字
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uchar  LCD_WriteTCommand1(uchar command)
{  if( LCD_TestStaBit01()==0 )return(0);
   LCD_WriteCommand(command);  // 发送命令字
   return(1);
}
/********************************LCD_WriteTCommand2************************************************************************/
/***********************************************************************
* 名称:LCD_WriteTCommand2()
* 功能:写单参数命令子程序。会先判断LCM状态字。
* 入口参数:command   要写入LCM的命令字
*          dat1  参数1
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送参数据数据,再发送命令字
***********************************************************************/
uchar LCD_WriteTCommand2(uchar command, uchar dat1)
{  if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteData(dat1);    // 发送数据1
  
   if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteCommand(command);  // 发送命令字
   return(1);
}
/********************************LCD_WriteTCommand3************************************************************************/
/***********************************************************************
* 名称:LCD_WriteTCommand3()
* 功能:写双参数命令子程序。会先判断LCM状态字。
* 入口参数:command   要写入LCM的命令字
*          dat1  参数1
*          dat2  参数2
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送两字节参数据数据,再发送命令字
***********************************************************************/
uchar  LCD_WriteTCommand3(uchar command, uchar dat1, uchar dat2)
{  if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteData(dat1);    // 发送数据1
  
   if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteData(dat2);    // 发送数据2
  
   if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteCommand(command);  // 发送命令字
  
   return(1);
}
/******************************LCD_WriteTData1**************************************************************************/
/***********************************************************************
* 名称:LCD_WriteTData1()
* 功能:写1字节数据子程序。会先判断状态字。
* 入口参数:dat    要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
uchar  LCD_WriteTData1(uchar dat)
{  if( LCD_TestStaBit03()==0 ) {return(0);}
   LCD_WriteData(dat);    // 发送命令字
   return(1);
}


/*******************************LCD_Initialize*************************************************************************/
 void  LCD_Initialize(void)
{  LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00);   // 设置文本方式RAM起始地址
   LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00);   // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
   LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00);   // 设置图形方式RAM起始地址
   LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00);   // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
   LCD_WriteTCommand1(LCD_MOD_OR);      // 设置显示方式为"或"
   LCD_WriteTCommand1(LCD_DIS_SW|0x08);     // 设置纯图形显示模式
   LCD_WriteTCommand1(LCD_CUR_SHP|0x07);    // 光标形状
}
/*********************************LCD_FillAll**********************************************************************/
void  LCD_FillAll(uchar dat)
{  uint  i;


   LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00);   // 置地址指针
   LCD_WriteTCommand1(LCD_AUT_WR);      // 自动写
   for(i=0;i<128*30;i++)
   {  LCD_WriteTData1(dat);        // 写数据
   }
   LCD_WriteTCommand1(LCD_AUT_OVR);      // 自动写结束
   LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00);   // 重置地址指针
}


 


 

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户578732 2009-10-13 12:51

支持楼主!支持原创!顶上去

用户163996 2009-4-17 14:34

请问你有用到 光标吗 我在用光标的时候出现了一点问题, 用显示命令 9b 时候 光标不会出现且不闪烁 只有用 9f才会出现闪烁,请问你知道是什么原因吗?我的QQ 345260834 邮箱shengfeixu@sina.com

用户1354440 2009-3-6 11:14

Thank you

用户97670 2008-11-20 11:29

谢谢分享

用户178344 2008-11-1 14:18

谢谢分享 顶一下

用户175098 2008-10-30 11:46

支持原创!投一票

用户1615276 2008-10-28 18:21

看来楼主的下的功夫不少,刚下了,试了一下,效果还不错的。

用户163187 2008-10-15 15:50

你好,想向你请教一些问题,我的qq:190546773

用户118109 2008-4-1 15:18

很好,很强大,我最近就做液晶驱动,用到t6963c,不会啊,烦死了

用户687197 2008-3-31 12:50

怎么没有主程序?
相关推荐阅读
用户1094343 2008-05-19 13:05
"震"后感
      随着时间的推移,离5.12的日子越来越远了,那些被埋的人的生还的可能性也越来越小了,每个人都在为那些生还的人感觉幸运,同时也为那些永远离开我们的人感觉痛心!5月19日清晨,北京天安门广场下...
用户1094343 2008-05-04 10:26
编码解码芯片PT2262/PT2272芯片原理简介
   编码解码芯片PT2262/PT2272芯片原理简介 PT2262/2272是台湾普城公司生产的一种CMOS工艺制造的低功耗低价位通用编解码电路,PT2262/2272最多可有12位(A0-A11...
用户1094343 2008-04-29 15:06
阻容降压原理
 阻容降压原理 电容降压的工作原理并不复杂。他的工作原理是利用电容在一定的交流信号频率下产生的容抗来限制最大工作电流。例如,在50Hz的工频条件下,一个1uF的电容所产生的容抗约为3180欧姆。当22...
用户1094343 2008-04-02 16:41
PWM及其实现方法
脉宽调制PWM是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反...
用户1094343 2008-04-01 16:26
PIC单片机选型
PIC12C5XX/CE5XX/CE6XXPIC16C5X/5XX/4XX单片机目前各型号主要功能配置如下:型号振荡EPROM程序区RAM数据区E2PROM数据区定时器A/D(8位)中断电压范围I/O...
用户1094343 2008-04-01 16:00
AVR单片机选型指南
AVR单片机选型指南产品简介与其它8-bit MCU相比,AVR 8-bit MCU最大的特点是:● 哈佛结构,具备1MIPS / MHz的高速运行处理能力;● 超功能精简指令集(RISC),具有32...
EE直播间
更多
我要评论
5
7
关闭 站长推荐上一条 /3 下一条