微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 1602屏显示,含自定义字库

1602屏显示,含自定义字库

时间:10-02 整理:3721RD 点击:
#include <reg51.h>
/********************************************************************
基本操作:
读状态: 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=数据;
*********************************************************************/
#define uint8 unsigned char
#define uint16  unsigned int
//定义控制引脚
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
uint8 Data1[16]={'2','0','1','4',0x01,'0','9',0x02,'0','1',0x03};
uint8 Data2[16]="welcome";
//自定义字符
uint8 code CGCODE[]={//1602屏为5*8点阵取低5位控制显示
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//显示年0x00
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//显示月0x01
0x0F,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00 //显示日0x02
};
//-----------函数的声明------------------
void DelayMS(uint16 dly);//延时程序
void User_def(void);//自定义字库
//----------液晶模块的声明---------------
bit BUSY(void);
void Write_cmd(uint8 cmd);//写命令
void Write_dat(uint8 dat);//写数据
void LCD_Init(void);//初始化屏
//---------Main Task---------------------
void main(void)
{
uint8 i;
LCD_Init();
User_def();         //将自定义的字符写入CGRAM
while(1)
{
  Write_cmd(0x80+0x02);
  /*Write_dat(0x32);   //      2
  Write_dat(0x30);   //      0
  Write_dat(0x31);   //      1
  Write_dat(0x31);   //      1
  Write_dat(0x01);   //显示  年  
  Write_dat(0x31);   //      1
  Write_dat(0x31);   //      1
  Write_dat(0x02);   //显示  月
  Write_dat(0x31);   //      1
  Write_dat(0x31);   //      1
  Write_dat(0x03);*/   //显示  日
         for(i=0;i<16;i++)
   Write_dat(Data1[i]);
  Write_cmd(0xc2+0x02);
  for(i=0;i<16;i++)
   Write_dat(Data2[i]);      
}
}
//延时程序
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;
RS = 0;
RW = 1;
EN = 1;
DelayMS(1);
Bit = (bit)(P0 & 0x80); //最高位为忙信号位 (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(0x38);   //功能设置
DelayMS(1);
Write_cmd(0x0c);   //显示开关控制
DelayMS(1);
Write_cmd(0x06);   //输入方式设置
DelayMS(1);
Write_cmd(0x01);   //清除LCD的显示内容
DelayMS(1);
}
void User_def(void)
{
uint8 i;
Write_cmd(0x40);   //设置CGRAM地址
for(i=0;i<32;i++)
{
  Write_dat(CGCODE[i]);
}
   

0x00最好不要放自定义字符,否则用循环语句时易出错。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top