壹拾捌:LCD12864的显示

发布者:心有所属最新更新时间:2019-08-13 来源: eefocus关键字:LCD12864 手机看文章 扫描二维码
随时随地手机看文章

这里写图片描述

#指令系统



这里写图片描述

#代码


*   【课程19】 ****LCD12864的实验***********

*

*   【说  明】 ****仿真环境中没有做好的字库所以需要自己做汉字字库

*

*   【描  述】 ****显示"源享科技"

*

******************************************************************     


基本操作:

读状态: RS=0,RW=1,EN=1

输出:D0~D7=状态字;

写指令: RS=0,RW=0,EN=下降沿脉冲

D0~D7=指令码;

读数据: RS=1,RW=1,EN=1

输出: D0~D7=数据;

写数据: RS=1,RW=1,EN=下降沿脉冲

D0~D7=数据;

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

#include //51头文件,


//---------常用的两个宏定义-------------- 

#define uint8 unsigned char

#define uint16  unsigned int

//--------12864的控制引脚定义-------------

sbit RS = P3^5;

sbit RW = P3^6;

sbit EN = P3^4;


sbit CS2 = P3^0;

sbit CS1 = P3^1;


uint8 code  yuan[]=

{

/*------------------------------------------------------------------------------

;  源文件 / 文字: 源


;  宽×高(像素) : 16×16

------------------------------------------------------------------------------*/

 0x10,0x21,0x06,0xE0,0x00,0xFE,0x02,0xF2,

 0x5A,0x56,0x52,0x52,0x52,0xF2,0x02,0x00,

 0x04,0xFC,0x03,0x40,0x30,0x0F,0x20,0x11,

 0x4D,0x81,0x7F,0x01,0x05,0x09,0x30,0x00

};


uint8 code xiang[]=

{


 0x00,0x04,0x04,0x74,0x54,0x54,0x55,0x56,

 0x54,0x54,0x54,0x74,0x04,0x04,0x00,0x00,

 0x08,0x08,0x09,0x09,0x09,0x29,0x49,0x89,

 0x7D,0x0B,0x0B,0x09,0x08,0x08,0x08,0x00

};

uint8 code ke[]=

{

/*--  文字:  科  --*/

/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

 0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,

 0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,

 0x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,

 0x04,0x02,0x02,0x02,0xFF,0x01,0x01,0x00

};

uint8 code ji[]=

{

/*--  文字:  技  --*/

/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/

 0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,

 0x48,0x48,0x7F,0x48,0xC8,0x48,0x08,0x00,

 0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,

 0x13,0x0C,0x0C,0x12,0x21,0x60,0x20,0x00

};

//-----------函数的声明------------------

void DelayMS(uint16 dly);



//----------液晶模块的声明---------------

bit BUSY(void); //测忙

void Write_cmd(uint8 cmd); //写命令

void Write_dat(uint8 dat); //写数据

//void LCD_Init(void);


void Set_page(uint8 page); //设置页

void Set_Line(uint8 line); //设置起始行

void Set_Col(uint8 col); //设置列

void Set_ONOFF(uint8 swich); //1开0关

void Clear(void); //清屏

void LCD_Init(void); //液晶屏初始化

void Display(uint8 screen,uint8 page,uint8 col,uint8 *p);//显示汉字

void Select_Screen(uint8 swich);//选择液晶屏(左右)


//---------Main Task---------------------

void main(void)

{

LCD_Init();

Display(1,0,0,yuan); //源

Display(1,2,0,xiang); //享

Display(1,4,0,ke); //科

Display(1,6,0,ji); //技


Display(2,0,0,yuan);

Display(2,2,0,xiang);

Display(2,4,0,ke);

Display(2,6,0,ji);

while(1)

{

}

}


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

** 名称 :void DelayMS(uint16 dly)

** 功能 :毫秒级延时(12M的晶振)

** 入口参数 :dly

用户的延时参数   

** 出口参数 :无   

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

void DelayMS(uint16 dly)

{

uint16 x,y;

for(x=dly;x>0;x--)

for(y=124;y>0;y--);

}


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

** 名称 :bit BUSY(void)

** 功能 :检测LCD1602是否处于忙状态;

** 入口参数 :无   

** 出口参数 :bit Bit

返回1,则BUSY

返回0,则OK   

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

bit BUSY(void)

{

bit Bit;

P0 = 0x00;

RS = 0;

RW = 1;

EN = 1;

DelayMS(1);

Bit = (bit)(P0 & 0x80); //最高位为忙信号位

EN = 0;

return Bit;

}


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

