版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17017545/article/details/81974054
#指令系统
#代码
* 【课程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<reg51.h> //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]);
}
}