matlab波形反白,12864液晶的串行驱动程序 带反白显示,画图等

/*******************************************************************

*【文 件 名】: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

#include

//------------------------换名定义,方便使用----------------------

#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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值