⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcm2402_dev.c

📁 基于单片机和液晶2402的数字钟     包含电路图及源码
💻 C
字号:
		 
/********************************************************************************************
* 程 序 名:LCM2402_DEV.c
* 功    能:LCM2402液晶模块驱动(MBC24204)
* 硬件条件:1.CPU型号:AT89S52
*           2.晶振:12.000MHz
*           3.LCM2402与AT89S52的连接如下:
*
*             LCM2402       AT89S52                   备      注
*        ==================================================================
*              RS            P1.0          0:传送命令;  1:传送数据
*              RW            P1.2          0:进行写操作;1:进行读操作
*              E             P1.1          读写脉冲
*              DB0           P0.0          数据线0
*              DB1           P0.1          数据线1
*              DB2           P0.2          数据线2
*              DB3           P0.3          数据线3
*              DB4           P0.4          数据线4
*              DB5           P0.5          数据线5
*              DB6           P0.6          数据线6
*              DB7           P0.7          数据线7
*        ==================================================================
*********************************************************************************************/




/********************************************************************************************/
#include <AT89X52.h>
#include <string.h>                               // 包含头文件    
/********************************************************************************************/
typedef unsigned char      uint8;                // 无符号8位整型变量
typedef signed   char      int8;                 // 有符号8位整型变量
typedef unsigned short     uint16;               // 无符号16位整型变量
typedef signed   short     int16;                // 有符号16位整型变量
typedef unsigned int       uint32;               // 无符号32位整型变量
typedef signed   int       int32;                // 有符号32位整型变量
typedef float              fp32;                 // 单精度浮点数(32位长度)
typedef double             fp64;                 // 双精度浮点数(64位长度)
/********************************************************************************************/
#define      LCM2402_DB0_DB7      P0             // 定义LCM2402的数据总线

sbit LCM2402_RS   = P1 ^ 0;                      // 定义LCM2402的RS控制线
sbit LCM2402_RW   = P1 ^ 2;                      // 定义LCM2402的RW控制线
sbit LCM2402_E    = P1 ^ 1;                      // 定义LCM2402的E控制线
sbit LCM2402_Busy = P0 ^ 7;                      // 定义LCM2402的测忙线

uint8 code ARMSKY_51Easy[] = {" ARMSKY-51Easy  "};
uint8 code Welcome[]={"Welcome to:     "};
uint8 code website[] = {" www.armsky.net "};

/********************************************************************************************/
//定义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             // 上边行左行首位置
#define			lin_2			0xc0             // 下边行左行首位置


/********************************************************************************************[底层协议]
* 函数名称:LCM2402_Delay()	
* 功    能:LCM2402时序控制专用软件延时
* 入口参数:count    延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void LCM2402_Delay(uint16 count){
  uint8 i;                
  while(--count != 0)        
    {
     for(i = 0; i < 125; i++);                // ";" 表示空语句,CPU空转。
   }                                // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}
/********************************************************************************************[底层协议]
* 函数名称:LCM2402_TestBusy()
* 功    能:LCM2402测忙,若LCM2402处于忙状态,本函数将继续测忙,直到LCM2402处于非忙状态。
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCM2402_TestBusy(void){
  do{
   LCM2402_DB0_DB7 = 0xff;
   LCM2402_RS = 0;
   LCM2402_RW = 1;
   LCM2402_E = 0;
   LCM2402_Delay(2);
   LCM2402_E = 1;
 }
 while(LCM2402_Busy);
}
/********************************************************************************************[底层协议]
* 函数名称:LCM2402_WriteCMD()
* 功    能:向LCM2402写命令。
* 入口参数:LCM2402_command     要写入LCM2402的命令字节
* 出口参数:无
*********************************************************************************************/
void LCM2402_WriteCMD(uint8 LCM2402_command) { 
  LCM2402_DB0_DB7 = LCM2402_command;
  LCM2402_RS = 0;
  LCM2402_RW = 0;
  LCM2402_E = 0;
  LCM2402_TestBusy();
  LCM2402_E = 1;
}
/********************************************************************************************[底层协议]
* 函数名称:LCM2402_WriteData()
* 功    能:向LCM2402写数据。
* 入口参数:LCM2402_data     要写入LCM2402的数据字节
* 出口参数:无
*********************************************************************************************/
void LCM2402_WriteData(uint8 LCM2402_data){ 
  LCM2402_DB0_DB7 = LCM2402_data;
  LCM2402_RS = 1;
  LCM2402_RW = 0;
  LCM2402_E = 0;
  LCM2402_TestBusy();
  LCM2402_E = 1;
}
/********************************************************************************************
* 函数名称:LCM2402_Init()
* 功    能:LCM2402初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void LCM2402_Init(void){
  LCM2402_WriteCMD(CMD_set82);// 显示模式设置:显示2行,每个字符为5*7个像素
  LCM2402_WriteCMD(CMD_clear);// 显示清屏
  LCM2402_WriteCMD(CMD_add1);// 显示光标移动设置:文字不动,光标右移
  LCM2402_WriteCMD(CMD_dis_gb3); // 显示开及光标设置:显示开,光标开,闪烁开
}


/********************************************************************************************
* 函数名称:print()
* 功    能:向LCM发送一个字符串,长度48字符之内。//应用:print("doyoung.net");
* 入口参数:字符串
* 出口参数:无
*********************************************************************************************/
void print(uint8 *str){
		while(*str != '\0'){
			LCM2402_WriteData(*str++);
        }
		*str = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -