12864液晶的串行驱动程序 带反白显示,画图等:
12864液晶的串行驱动程序.rar
(24.09 KB, 下载次数: 77)
- /*******************************************************************
- *【文 件 名】:12864s.h *
- *【建立日期】:7月1日 *
- *【修改日期】:7月10日 *
- *【文件作用】:液晶12864驱动程序,包括所有关于液晶得函数 *
- *【说 明】:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶; *
- * (一般RW都设为0,即只向液晶写数据,不读数据) *
- * RS=1,写入的是数据;RS=0,写入的是指令; *
- * 一般模式:RW=0,RS=1;写数据 *
- * RW=0,RS=0;写指令 *
- *------------------------------------------------------------------*
- *【作 者】:郭鑫(ben) *
- *【版 权】:国家创新性实验项目,编号GCS07001 *
- *******************************************************************/
- #ifndef _12864S_08_07_04_
- #define _12864S_08_07_04_
- /***************************头文件部分*****************************/
- #include <REG52.h>
- #include <intrins.h>
- //------------------------换名定义,方便使用----------------------
- #define uchar unsigned char
- #define uint unsigned int
- #define nop _nop_()
- #define xtal 12
- //-------------------------管脚定义--------------------------------
- sbit CS = P2^0; //RS_LCD
- sbit SID = P2^1; //RW_LCD
- sbit SCLK = P2^2; //E_LCD
- /***************************函数声明*******************************/
- void delay(uint ms); //延时子程序
- void lcd_1byte_w(uchar RW, uchar RS, uchar W_data); //基本操作函数
- void lcd_8bits_w(uchar W_bits);
- void lcd_dat_w(uchar dat); //写数据
- void lcd_cmd_w(uchar cmd); //写命令
- void lcd_str_w(uchar *string); //写字符串
- void lcd_initial(void); //初始化
- void lcd_setposition(uchar x, uchar y);
- void lcd_black_pic(void); //绘图命令,用于反白显示
- void lcd_clear_pic(void);
- void lcd_row_off(uchar temp);
- void lcd_row_on(uchar temp);
- void logo(void); //两个欢迎界面
- void logo2(void);
- //-----------------------------LCD12864读命令----------------------------
- uchar lcd_cmd_r(void)
- {
- uchar i;
- uchar temp;
- CS = 0;
- SID = 0;
- SCLK = 0;
- CS = 1;
- // 11111 100
- SID = 1;
- for (i=0;i<5;i++){SCLK = 1;SCLK = 0;}
- SID = 1;
- SCLK = 1;SCLK = 0;
- SID = 0;
- SCLK = 1;SCLK = 0;
- SID = 0;
- SCLK = 1;SCLK = 0;
- temp = 0;
- for (i=0;i<8;i++)
- {
- SCLK = 1;
- temp <<=1;
- temp |= SID;
- SCLK = 0;
- }
- temp >>= 4;
- for (i=0;i<4;i++)
- {
- SCLK = 1;
- temp <<=1;
- temp |= SID;
- SCLK = 0;
- }
- for (i=0;i<4;i++)
- {
- SCLK = 1;SCLK = 0;
- }
- CS = 0;
- SID = 0;
- SCLK = 0;
- return temp;
- }
- //-------------------LDC忙检测-------------------------------------
- void lcd_busy_check(void)
- {
- uchar busy;
- do{
- busy = lcd_cmd_r();
- }while(busy&0x80);
- }
- /*******************************************************************
- *【函 数 名】:lcd_8bits_w *
- *【修改日期】:2008年7月2日 *
- *【函数作用】:12864写入8位数据 *
- *------------------------------------------------------------------*
- *【备 注】:从高位开始传送 *
- *******************************************************************/
- void lcd_8bits_w(uchar W_bits)
- {
- uchar i,Temp_data;
- for(i=0; i<8; i++)
- {
- Temp_data = W_bits;
- Temp_data <<= i;
- if((Temp_data&0x80)==0) //bit7 is 0
- {
- SID = 0;
- nop;
- SCLK = 1;
- nop;
- nop;
- SCLK = 0;
- nop;
- SID = 0;
- }
- else //bit7 is 1
- {
- SID = 1;
- nop;
- SCLK = 1;
- nop;
- nop;
- SCLK = 0;
- nop;
- SID = 0;
- }
- }
- }
- /*******************************************************************
- *【函 数 名】:lcd_1byte_w *
- *【修改日期】:2008年7月2日 *
- *【函数作用】:12864写入一字节,可以是命令或数据 *
- *------------------------------------------------------------------*
- *【备 注】:RW RS控制数据OR命令 *
- *******************************************************************/
- void lcd_1byte_w(uchar RW, uchar RS, uchar W_data)
- {
- uchar H_data,L_data,S_ID = 0xf8; //11111RWRS0 ,控制格式命令
- if(RW == 0)
- {
- S_ID &=~ 0x04;
- }
- else //if(RW==1)
- {
- S_ID |= 0X04;
- }
- if(RS == 0)
- {
- S_ID &=~ 0x02;
- }
- else //if(RS==1)
- {
- S_ID |= 0X02;
- }
- H_data = W_data;
- H_data &= 0xf0; //屏蔽低4位的数据
- L_data = W_data; //xxxx0000格式
- L_data &= 0x0f; //屏蔽高4位的数据
- L_data <<= 4; //xxxx0000格式
- CS = 1;
- lcd_8bits_w(S_ID); //发送S_ID
- lcd_8bits_w(H_data); //发送H_data
- lcd_8bits_w(L_data); //发送L_data
- CS = 0;
- }
- /*******************************************************************
- *【函 数 名】:lcd_str_w *
- *【修改日期】:2008年7月2日 *
- *【函数作用】:12864写入字符串 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_str_w(uchar *string)
- {
- uchar i=0;
- while(string[i]!='\0')
- lcd_dat_w(string[i++]);
- }
- /*******************************************************************
- *【函 数 名】:lcd_cmd_w *
- *【修改日期】:2008年7月2日 *
- *【函数作用】:12864写入一条命令 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_cmd_w(uchar cmd)
- {
- lcd_busy_check(); //先检测LCD忙否,忙则等待
- lcd_1byte_w(0,0,cmd);
- }
- /*******************************************************************
- *【函 数 名】:lcd_dat_w *
- *【修改日期】:2008年7月6日 *
- *【函数作用】:12864写入一个字节数据 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_dat_w(uchar dat)
- {
- lcd_busy_check(); //先检测LCD忙否,忙则等待
- lcd_1byte_w(0,1,dat);
- }
- /*******************************************************************
- *【函 数 名】:lcd_initial *
- *【修改日期】:2008年7月6日 *
- *【函数作用】:12864初始化 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_initial(void)
- {
- CS = 0;
- SCLK = 0;
- SID = 0;
-
-
- lcd_cmd_w(0x30); //功能设置 8位数据,基本指令
- delay(2);
- lcd_cmd_w(0x0c); //显示状态 ON,游标OFF,反白OFF
- delay(2);
- lcd_cmd_w(0x01); //清除显示
- delay(2);
- lcd_cmd_w(0x02); //地址归位
- delay(2); //延时
- }
- /*******************************************************************
- *【函 数 名】:lcd_setpostion *
- *【修改日期】:2008年7月2日 *
- *【函数作用】:12864写入8位数据 *
- *------------------------------------------------------------------*
- *【备 注】:从高位开始传送 *
- *******************************************************************/
- void lcd_setposition(uchar row, uchar col)
- {
- uchar p;
- switch(row%5)
- {
- case 1: p = 0x80; break; //第一行开始地址
- case 2: p = 0x90; break; //第二行
- case 3: p = 0x88; break; //第三行
- case 4: p = 0x98; break; //第四行
- }
- p += col;
- lcd_cmd_w(p);
- }
- /*******************************************************************
- *【函 数 名】:delay *
- *【修改日期】:2008年7月2日 *
- *【函数作用】:延时x MS *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void delay(uint ms)
- {
- uint i;
- while(ms--)
- {
- for(i=1;i<1142;i++);
- }
- }
- /*******************************************************************
- *【函 数 名】:lcd_row_on *
- *【修改日期】:2008年7月8日 *
- *【函数作用】:选择一行反白显示 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_row_on(uchar temp)
- {
- uchar i, j, x, y;
- y = temp - 1;
- if(y >= 2)
- {
- x = 8;
- y = (y-2)*16;
- }
- else
- {
- x = 0;
- y = y*16;
- }
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<16; i++)
- {
-
- lcd_cmd_w(0x80+y);
- lcd_cmd_w(0x80+x);
- y++;
- for(j=0; j<16; j++)
- {
- lcd_dat_w(0xff);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 数 名】:lcd_row_off *
- *【修改日期】:2008年7月8日 *
- *【函数作用】:取消一行反白显示 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_row_off(uchar temp)
- {
- uchar i, j, x, y;
- y = temp - 1;
- if(y >=2)
- {
- x = 8;
- y = (y-2)*16;
- }
- else
- {
- x = 0;
- y = y*16;
- }
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
-
- for(i=0; i<16; i++)
- {
- lcd_cmd_w(0x80+y);
- lcd_cmd_w(0x80+x);
- y++;
- for(j=0; j<16; j++)
- {
- lcd_dat_w(0x00);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 数 名】:lcd_clear_pic *
- *【修改日期】:2008年7月8日 *
- *【函数作用】:清除绘图部分,即取消全部反白 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_clear_pic(void)
- {
- uchar i, j;
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<32; i++)
- {
- lcd_cmd_w(0x80+i);
- lcd_cmd_w(0x80);
- for(j=0; j<32; j++)
- {
- lcd_dat_w(0x00);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 数 名】:lcd_black_pic *
- *【修改日期】:2008年7月8日 *
- *【函数作用】:全屏黑色 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_black_pic(void)
- {
- uchar i, j;
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<32; i++)
- {
- lcd_cmd_w(0x80+i);
- lcd_cmd_w(0x80);
- for(j=0; j<32; j++)
- {
- lcd_dat_w(0xff);
- }
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 数 名】:lcd_block_on *
- *【修改日期】:2008年7月10日 *
- *【函数作用】:反白2个汉字大小的面积 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void lcd_block_on(uchar temp)
- {
- uchar i, j, x, y;
- y = temp - 1;
- if(y >= 2)
- {
- x = 8;
- y = (y-2)*16;
- }
- else
- {
- x = 0;
- y = y*16;
- }
-
- lcd_cmd_w(0x34);
- lcd_cmd_w(0x36);
- for(i=0; i<16; i++)
- {
-
- lcd_cmd_w(0x80+y);
- lcd_cmd_w(0x80+x);
- y++;
- for(j=0; j<12; j++)
- lcd_dat_w(0x00);
- for(j=0; j<4;j++)
- lcd_dat_w(0xff);
- }
- lcd_cmd_w(0x30);
- delay(2);
- }
- /*******************************************************************
- *【函 数 名】:logo *
- *【修改日期】:2008年7月2日 *
- *【函数作用】:系统开机画面 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- /*void logo()
- {
-
- CS = 0;
- SCLK = 0;
- SID = 0;
- lcd_initial();
- lcd_cmd_w(0x01);
- lcd_setposition(2,0);
- lcd_str_w("便携式叶绿素含量");
- lcd_setposition(3,1);
- lcd_str_w("光电检测仪V2");
- delay(100);
-
- lcd_cmd_w(0x01);
- lcd_setposition(1,1);
- lcd_str_w("国家创新计划");
- lcd_setposition(2,2);
- lcd_str_w("GCS07001");
- lcd_setposition(3,1);
- lcd_str_w("北京林业大学");
- lcd_setposition(4,0);
- lcd_str_w("理学院基础楼305 ");
- delay(100);
- }
- /*******************************************************************
- *【函 数 名】:logo2 *
- *【修改日期】:2008年7月8日 *
- *【函数作用】:系统开机画面 *
- *------------------------------------------------------------------*
- *【备 注】: *
- *******************************************************************/
- void logo2()
- {
- lcd_initial();
- lcd_black_pic(); //完整刷屏
- delay(10);
-
- lcd_setposition(2,0);
- lcd_str_w("便携式叶绿素含量");
- lcd_row_off(2);
- lcd_setposition(3,1);
- lcd_str_w("光电检测仪V2");
- lcd_row_off(3);
- delay(100);
- lcd_cmd_w(0x01);
- lcd_row_on(2);
- lcd_row_on(3);
- lcd_setposition(1,1);
- lcd_str_w("国家创新计划");
- lcd_setposition(2,2);
- lcd_str_w("GCS07001");
- lcd_setposition(3,1);
- lcd_str_w("北京林业大学");
- lcd_setposition(4,0);
- lcd_str_w("理学院基础楼305 ");
- delay(100);
- lcd_clear_pic();
- }
- #endif
复制代码
|