#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));
}
}
发表不了那么全!要的联系我吧!