** 名称 :void Write_cmd(uint8 cmd)

** 功能 :写命令

** 入口参数 :cmd

控制命令   

** 出口参数 :无   

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

void Write_cmd(uint8 cmd)

{

while(BUSY()); //测忙

RS = 0;

RW = 0;

EN = 0;

P0 = cmd;

EN = 1;

DelayMS(1);

EN = 0;

}


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

** 名称 :void Write_dat(uint8 dat)

** 功能 :写数据

** 入口参数 :dat

要显示的数据  

** 出口参数 :无   

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

void Write_dat(uint8 dat)

{

while(BUSY()); //测忙

RS = 1;

RW = 0;

EN = 0;

P0 = dat;

EN = 1;

DelayMS(1);

EN = 0;

}


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

** 名称 :void LCD_Init(void)

** 功能 :液晶的初始化

** 入口参数 :无 

** 出口参数 :无   

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

/*void LCD_Init(void)

{


Write_cmd(0x34);      //扩充指令操作

    DelayMS(5);

    Write_cmd(0x30);      //基本指令操作

    DelayMS(5);

    Write_cmd(0x0C);      //显示开,关光标

    DelayMS(5);

    Write_cmd(0x01);      //清除LCD的显示内容

    DelayMS(5);

}*/


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

** 名称 :void Set_page(uint8 page)

** 功能 :设置页

** 入口参数 :uint8 

page 0~7共8页 

** 出口参数 :无   

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

void Set_page(uint8 page)

{

page = 0xb8|page; //页的首地址为0XB8

Write_cmd(page);

}


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

** 名称 :void Set_Line(uint8 line)

** 功能 :设置起始行

** 入口参数 :uint8 

line

** 出口参数 :无   

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

void Set_Line(uint8 line)

{

line = 0xc0|line;

Write_cmd(line);

}


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

** 名称 :void Set_Col(uint8 col)

** 功能 :设置列的起始位置

** 入口参数 :uint8 

col

** 出口参数 :无   

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

void Set_Col(uint8 col)

{

col = col&0x3f;

col = 0x40|col;

Write_cmd(col);

}


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

** 名称 :void Select_Screen(uint8 swich)

** 功能 :选择屏幕---左右屏幕

** 入口参数 :uint8 

swich

** 出口参数 :无   

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

void Select_Screen(uint8 swich)

{

switch(swich)

{

case 0: CS1 = CS2 =0; //全屏

break;

case 1: CS1 = 0;CS2 = 1; //左屏

break;

case 2: CS1 =1; CS2 = 0; //右屏

break;

default:

break;

}

}


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

** 名称 :void Set_ONOFF(uint8 swich) //0或1

** 功能 :设置显示开关

** 入口参数 :uint8 

swich 0---关

1---开

** 出口参数 :无   

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

void Set_ONOFF(uint8 swich) //0或1

{

swich = 0x3e|swich;

Write_cmd(swich);

}


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

** 名称 :void Clear(void)

** 功能 :清屏

** 入口参数 :无

** 出口参数 :无   

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

void Clear(void)

{

uint8 i,j;


for(i=0;i<8;i++)

{

Set_page(i);

Set_Col(0);

for(j=0;j<64;j++)

{

Write_dat(0x00);

}

}

}


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

** 名称 :void LCD_Init(void)

** 功能 :初始化

** 入口参数 :无

** 出口参数 :无   

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

void LCD_Init(void)

{

while(BUSY()); //测忙

Set_ONOFF(1);

Clear();

Set_Line(0);

}


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

** 名称 :void Display(uint8 screen,uint8 page,uint8 col,uint8 *p)

** 功能 :汉字的显示

** 入口参数 :uint8 

screen 选屏

page 页

col 列

*p 显示的汉字指针

** 出口参数 :无   

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

void Display(uint8 screen,uint8 page,uint8 col,uint8 *p)

{

uint8 i;

Select_Screen(screen);

Set_page(page);

Set_Col(col);

for(i=0;i<16;i++)

{

Write_dat(p[i]);

}

Set_page(page+1);

Set_Col(col);

for(i=0;i<16;i++)

{

Write_dat(p[i+16]);

}

}


关键字:LCD12864 引用地址:壹拾捌:LCD12864的显示

上一篇:壹拾柒:DS1302的操作
下一篇:壹拾玖:DS18B20的温度读取

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved