LCD1602 显示数字,字符,自定义字符,字符串,光标

/*******************************************
程序名:    1602液晶屏时钟程序
编写时间:  2015年10月4日
硬件支持:  LCD1602液晶屏  STC12C4052AD 外部12MHZ晶振 
接线定义:  DB0_DB7 --> P1^0 --P1^7
						RS   = P3 ^ 2;
					        RW   = P3 ^ 3;
 						E    = P3 ^ 4;
 
功能:测试LCD1602的显示,显示时间,http://990487026.blog.51cto.com/ ,Welcome to linux Debian VS Redhat 
*******************************************/

#include <AT89X52.h>      // 包含头文件 //
typedef unsigned char      uint8;   // 无符号8位整型变量 //

#define  LCD1602_DB0_DB7  P1   // 定义LCD1602的数据总线
sbit LCD1602_RS   = P3 ^ 2;     // 定义LCD1602的RS控制线
sbit LCD1602_RW   = P3 ^ 3;     // 定义LCD1602的RW控制线
sbit LCD1602_E    = P3 ^ 4;     // 定义LCD1602的E控制线
sbit LCD1602_Busy = P1 ^ 7;     // 定义LCD1602的测忙线(与LCD1602_DB0_DB7关联)

// 定义LCM2402指令集 // (详细请见技术手册)
#define         CMD_clear         0x01             // 清除屏幕
#define         CMD_back          0x02             // DDRAM回零位
#define         CMD_dec1          0x04             // 读入后AC(指针)减1,向左写
#define         CMD_add1          0x06             // 读入后AC(指针)加1,向右写
#define         CMD_dis_gb1     0x0f             // 开显示_开光标_开光标闪烁
#define         CMD_dis_gb2     0x0e             // 开显示_开光标_关光标闪烁
#define         CMD_dis_gb3     0x0c             // 开显示_关光标_关光标闪烁
#define         CMD_OFF_dis     0x08             // 关显示_关光标_关光标闪烁
#define         CMD_set82       0x38             // 8位总线_2行显示
#define         CMD_set81       0x30             // 8位总线_1行显示(上边行)
#define         CMD_set42       0x28             // 4位总线_2行显示
#define         CMD_set41       0x20             // 4位总线_1行显示(上边行)
#define         lin_1           0x80             // 4位总线_1行显示(上边行)
#define         lin_2           0xc0             // 4位总线_1行显示(上边行)


void DELAY_MS (unsigned int a) {
    unsigned int i;
    while ( --a != 0 )   {
  for (i=0;i<=600;i++);
    }
}

// LCD1602测忙,若LCD1602处于忙状态,本函数将等待至非忙状态 //
void LCD1602_TestBusy(void){
    LCD1602_DB0_DB7 = 0xff;  //设备读状态
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    LCD1602_E = 1;
    while(LCD1602_Busy);  //等待LCM不忙
    LCD1602_E = 0;    
}

// 写指令程序 //
void LCD1602_WriteCMD(uint8 LCD1602_command) { 
   LCD1602_TestBusy();
   LCD1602_DB0_DB7 = LCD1602_command;
   LCD1602_RS = 0;
   LCD1602_RW = 0;
   LCD1602_E = 1;
   DELAY_MS(5);  // 修改延时,改变显示速度
   LCD1602_E = 0;
}

// 写数据程序 //
void LCD1602_WriteData(uint8 LCD1602_data){ 
   LCD1602_TestBusy();
   LCD1602_DB0_DB7 = LCD1602_data;
   LCD1602_RS = 1;
   LCD1602_RW = 0;
   LCD1602_E = 1;
   DELAY_MS(5);  // 修改延时,改变显示速度
   LCD1602_E = 0;
}
 

// 打印字符串程序   (本函数调用指针函数)长度48字符之内 
void print(uint8 a,uint8 *str){
  LCD1602_WriteCMD(a | 0x80);
  while(*str != '\0'){
  LCD1602_WriteData(*str++);
 }
 *str = 0;
}

// 打印单字符程序 // 
void print2(uint8 a,uint8 t){
  LCD1602_WriteCMD(a | 0x80);
  LCD1602_WriteData(t);
}

// 自定义字符 一共可写入16个自字义字符,写入后可用其CGRAM代码直接提取显示。
uint8 code Xword[]={
    0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,  //℃,代码 0x00
    0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,  //一,代码 0x01
    0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,  //二,代码 0x02
    0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,  //三,代码 0x03
    0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,  //四,代码 0x04
    0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,  //五,代码 0x05
    0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,  //六,代码 0x06
    0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,  //日,代码 0x07
};
void CgramWrite(void) { // 装入CGRAM //
    uint8 i;
    LCD1602_WriteCMD(0x06);   // CGRAM地址自动加1
    LCD1602_WriteCMD(0x40);   // CGRAM地址设为00处
    for(i=0;i<64;i++) {
    LCD1602_WriteData(Xword[i]);// 按数组写入数据
    }
}





// LCD1602初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改)
void LCD1602_Init(void){
   LCD1602_WriteCMD(CMD_set82); //* 显示模式设置:显示2行,每个字符为5*7个像素,CMD_set81就是一行
   LCD1602_WriteCMD(CMD_clear); //  显示清屏
   LCD1602_WriteCMD(CMD_back);  //* 数据指针指向第1行第1个字符位置
   LCD1602_WriteCMD(CMD_add1);  //  显示光标移动设置:文字不动,光标右移
   LCD1602_WriteCMD(CMD_dis_gb1);  //  显示开及光标设置:显示开,光标开,闪烁开
   CgramWrite();     //  向CGRAM写入自定义字符
}







void main (void){
  LCD1602_Init();//LCD1602初始化   
  while(1){ 
  print2(0x80,1+0x30);   // 在第1行第1位显示数字1
  print2(0x40,5+0x30);   // 在第1行第1位显示数字2
  print2(0x85,0x05);     // 在第1行第5位显示自定义字符
  print2(0x88,0xE4);     // 在第1行第9位 ASCII 中的upeer 4bit 1110  lower 4bit 0100对应的 μ 
  DELAY_MS(2000);  // 打开光标显示,闪烁,在μ后面就会显示一个跳动的光标
  print2(0x81,'D');     // 在第1行第5位显示自定义字符
  print (0x42,"www.51cto.com"); //在第2行第一位处从左向右打印"blog.51cto.com"字符串
  print (0x8e,"hi"); //在第1行第15位处从左向右打印"hi"字符串
		
  }
 }


 //LCD1602 显示数字,字符,自定义字符,字符串,光标

wKiom1YQ4wKxkIEUAAJ68eTjxSo774.jpg