用6963控制的液晶240128底层驱动程序

单单侠   2011-9-29 11:58 楼主
#include <reg52.h>
#include "pin_define.h"

#define     uchar  unsigned char
#define     uint   unsigned int

/*---------------------------------------------------------------------------------------
//状态检查函数
//指令,数据读写状态检查
0x03 数据读写状态检查
0x04 数据自动读状态检查
0x08 数据自动写状态检查
***********************************************************************************/

void Check(char q)
{
  uchar dat;
      do{
        DATA_OUT=0xff;
                CE_6963=0;//片选有效
                WR_6963=1;//写电平无效
        CD_6963=1;//命令// cd=1;
        RD_6963=0; //读数据电平有效//rd=0;
        _nop_();
        dat=DATA_OUT;
        RD_6963=1;// rd=1;
        dat=q&dat;//STA0,STA1是否准备好
        }while(dat!=q);

}
//读数据
char InPortData()
{
char dat;
Check(0x03);//RWCheck();
CD_6963=0;//cd=0;
DATA_OUT=0xff;
RD_6963=0;//rd=0;
_nop_(); _nop_();
dat=DATA_OUT;
RD_6963=1;//rd=1;
return(dat);
}

//..........写命令到LCM..........
void send_cmd_to_lcm(uchar lcm_cmd)
{
Check(0x03);//RWCheck();// chk_lcm_busy(0x03);
CD_6963=1;//lcm_cd=1;
RD_6963=1;// lcm_rd=1;
DATA_OUT=lcm_cmd;
        WR_6963=0;//lcm_wr=0;
  _nop_(); _nop_();
        WR_6963=1;//;/lcm_wr=1;
}


//..........写数据到LCM..........
void send_data_to_lcm(uchar lcm_data)
{
Check(0x03);// RWCheck();//chk_lcm_busy(0x03);  测忙
  CD_6963=0;//lcm_cd=0;
  RD_6963=1;//lcm_rd=1;
DATA_OUT=lcm_data;
        WR_6963=0;//写电平有效 lcm_wr=0;
_nop_(); _nop_();
        WR_6963=1;//写电平无效 lcm_wr=1;
}
//..........自动写数据到LCM..........

void auto_send_data_to_lcm(uchar lcm_data)
{
Check(0x08);//AutoWCheck();// chk_lcm_busy(0x08); 测忙
CD_6963=0;//lcm_cd=0;
RD_6963=1;// lcm_rd=1;
DATA_OUT=lcm_data;
  _nop_();
WR_6963=0;//写电平有效lcm_wr=0;
_nop_();
WR_6963=1;//写电平无效 lcm_wr=1;
}



//..........写1个数据和1个命令到LCM..........
void send_1data_and_1cmd_to_lcm(uchar lcm_data,uchar lcm_cmd)
{
send_data_to_lcm(lcm_data);
send_cmd_to_lcm(lcm_cmd);
}
//..........写2个数据和1个命令到LCM..........
void send_2data_and_1cmd_to_lcm(uchar lcm_data_l,uchar lcm_data_h,uchar lcm_cmd)
{
send_data_to_lcm(lcm_data_l);
send_data_to_lcm(lcm_data_h);
send_cmd_to_lcm(lcm_cmd);
}
//..........写1个16进制数据和1个命令到LCM..........
void send_1hex_data_and_1cmd_to_lcm(uint lcm_data,uchar lcm_cmd)
{
send_data_to_lcm(lcm_data);
send_data_to_lcm(lcm_data>>8);
send_cmd_to_lcm(lcm_cmd);
}
char code pp[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};
char code ppp[]={0x00,0x80,0xb0,0xe0,0xf0,0xf8,0xfb,0xfe};
/*********************************
//..........延时n毫秒..........
void delay_n_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
  for(j=0;j<123;j++);
}
************************/
//..........初始化..........
void lcm_init(void)
{
   key_anjian=1;
    light_6963=0;   
    CE_6963=0;//片选  低电平有效
          WR_6963=1;
           RD_6963=1;         
          FS_6963=0;
        
send_1hex_data_and_1cmd_to_lcm(text_home_address,LC_TXT_STP);  //文本显示区首地址
send_1hex_data_and_1cmd_to_lcm(graphic_home_address,LC_GRH_STP); //图形显示区首地址
send_2data_and_1cmd_to_lcm(disp_width,0x00,LC_TXT_STP);  //文本显示区宽度
send_2data_and_1cmd_to_lcm(disp_width,0x00,LC_GRH_WID);  //图形显示区宽度
send_cmd_to_lcm(LC_MOD_OR);      //显示方式? 逻辑"或
send_2data_and_1cmd_to_lcm(0x02,0x00,LC_CGR_POS);   //CGRAM偏置地址设置
send_cmd_to_lcm(0x98);      //启用图形显示
  //send_cmd_to_lcm(0x80);
// send_cmd_to_lcm(0x94);      //启用文本显示 //启用图形显示
}

