LCD1602汇编显示程序
- 格式:doc
- 大小:51.00 KB
- 文档页数:3
/****************************************************************************** *** 描述: LCD1602 滚动显示** 显示方式:* * 1、从左到右逐字显示,闪动二次,清屏。
* * 2、再从右到左逐字显示,闪动二次,清屏。
* * 3、周期性地重复上述显示方式。
* ******************************************************************************* */#include <reg51.h>#include <intrins.h>typedef unsigned char BYTE;typedef bit BOOL;sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;BYTE code dis1[] = {" WELCOME TO "};BYTE code dis2[] = {" "};BYTE code dis3[] = {" OT EMOCLEW "};BYTE code dis4[] = {" MOC.NIHCERP.WWW "};delay(int ms){ // 延时子程序int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);LCD_EP = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}main(){BYTE i;lcd_init(); // 初始化LCDdelay(10);while(1){lcd_wcmd(0x06); //向右移动光标lcd_pos(0); //设置显示位置为第一行的第1个字符i = 0;while(dis1[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis1[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x40); //设置显示位置为第二行第1个字符i = 0;while(dis2[ i ] != '\0'){lcd_wdat(dis2[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(1);lcd_wcmd(0x04); //向左移动光标lcd_pos(15); //设置显示位置为第一行的第16个字符i = 0;while(dis3[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis3[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x4F); //设置显示位置为第二行的第16个字符i = 0;while(dis4[ i ] != '\0'){lcd_wdat(dis4[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(200); //控制两屏转换时间}}。
1602汇编指令程序ORG 0000HAJMP STARTORG 0013HLJMP INT1ZDORG 0030HRS BIT P3.5RW BIT P3.6E BIT P3.4L0 EQU P0START:CLR RS //初始化CLR RWMOV L0,#38HSETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#06HSETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#0CH //选中第二行显示SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#' ' //显示空白SETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#00HSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'.' //显示 .SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'1' //显示SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'6'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#' 'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'.'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'c'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'o'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'m'SETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#0C0HSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'t'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'e'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'l'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'l'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#':'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'2'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'-'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'7'ACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'-'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'5'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'7'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'3'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'6'SETB EACALL DELAYSJMP $DELAY:MOV R5,#10 //延时子程序 D0:MOV R6,#10D1:DJNZ R6,D1DJNZ R5,D0RETEND。
1602汇编程序, 51单片机汇编程序,仅需修改引脚定义即可。
晶振大小 12M ,程序测试完全正确。
内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。
调用时先给 LCD_DAT赋值,给出需要写入的数据或命令,然后调用。
; 端口引脚定义区LCD_RS BIT P2.4 ;1602数据命令选择端口LCD_RW BIT P2.5 ;1602读写选择端口LCD_EN BIT P2.6 ;1602使能端口LCD_DATA EQU P0 ;1602数据端口; 变量声明区ALL_FLAG EQU 20H ; 标志位LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位LCD_DAT EQU 30H ;1602数据命令字DELAYED EQU 31H ; 延时字/*****************************************1602读命令函数,高位存至 LCD_LAG中*****************************************/LCD_R_DATA:MOV LCD_DATA,#0FFHLCD_BUSY: CLR LCD_RSSETB L CD_RWNOPSETB L CD_ENNOPMOV Acc,LCD_DATAMOV C,Acc.7MOV LCD_FLAG,CCLR LCD_ENNOPJB LCD_FLAG,LCD_BUSYRET/***************************************** 1602写数据函数,数据存在 LCD_DAT*****************************************/ LCD_W_DATA:LCALL LCD_R_DATASETB L CD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DATSETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602写命令函数,命令存在LCD_DAT,检测忙信号 *****************************************/LCD_W_CMD:LCALL LCD_R_DATACLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602写命令函数,命令存在LCD_DAT,不检测忙信号 *****************************************/ LCD_CMD:CLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA,LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 1602初始化函数*****************************************/ LCD_INIT: MOV DELAYED,#30LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#038HLCALL LCD_W_CMDMOV LCD_DAT,#08HLCALL LCD_W_CMDMOV LCD_DAT,#01HLCALL LCD_W_CMDMOV LCD_DAT,#06HLCALL LCD_W_CMDMOV LCD_DAT,#0CHLCALL LCD_W_CMDRET/*****************************************延时函数,延时时间为 DELAYED*0.5毫秒 0~100毫秒的延时*****************************************/DELAY_MS:MOV R7,DELAYEDD1: MOV R6,#0F8HD2: DJNZ R6,D2DJNZ R7,D1RET/*****************************************延时函数,延时时间为 DELAYED*2微秒 0~500微秒的延时*****************************************/DELAY_US:MOV R7,ADU1:DJNZ R7,DU1RET。
LCD1602原理与显示程序LCD1602的原理是基于液晶显示技术。
液晶是一种特殊的物质,具有双折射性质,即能将入射的光线分成两束,通过改变液晶分子的排列方式,可以改变其双折射的性质,从而使得光线透过液晶时会发生偏转。
LCD1602利用这一原理,在液晶显示面板上设置了16列和2行的像素点阵,通过控制每个像素点的液晶分子的排列方式,来实现字符的显示。
初始化是指在使用LCD1602之前,需要对其进行一系列的初始化操作,以确保其正常工作。
具体的初始化步骤如下:1.设置通信协议:LCD1602可以通过并行接口和串行接口进行通信,根据具体的接口方式,选择相应的通信协议。
2.设置工作模式:LCD1602有两种工作模式,分别是4位模式和8位模式。
选择适合的工作模式,并设置相应的控制寄存器。
3.设置显示模式:LCD1602可以显示不同的字符集,如英文字符、数字、特殊符号等。
选择合适的字符集,并设置显示模式。
4.清除显示:设置清除显示寄存器,将显示区域清空。
5.光标设置:设置光标位置和显示方式,如光标是否闪烁、光标位置等。
完成初始化后,就可以将要显示的数据写入LCD1602数据写入是指将要显示的字符或数字写入到LCD1602的显示区域。
具体的数据写入步骤如下:1.设置光标位置:根据需要显示的字符位置,设置光标的位置。
2.数据写入:通过通信接口,将要显示的数据写入到LCD1602的数据寄存器。
3.延时:由于LCD1602的刷新速度较慢,需要等待一定的时间,使得数据能够稳定显示在液晶屏上。
4.更新光标位置:根据数据的长度和显示方式,更新光标的位置。
通过以上的步骤,就可以实现LCD1602的显示功能。
总结起来,LCD1602的原理是基于液晶显示技术,通过控制液晶分子排列方式来实现字符的显示。
其显示程序包括初始化和数据写入两个方面的内容,通过设置通信协议、工作模式、显示模式等参数,并将要显示的数据写入到LCD1602的显示区域,来实现字符的显示。
/**************************************************** LCD1602显示** 描述:4线数据宽度,操作Lcd1602* 在LCD1602屏幕上第一行显示Hello!LCD1602* 第二行显示123456789abcdef** 时间:2012年3月15日调试成功(出现问题主要是因为LCD初始化)** 硬件电路:MSP430F2132* 硬件连接:** MSP430与LCD连接信息* LCD1602,4位接口,即使用D4-D7数据口,D0-D3不接入MCU* PIN1 --> 地* PIN2 --> VCC(一定要接+5V)* PIN3 -->仿真时悬空,实际电路2K电阻-->地(一定要接好,否则没有任何显示) * PIN4 --> RS --> P2.2* PIN5 --> R/W --> GND* PIN6 --> EN --> P2.1* PIN7 --> D0不接* PIN8 --> D1不接* PIN9 --> D2不接* PIN10 --> D3不接* PIN11 --> D4 --> P1.4* PIN12 --> D5 --> P1.5* PIN13 --> D6 --> P1.6* PIN14 --> D7 --> P1.7* PIN15 --> VCC(一定要接+5V,如果不要背光可以不接* PIN16 --> 地* 调试器:MSP430FET全系列JTAG仿真器* 调试软件:CCS5.1.1 编译**************************************************/#include "msp430f2132.h"#include <intrinsics.h>//定义////////////////////////////////////////////////////////////////////#define LCD_EN_PORT P2OUT//以下2个要设为同一个口#define LCD_EN_DDR P2DIR#define LCD_RS_PORT P2OUT//以下2个要设为同一个口#define LCD_RS_DDR P2DIR#define LCD_DATA_PORT P1OUT //以下3个要设为同一个口#define LCD_DATA_DDR P1DIR //一定要用高4位#define LCD_RS BIT2#define LCD_EN BIT1//#define LCD_DATA BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7 //8位数据线连接模式时使用#define LCD_DATA BIT4|BIT5|BIT6|BIT7 //4位数据线连接模式时使用////预定义函数//////////////////////////////////////////////////////////////////void LCD_init(void);void LCD_en_write(void);void LCD_write_command(unsigned char command);void LCD_write_data(unsigned char data);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);void delay_1ms(void);void delay_nus(unsigned int n);void delay_nms(unsigned int n);void main(){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogLCD_init();delay_1ms();LCD_write_string(0,0,"Hello!LCD1602");delay_1ms();LCD_write_string(0,1,"123456789abcdef");}//LCD液晶操作函数/////////////////////////////////////////////////////////////////LCD1602液晶初始化void LCD_init(void){delay_nms(15);LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出LCD_EN_DDR|=LCD_EN; //设置EN方向为输出LCD_RS_DDR|=LCD_RS; //设置RS方向为输出delay_1ms(); //这4行不要改,否则仿真没显示// LCD_write_command(0x38); //8位数据接口时,使用这行,否则仿真没显示LCD_write_command(0x33); //4位数据接口时,使用这行,否则仿真没显示delay_1ms(); //// LCD_write_command(0x38); //8位数据接口时,使用这行,否则仿真没显示LCD_write_command(0x32); //4位数据接口时,使用这行,否则仿真没显示delay_1ms();// LCD_write_command(0x38); //8位数据接口时,使用这行,否则仿真没显示delay_1ms();// LCD_write_command(0x38); //8位数据接口LCD_write_command(0x2c); //4位数据接口delay_1ms();LCD_write_command(0x0c); //显示开delay_1ms();LCD_write_command(0x01); //清屏delay_1ms();LCD_write_command(0x06);}//液晶使能void LCD_en_write(void){LCD_EN_PORT|=LCD_EN;delay_nus(10);LCD_EN_PORT&=~LCD_EN;}//写指令void LCD_write_command(unsigned char command) {delay_nus(16);LCD_RS_PORT&=~LCD_RS; //RS=0LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写高四位//LCD_DATA_PORT = command; //写8位delay_nus(16);LCD_en_write();command=command<<4; //低四位移到高四位LCD_DATA_PORT&=0x0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写低四位LCD_en_write();}//写数据void LCD_write_data(unsigned char data){delay_nus(16);LCD_RS_PORT|=LCD_RS; //RS=1LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写高四位//LCD_DATA_PORT = data; //写8位LCD_en_write();data=data<<4; //低四位移到高四位LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=data&0xf0; //写低四位LCD_en_write();}//写地址函数void LCD_set_xy( unsigned char x, unsigned char y ){unsigned char address;if (y == 0) address = 0x80 + x;else address = 0xc0 + x;LCD_write_command( address);}//LCD在任意位置写字符串//列x=0~15,行y=0,1void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {LCD_set_xy( X, Y ); //写地址while (*s) // 写显示字符{LCD_write_data( *s );s ++;}}//LCD在任意位置写字符//列x=0~15,行y=0,1void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) {LCD_set_xy( X, Y ); //写地址LCD_write_data( data);}//延时函数////////////////////////////////////////////////////////////////////////1us延时函数void delay_1us(void){asm("nop");}//N us延时函数void delay_nus(unsigned int n) {unsigned int i;for (i=0;i<n;i++)delay_1us();}//1ms延时函数void delay_1ms(void){unsigned int i;for (i=0;i<1140;i++);}//N ms延时函数void delay_nms(unsigned int n) {unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}。
#include <>#define uchar unsigned char#define uint unsigned intsbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7;#define LCM_Data P1//数据接口void LCM_WriteData(uchar WDLCM);【void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code *DData); void Delay5Ms(void);void Delay400Ms(void);&uchar code uctech[] = {"1602A"};uchar code net[] = {".52c"};void main(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCM_Init();//LCM初始化Delay5Ms();//延时片刻(可不要)>DisplayListChar(6, 1, uctech);DisplayListChar(0, 0, net);LCM_ReadData();//测试用句无意义LCM_Data=255;while(1);}/****************************1602A写数据函数**************************//*函数原型:void LCM_WriteData(uchar WDLCM)|/*函数功能:1602A写数据/*输入参数:要写入的数据/*输出参数:无/*调用模块:/*建立时间:2005/11/14/*作者:站长/******************************************************************** **/void LCM_WriteData(uchar WDLCM)^{LCM_ReadStatus();//检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0;//若晶振速度太高可以在这后加小的延时LCM_E = 0;//延时LCM_E = 1;"}/****************************1602A写指令函数**************************//*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)/*函数功能:1602A写指令/*输入参数:要写入的指令/*输出参数:无/*调用模块:/*建立时间:2005/11/14《/*作者:站长/******************************************************************** **/void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测{if (BuysC) LCM_ReadStatus();//根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;-LCM_E = 0;LCM_E = 0;LCM_E = 1;}/****************************1602A读数据函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读数据/*输入参数:无~/*输出参数:1602A返回的数据/*调用模块:/*建立时间:2005/11/14/*作者:站长/******************************************************************** **/uchar LCM_ReadData(void){LCM_RS = 1;…LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}/****************************1602A读状态函数**************************//*函数原型:uchar LCM_ReadData(void)@/*函数功能:1602A读状态/*输入参数:无/*输出参数:1602A返回的状态/*调用模块:/*建立时间:2005/11/14/*作者:站长/******************************************************************** **/uchar LCM_ReadStatus(void)~{LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 1;while (LCM_Data & 0x80);//检测忙信号。
微机原理与接口技术专用周设计报设计科目:1602万年历设计所修课程:单片机课程设计人: 张毅(201212020250)杨梦柳(201212020309)系部:电气系班级:通信一班指导老师:王老师、施老师、杨老师时期:2013-12-9至201312-12-19目录第一章、设计内容及要求 (1)1、1设计内容 (1)1.2 各部分的功能 (1)1.3设计要求 (2)第二章、设计方案 (2)2.1实时时间计算模块方案 (2)2.2 液晶显示模块 (2)第三章、功能模块介绍 (3)3.1液晶模块 (3)3.1.1 功能特性介绍 (3)3.1.2 接口信号说明 (3)3.1.3 基本操作时序 (4)3.1.4 显示说明 (4)3.1.5 接口电路 (5)3.2按键控制模块 (5)3.3稳压电路模块 (6)3.4晶振模块 (6)3.5复位电路 (7)第四章、系统软件设计 (8)4.1程序路程图 (8)4.1.1主程序流程图 (8)4.1.2定时器流程图 (8)4.1.3 时间调整程序流程图 (9)第五章、测试方案和结果分析 (10)5.1 测试仪器 (10)5.2显示模块的调试 (10)5.3测试结果分析 (10)*附录一、程序清单 (11)二、电路总图 (28)三、参考文献 (28)四、专用周总结 (29)摘要:本文主要介绍了LCD1602的各个引脚的功能及其作用,也介绍了单片机的一些比较基础的,比较常用的一些资源的应用,同时也对PROTEUS硬件仿真电路有一定的认识。
对于单片机的原理设计电路,在了解硬件的基础上完成程序设计,是自己掌握对一个系统的初步规划和设计,同时也提高了自己分析问题的能力和资料整理的能力。
关键字:LCD1602,程序设计,硬件电路。
Abstract:T his paper mainly introduces the function and the function of each pin of LCD1602, also introduces micro controller some basis of comparison, some commonly used application resources, but also have a certain understanding to the PROTEUS hardware simulation circuit. The design principle of single chip circuit, completed the program design is based on the understanding of hardware, is in their own hands the preliminary planning and design of a system, but also improve the ability of their own ability to analyze the problem and the collation of data.Keyword:LCD1602, program design, hardware circuit.第一章、设计内容及要求1、1设计内容利用P89V51RD2单片机芯片和LCD1602液晶显示屏做个万年历,在显示屏上显示年、月、日、时、分、秒、星期。
#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit LCD_E=P3^5; //定义接口sbit LCD_RW=P3^6;sbit LCD_RS=P3^7;#define LCD_Data P1 //数据接口uchar up[]={"IvU,hupeixian"};uchar code down[]={"_by fu "}/*************************延时函数*****************************/void Delay_ms(uint time){uint i,j;for(i = 0;i < time;i ++)for(j = 0;j < 930;j ++);}/**********************检测状态************************************/ uchar LCD_ReadStatus(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 1;LCD_E = 1;LCD_E = 0;while (LCD_Data & 0x80); //检测忙信号return(LCD_Data);}/************************写数据***********************************/ void LCD_WriteData(uchar WDLCD){LCD_ReadStatus();//检测忙LCD_Data = WDLCDLCD_RS = 1;LCD_RW = 0;LCD_E = 1;//若晶振速度太高可以在这后加小的延时LCD_E = 1;//延时LCD_E = 0;}/************************写指令********************************/ void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC)LCD_ReadStatus(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 1;LCD_E = 0;}/*****************初始化***********************************/void LCD_Init(void){LCD_Data = 0;LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号Delay_ms(5);LCD_WriteCommand(0x38,0);Delay5Ms();LCD_WriteCommand(0x38,0);Delay_ms(5);LCD_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号LCD_WriteCommand(0x08,1); //关闭显示LCD_WriteCommand(0x01,1); //显示清屏LCD_WriteCommand(0x06,1); // 显示光标移动设置LCD_WriteCommand(0x0C,1); // 显示开及光标设置}/***********************显示一个字符********************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码LCD_WriteCommand(X, 0); //这里不检测忙信号,发送地址码LCD_WriteData(DData);}/************************显示一串字符*******************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/******************************************************************/ void main(void){Delay_ms(400); //启动等待,等LCD讲入工作状态LCD_Init(); //LCD初始化Delay_ms(5); //延时片刻(可不要)DisplayListChar(0, 1, up);DisplayListChar(6, 0, down);LCD_Data=0xff;while(1);}。