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