//..........清显示RAM..........
void clr_ram(void)
{
uchar i,j,temp;
temp=lcm_y_dots+lcm_y_dots/8;
send_1hex_data_and_1cmd_to_lcm(text_home_address,0x24);
send_cmd_to_lcm(0xb0);
for(j=0;j<temp;j++)
{
  for(i=0;i<disp_width;i++)
   auto_send_data_to_lcm(0x00);
}
send_cmd_to_lcm(0xb2);
}
void dis_display(unsigned int page_X,unsigned int ROW_Y,unsigned int image_width, unsigned int image_height)
{
uchar i,j,mm;
uint ADD_DATA;
ADD_DATA=page_X;
ADD_DATA=ADD_DATA + (ROW_Y*30);
ADD_DATA=ADD_DATA+graphic_home_address;
for(j=0;j<image_height;j++)
{
send_1hex_data_and_1cmd_to_lcm(ADD_DATA+j*30,LC_ADD_POS); // 地址指针位置
  for(i=0;i<image_width;i++)
  {
   send_cmd_to_lcm(LC_NOC_RD); //数据一次读,地址不变
   mm=InPortData();//读取数据
   send_1data_and_1cmd_to_lcm(~mm, LC_INC_WR);//写一个显示数据 地址加1
  }
}
}
/******************************************************************
函数作用:在指定的地方显示一中文字符串
page_X: 图片开始的页 范围:1到30
ROW_Y,图片开始的行 范围: 1~~127;
注:屏幕对应和RAM的关系为:横向8位并且左边为高位 每8位称之为页 所以240 可以分为30页(8*30=240)
横向位行 一共为128行
汉字取模方法:横向取模左高位,数据排列:从左到右从上到下  
字模的大小:image_width*image_height
地址计算方法:page_X+ROW_Y*30
*******************************************************************/
void display_hani(unsigned int page_X,unsigned int ROW_Y,unsigned int image_width, unsigned int image_height,char N,char *DATE)
{
uchar i,j,x;
uint ADD_DATA;
ADD_DATA=page_X;
ADD_DATA=ADD_DATA + (ROW_Y*30);
ADD_DATA=ADD_DATA+graphic_home_address;

for(x=0;x<N;x++)
{
for(j=0;j<image_height;j++)
{
send_1hex_data_and_1cmd_to_lcm(ADD_DATA+j*30+x*(image_width/8),LC_ADD_POS); // 地址指针位置
send_cmd_to_lcm( LC_AUT_WR); //自动写设置

  for(i=0;i<image_width/8;i++)
  {
  auto_send_data_to_lcm(*DATE);
   DATE++;
  }
   send_cmd_to_lcm(LC_AUT_OVR);//结束自动读写
}

send_cmd_to_lcm(LC_AUT_OVR);//结束自动读写
}
}

/******************************************************************
函数作用:在指定的地方显示一Ascii字符串  
可以识别大小字母写 空格  数字,
page_X: 图片开始的页 范围:1到30
ROW_Y,图片开始的行 范围: 1~~127;
注:屏幕对应和RAM的关系为:横向8位并且左边为高位 每8位称之为页 所以240 可以分为30页(8*30=240)
横向位行 一共为128行
Ascii取模方法:横向取模左高位,数据排列:从左到右从上到下  
Ascii字模的大小:image_width*image_height
地址计算方法:page_X+ROW_Y*30
*******************************************************************/
void display_Ascii(unsigned int page_X,unsigned int ROW_Y,unsigned int image_width, unsigned int image_height,char *DATE)
{
uchar i,j,x=0;
// char N;
  uchar y;
uint ADD_DATA;
ADD_DATA=page_X+ (ROW_Y*30);
ADD_DATA=ADD_DATA+graphic_home_address;
for(;*DATE!=0;DATE++,x++)
{
if(isupper(*DATE))y=*DATE-65+10;else if(isspace(*DATE))y=36;else if(isdigit(*DATE)) y=*DATE-48; else y=*DATE-97+37;
for(j=0;j<image_height;j++)
{
send_1hex_data_and_1cmd_to_lcm(ADD_DATA+j*30+x*(image_width/8),LC_ADD_POS); // 地址指针位置
send_cmd_to_lcm( LC_AUT_WR); //自动写设置

  for(i=0;i<image_width/8;i++)
  {
  auto_send_data_to_lcm(Ascii[y][j+i]);
  }
   send_cmd_to_lcm(LC_AUT_OVR);//结束自动读写
}

send_cmd_to_lcm(LC_AUT_OVR);//结束自动读写
}
}
/******************************************************************
函数作用:在指定的地方清零
page_X: 图片开始的页 范围:1到30
ROW_Y,图片开始的行 范围: 1~~127;
注:屏幕对应和RAM的关系为:横向8位并且左边为高位 每8位称之为页 所以240 可以分为30页(8*30=240)
横向位行 一共为128行
地址计算方法:page_X+ROW_Y*30

void display_clear(unsigned int page_X,unsigned int ROW_Y,unsigned int image_width, unsigned int image_height)
{
uchar i,j;
uint ADD_DATA;
ADD_DATA=page_X;
ADD_DATA=ADD_DATA + (ROW_Y*30);
ADD_DATA=ADD_DATA+graphic_home_address;
send_1hex_data_and_1cmd_to_lcm(ADD_DATA,LC_ADD_POS); // 地址指针位置
send_cmd_to_lcm( LC_AUT_WR); //自动写设置
for(j=0;j<image_height;j++)
{
send_1hex_data_and_1cmd_to_lcm(ADD_DATA+j*30,LC_ADD_POS); // 地址指针位置 换行
send_cmd_to_lcm( LC_AUT_WR); //自动写设置
  for(i=0;i<image_width;i++)
  {
  auto_send_data_to_lcm(0x00);
  }
   send_cmd_to_lcm(LC_AUT_OVR);//结束自动读写
}
send_cmd_to_lcm(LC_AUT_OVR);//结束自动读写
}
*******************************************************************/
/******************************************************************
函数作用:在指定的地方画一条Y轴直线
X ROW_Y,直线开始的坐标  X 0~239  ROW_Y 0~127
length 直线的长度 0~127
*******************************************************************/
void display_ylina(unsigned int X,unsigned int ROW_Y,char lg)
{
char i;
  uchar p;
unsigned int page_X;
uint ADD_DATA;
page_X=X/8;
p=7-X%8;
ADD_DATA=page_X+ (ROW_Y*30);
ADD_DATA=ADD_DATA+graphic_home_address;
  for(i=0;i<=lg;i++)
  {
send_1hex_data_and_1cmd_to_lcm(ADD_DATA+i*30,LC_ADD_POS);
send_cmd_to_lcm( LC_BIT_OP | (p+8));
}
}
发表不了那么全!要的联系我吧!

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复