LCD1602的驱动程序的代码编写
LCD1602液晶显示C程序
![LCD1602液晶显示C程序](https://img.taocdn.com/s3/m/512f978458fafab068dc021e.png)
1、关于1602液晶的电气参数一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。
HD44780S的供电电压为5V±10%,而HD44780U的供电电压为2.7V~5.5V。
也就是说,绝大部分1602液晶只能工作在5V电压下,其供电电压必须为5V。
经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。
需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。
2、硬件连接1602液晶可以使用4位或8位通信模式,通信可以是双向的或单向的,双向通信主要是为了读取LCD忙标志和AC地址寄存器和DDRAM和CGRAM中的值,一般用处不大,因为1602不支持点阵绘图功能。
在连接时,注意4位通信方式下,LCD只使用DB7~DB4,一般情况下会使用MCU 某端口的高4位或低4位与之连接,注意写驱动时在必要的情况下对端口的其它几位要保护,防止破坏其数据;当然如果没有使用其它4位时则不必要保护(奇怪,不使用其它4位干嘛用4位通信方式嘛?)。
还要注意的是,如果需要双向通信,则必须选择既能做输入又能做输出的IO口,特别是对于RS、RW和E这三条控制线,若能选择支持位寻址的IO口则可以方便编程。
3、底层驱动问题通用1602液晶的时序如图:(1)、写时序(2)、读时序总的说来,按照这个时序图来编写驱动程序是不会出什么问题的,只是要深刻理解时序图中各参数的涵义。
编程中要特别关注E这根控制线。
写操作的时序应该是:①、RS=0(写指令寄存器)或RS=1(写数据寄存器);②、RW=0(写操作);③、将数据写到数据线上;④、E=1;⑤、E=0 。
LCD1602汇编程序
![LCD1602汇编程序](https://img.taocdn.com/s3/m/fdb0c4d5fab069dc51220108.png)
;******************************************* ********************* ;本程序用来驱动LCD1602 *;****************************************************************RS BIT P2.0 ;RS引脚RW BIT P2.1 ;RW引脚E BIT P2.2 ;使能信号引脚DA T_X EQU 08H ;存放DDRAM的列序号DA T_Y EQU 09H ;存放DDRAM的行序号DA T_C EQU 10H ;存放待显示的数据;**************************************************************** ORG 0000HAJMP STARTORG 0030H;**************************************************************** ;对LCD进行初始化*;**************************************************************** START: MOV SP, #5FH;LCALL DL_1640U ;延时大约(不小于)1.64msMOV A, #38H ;初始化LCD,数据总线为8位;显示2行,57点阵/字符LCALL CMD_LC ;调用指令发送程序MOV A, #0FH ;开显示,有光标闪烁LCALL CMD_LC ;调用指令发送程序MOV A, #06H ;写入新数据后光标右移,;写入新数据后,屏幕不移动LCALL CMD_LC ;调用指令发送程序MOV A, #01H ;清楚屏幕显示LCALL CMD_LC ;调用指令发送程序LCALL DL_1640U ;延时1.64ms,因为清屏指令;的执行时间是1.64ms;**************************************************************** ;主程序*;**************************************************************** MAIN: MOV DAT_C, #41H ;把A的ASCII码存入DA T_C中MOV DAT_X, #06 ;把列的序号存入DAT_X中MOV DAT_Y, #0 ;把行的序号存入DAT_Y中LCALL DAT_DISP ;调用显示程序AJMP $ ;主程序到此结束;**************************************************************** ;指令发送程序*;**************************************************************** CMD_LC: CLR R SCLR R WMOV P0, ASETB ECLR ELCALL DL_40U ;延时40us,我们知道大部分;的指令执行的时间都是40usRET;**************************************************************** ;数据发送程序*;**************************************************************** DA T_LC: SETB RSCLR R WMOV P0, ASETB E ;下降沿执行指令,;所以要先高后低CLR ELCALL DL_40U ;延时40usRET;**************************************************************** ;数据显示程序;**************************************************************** DA T_DISP: MOV R0, DAT_Y ;把行序号送到R0中CJNE R0, #1, DAT_1 ;判断行的序号是0;还是1如果是0,则;把列序号加上#80H;如果是01,则把列;序号加上#0C0HMOV A, DAT_XADD A, #0C0HLCALL CMD_LCMOV A, DAT_CLCALL DAT_LCRETDA T_1: MOV A, DAT_XADD A, #80HLCALL CMD_LCMOV A, DAT_CLCALL DAT_LCRET;**************************************************************** ;本程序用来延时大约(不小于)40us *;**************************************************************** DL_40U: MOV R7, #20 ;晶振频率是12M的情况下DJNZ R7, $RET;**************************************************************** ;本程序用来延时大约(不小于)1.64ms *;**************************************************************** DL_1640U: MOV R7, #20 ;晶振频率是12M的情况下DL_1640: MOV R6, #40DJNZ R6, $DJNZ R7, DL_1640RET;**************************************************************** END。
LCD1602驱动程序
![LCD1602驱动程序](https://img.taocdn.com/s3/m/35df5eecf8c75fbfc77db2c0.png)
1602是课程设计和毕业设计经常用到的显示器,还在愁怎么对1602操作吗?那么看完1602驱动程序,一切变得那么简单。
LCD1602驱动程序://===========LCD1602.H===============#ifndef _LCD1602_H__#define _LCD1602_H__#include<intrins.h>#include"delay.h"//lcd1602管脚定义#define LCD_Data P0 //第7~14脚:D0~D7为8位双向数据线#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCD_RS=P2^0; //寄存器选择位,将LCD_RS位定义为P2.0引脚sbit LCD_RW=P2^1; //读写选择位,将LCD_RW位定义为P2.1引脚sbit LCD_E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚//函数定义声明bit BusyTest(void);//判断液晶模块的忙碌状态void WriteInstruction (unsigned char );//将模式设置指令或显示地址写入液晶模块//void WriteAddress(unsigned char ); //指定字符显示的实际地址void WriteData(unsigned char );//将数据(字符的标准ASCII码)写入液晶模块void CursorFlash(unsigned char,unsigned char); //光标在指定坐标闪烁void InitLcd(void);//初始化LCD1602/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
LCD1602液晶程序
![LCD1602液晶程序](https://img.taocdn.com/s3/m/83495f25aaea998fcc220e99.png)
#ifndef __1602_H__#define __1602_H__#define LCD_DATA P0sbit LCD_BUSY=P0^7; //数据最高位,返回的是忙检测标志情况sbit LCD_RS=P2^0; //写指令时为0,数据为1sbit LCD_RW=P2^1; //读取为1,写入为0sbit LCD_EN=P1^2; //使能端/*检测忙信号*/void CHECK_BUSY(void) //读取忙标志位BF{LCD_RS=0;LCD_RW=1;LCD_EN=1;while(LCD_BUSY);LCD_EN=0;}/*写命令,为1判断忙信号,为0不判断*/void write_com(uchar com,uchar test){if(test)CHECK_BUSY();//忙信号检测LCD_RS=0;LCD_RW=0;LCD_EN=1;LCD_DATA=com;LCD_EN=0;delayms(1);}/*液晶1602初始*/void LCD1602_Init( ){write_com(0x38,0); //显示模式设置delayms(1);write_com(0x38,1); //显示模式设置write_com(0x08,1); //关显示,关闭光标和闪烁write_com(0x01,1); //显示清屏write_com(0x06,1); //读或写时地址指针和光标自动加一write_com(0x0c,1); //开显示,关闭光标和闪烁}/*写数据*/void write_data(uchar dat){CHECK_BUSY(); //检测忙标志LCD_RS=1;LCD_RW=0;LCD_EN=1;LCD_DATA=dat;LCD_EN=0;delayms(1);}/*设置显示坐标xy*/void locate_xy(uchar x, uchar y) //x为列,y为行{uchar temp;temp=x&0x0f;y&=0x01;if(y) temp|=0x40; //判断写的是第几行temp|=0x80; //写的地址最高位要为1才会被认为是写地址write_com(temp,1);}/*显示一个字符*/void disp1char(uchar x,uchar y,uchar dat){locate_xy(x,y);write_data(dat);}/*显示字符串*/void dispnchar(uchar x,uchar y,uchar n,uchar *str){uchar i;for(i=0;i<n;i++){disp1char(x++,y,str[i]);if(x ==16) //换行{x =0;y^=1; //位异或}}}#endif。
基于stm32的lcd1602实例代码
![基于stm32的lcd1602实例代码](https://img.taocdn.com/s3/m/57e4af456d85ec3a87c24028915f804d2a16874c.png)
基于stm32的lcd1602实例代码下面是一个基于STM32的LCD1602实例代码的示例。
请注意,这只是一个基本的示例,您可能需要根据您的硬件配置和需求进行修改。
```cinclude ""include "stm32f10x_"include "stm32f10x_"include "stm32f10x_"define LCD1602_RS 0x06define LCD1602_RW 0x05define LCD1602_E 0x04void LCD1602_Init(void);void LCD1602_WriteCommand(unsigned char command);void LCD1602_WriteData(unsigned char data);void LCD1602_WriteString(char str, unsigned char mode);int main(void){LCD1602_Init();LCD1602_WriteString("Hello World!", 1); // 写入数据模式,写入字符串"Hello World!"while(1){// 主循环可以根据需要添加其他代码}}void LCD1602_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIODRCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOD和GPIOB时钟GPIO__Pin = GPIO_Pin_All; // 配置所有引脚为输出模式GPIO__Mode = GPIO_Mode_Out_PP; // 推挽输出模式GPIO__Speed = GPIO_Speed_50MHz; // 输出速度为50MHzGPIO_Init(GPIOD, &GPIO_InitStructure); // 初始化GPIODGPIO__Pin = GPIO_Pin_4 GPIO_Pin_5 GPIO_Pin_6 GPIO_Pin_7; // 配置四个引脚为输出模式,对应LCD1602的RS、RW、E和RW引脚GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB}void LCD1602_WriteCommand(unsigned char command){GPIOB->ODR &= ~(1 << 4); // 将LCD1602的RS引脚设置为低电平,表示接下来写入的是命令GPIOB->ODR &= ~(1 << 5); // 将LCD1602的RW引脚设置为低电平,表示接下来写入的是命令而非数据LCD1602_Write8Bit(command); // 写入8位命令到LCD1602的DB引脚上}void LCD1602_WriteData(unsigned char data){GPIOB->ODR = (1 << 4); // 将LCD1602的RS引脚设置为高电平,表示接下来写入的是数据GPIOB->ODR &= ~(1 << 5); // 将LCD1602的RW引脚设置为低电平,表示接下来写入的是数据而非命令LCD1602_Write8Bit(data); // 写入8位数据到LCD1602的DB引脚上}void LCD1602_WriteString(char str, unsigned char mode){while(str != '\0') // 当字符串未结束时,持续写入字符串数据到LCD1602上{if(mode == 1) // 如果mode为1,则写入数据到LCD1602上,否则写入命令到LCD1602上{LCD1602_WriteData(str++); // 写入一个字符的数据到LCD1602上,并将指针向后移动一位,指向下一个字符的数据或命令位上}else // 如果mode为0,则写入命令到LCD1602上,否则写入数据到LCD1602上{LCD1602_WriteCommand(str++); // 写入一个字符的命令到LCD1602上,并将指针向后移动一位,指向下一个字符的数据或命令位上} } }```。
verilog驱动LCD1602显示
![verilog驱动LCD1602显示](https://img.taocdn.com/s3/m/8b526a1dff00bed5b9f31d95.png)
module lcd(clk,rst,test_mode,lcd_data_in,RS,RW,cont,en,lcd_data_out); input clk,rst;input [1:0] test_mode;input [15:0] lcd_data_in;output RS,RW,cont,en;output [7:0] lcd_data_out;wire en_out;reg RS,RW;reg[3:0] count;reg[7:0] lcd_data_out;reg[3:0] state;wire clk_out,clk_en,cont;reg en_tmp;parameter Warmup = 4'b0000,Funcset = 4'b0001,Dspoff = 4'b0011,Clsdsp = 4'b0010,Modeset = 4'b0110,Dspon = 4'b0111,Setaddr1 = 4'b0101,Indata1 = 4'b0100,Setaddr2 = 4'b1101,Indata2 = 4'b1100,Idle = 4'b1000;clkdiv U1(clk,clk_out);assign cont = 1'b0;always @(posedge clk or negedge rst)if(~rst)en_tmp<=1'b0;elseen_tmp<=clk_out;assign en= ~clk_out & en_tmp;assign clk_en = ~en_tmp & clk_out;always@(posedge clk or negedge rst)beginif(!rst)begincount<=0;state<=Warmup;endelsebegincase(state)Warmup:beginif(clk_en)begin if(count==4'b0111)beginstate<=Funcset;count<=0;endelsebeginstate<=Warmup;count<=count+4'b0001;endendendFuncset:beginif(clk_en)begin if(count==4'b1111)beginstate<=Dspoff;count<=0;endelsebeginstate<=Funcset;count<=count+4'b0001;endendendDspoff:state<=Clsdsp;Clsdsp:beginif(clk_en)beginif(count==4'b0101)beginstate<=Modeset;count<=0;endelsebeginstate<=Clsdsp;count<=count+4'b0001;endendendModeset: beginif(clk_en) state<=Dspon;endDspon:beginif(clk_en)beginif(count==4'b0100)beginstate<=Setaddr1;count<=0;endelsebeginstate<=Dspon;count<=count+4'b0001;endendendSetaddr1: begin if(clk_en) state<=Indata1;endIndata1:beginif(clk_en)beginif(count==4'b1110)beginstate<=Setaddr2;count<=0;endelsebeginstate<=Indata1;count<=count+4'b0001;endendendSetaddr2:begin if(clk_en) state<=Indata2;endIndata2:beginif(clk_en)beginif(count==4'b1111)beginstate<=Setaddr1;count<=0;endelsebeginstate<=Indata2;count<=count+4'b0001;endendenddefault:state<=Warmup;endcaseendendalways @(state or count)begincase(state)Warmup: beginRS<=0;RW<=0; lcd_data_out<=8'b00000000;endFuncset:lcd_data_out<=8'b00111000;Dspoff: lcd_data_out<=8'b00001000;Clsdsp: lcd_data_out<=8'b00000001;Modeset:lcd_data_out<=8'b00000110;Dspon: lcd_data_out<=8'b00001100;Setaddr1:beginRS<=0;RW<=0; lcd_data_out<=8'b10000000;endIndata1:beginRS<=1;RW<=0;case(count)4'b0000:lcd_data_out<=8'b00100000;4'b0001:lcd_data_out<=8'b01010011;4'b0010:lcd_data_out<=8'b01000011;4'b0011:lcd_data_out<=8'b01001111; 4'b0100:lcd_data_out<=8'b01010000; 4'b0101:lcd_data_out<=8'b01000101;4'b0110:lcd_data_out<=8'b00111010;4'b0111:begincase(test_mode)2'b00:lcd_data_out<=8'b00110000;2'b01:lcd_data_out<=8'b00110000;2'b10:lcd_data_out<=8'b00110010;2'b11:lcd_data_out<=8'b00110000; default: lcd_data_out<=8'b00111100; endcaseend4'b1000:begincase(test_mode)2'b00:lcd_data_out<=8'b00110000;2'b01:lcd_data_out<=8'b00101101;2'b10:lcd_data_out<=8'b00110000;2'b11:lcd_data_out<=8'b00101110; default: lcd_data_out<=8'b00100000; endcaseend4'b1001:case(test_mode) 2'b00:lcd_data_out<=8'b00110000;2'b01:lcd_data_out<=8'b00110010;2'b10:lcd_data_out<=8'b00101101;2'b11:lcd_data_out<=8'b00110010;default: lcd_data_out<=8'b00100000; endcase4'b1010:case(test_mode)2'b00:lcd_data_out<=8'b00110000;2'b01:lcd_data_out<=8'b00110000;2'b10:lcd_data_out<=8'b00110010;2'b11:lcd_data_out<=8'b00101101; default: lcd_data_out<=8'b00100000; endcase4'b1011:case(test_mode) 2'b00:lcd_data_out<=8'b01101101;2'b01:lcd_data_out<=8'b01101101;2'b10:lcd_data_out<=8'b00110000;2'b11:lcd_data_out<=8'b00110010; default: lcd_data_out<=8'b00100000; endcase4'b1100:case(test_mode)2'b00:lcd_data_out<=8'b01000001;2'b01:lcd_data_out<=8'b01000001;2'b10:lcd_data_out<=8'b00110000;2'b11:lcd_data_out<=8'b00101110; default:lcd_data_out<=8'b00100000; endcase4'b1101:case(test_mode)2'b00:lcd_data_out<=8'b00100000;2'b01:lcd_data_out<=8'b00100000;2'b10:lcd_data_out<=8'b01101101;2'b11:lcd_data_out<=8'b00110000; default:lcd_data_out<=8'b00100000; endcase4'b1110:case(test_mode)2'b00:lcd_data_out<=8'b00100000;2'b01:lcd_data_out<=8'b00100000;2'b10:lcd_data_out<=8'b01000001;2'b11:lcd_data_out<=8'b01000001; default:lcd_data_out<=8'b00100000; endcasedefault:lcd_data_out<=8'b00100000;endcaseendSetaddr2:beginRS<=0;RW<=0; lcd_data_out<=8'b11000000;endIndata2:beginRS<=1;RW<=0;case(count) 4'b0000:lcd_data_out<=8'b00100000; 4'b0001:lcd_data_out<=8'b01001001;4'b0010:lcd_data_out<=8'b01101111;4'b0011:lcd_data_out<=8'b01110101; 4'b0100:lcd_data_out<=8'b01110100;4'b0101:lcd_data_out<=8'b00111101;4'b0110:beginif(test_mode[1] & test_mode[0])lcd_data_out<={4'b0011,lcd_data_in[15:12]};else if(~test_mode[1] & test_mode[0])lcd_data_out<={4'b0011,lcd_data_in[11:8]};else lcd_data_out<=8'b00100000;end4'b0111: lcd_data_out<={4'b0011,lcd_data_in[11:8]};4'b1000:begin if(~test_mode[1] & test_mode[0]) lcd_data_out<=8'b00101110;else lcd_data_out<={4'b0011,lcd_data_in[7:4]};end 4'b1001:lcd_data_out<={4'b0011,lcd_data_in[3:0]};4'b1010:lcd_data_out<=8'b01101101;4'b1011:lcd_data_out<=8'b01000001;default:lcd_data_out<=8'b00100000;endcaseenddefault:lcd_data_out<=8'bzzzzzzzz;endcaseendendmodulemodule clkdiv(clk_in,clk_out);input clk_in;output clk_out;reg clk_out;reg[15:0] count;always@(posedge clk_in)beginif(count==15'b111111*********)beginclk_out<=~clk_out;count<=0;endelsecount<=count+15'b0000_0000_0000_001; endendmodule。
LCD1602液晶显示实验实验报告及程序
![LCD1602液晶显示实验实验报告及程序](https://img.taocdn.com/s3/m/92562278580102020740be1e650e52ea5518cebe.png)
LCD1602液晶显示实验实验报告及程序一、实验目的本次实验的主要目的是熟悉并掌握 LCD1602 液晶显示屏的工作原理和编程方法,能够成功实现字符在液晶屏幕上的显示和控制。
二、实验原理LCD1602 是一种工业字符型液晶,能够显示 16x2 个字符,即每行16 个字符,共 2 行。
它的工作原理是通过控制液晶分子的偏转来实现字符的显示。
LCD1602 有 16 个引脚,主要引脚功能如下:1、 VSS:接地。
2、 VDD:接电源(通常为+5V)。
3、 V0:对比度调整引脚,通过外接电位器来调节屏幕显示的对比度。
4、 RS:寄存器选择引脚,高电平时选择数据寄存器,低电平时选择指令寄存器。
5、 RW:读写选择引脚,高电平时进行读操作,低电平时进行写操作。
6、 E:使能引脚,下降沿触发。
7、 D0 D7:数据引脚,用于传输数据和指令。
LCD1602 的指令集包括清屏、归位、输入方式设置、显示开关控制、光标或显示移位、功能设置、CGRAM 和 DDRAM 地址设置以及读忙标志和地址等。
三、实验设备与材料1、单片机开发板2、 LCD1602 液晶显示屏3、杜邦线若干4、电脑四、实验步骤1、硬件连接将 LCD1602 的 VSS 引脚接地。
将 VDD 引脚接+5V 电源。
将 V0 引脚通过一个 10K 的电位器接地,用于调节对比度。
将 RS、RW、E 引脚分别连接到单片机的三个 I/O 口。
将 D0 D7 引脚连接到单片机的 8 个 I/O 口。
2、软件编程包含必要的头文件。
定义与 LCD1602 连接的 I/O 口。
编写初始化函数,包括设置显示模式、清屏、输入方式等。
编写写指令函数和写数据函数,用于向LCD1602 发送指令和数据。
编写显示字符串函数,实现字符在屏幕上的显示。
3、编译下载程序使用编译软件对编写的程序进行编译,生成可执行文件。
将可执行文件下载到单片机开发板中。
4、观察实验结果给开发板上电,观察 LCD1602 液晶显示屏上是否正确显示预设的字符。
我的四线控制LCD1602驱动C语言PIC18F
![我的四线控制LCD1602驱动C语言PIC18F](https://img.taocdn.com/s3/m/a334de09f78a6529647d53d7.png)
#ifndef __LCD1602_H#define __LCD1602_H//单片机与LCD1602连接数据线定义#define CLK PORTDbits.RD6#define AB PORTDbits.RD7#define TRIS_LCD_CLK TRISDbits.TRISD6#define TRIS_LCD_AB TRISDbits.TRISD7#define LCD_RS PORTAbits.RA1 // PORT for RS */#define TRIS_LCD_RS TRISAbits.TRISA1 // TRIS for RS */#define LCD_EN PORTAbits.RA3 // PORT for EN */#define TRIS_LCD_EN TRISAbits.TRISA3 // TRIS for EN *///-------------------1602液晶命令定义-------------------//初始化命令#define DISP_CLR 0b00000001 //清显示,光标复位到第一行首(地址00H)#define CUR_HOME 0b00000010 //光标复位,光标返回到第一行首//光标和显示模式设置#define CUR_AUTO_R 0b00000110 //设置光标在文字插入后自动右移#define CUR_AUTO_L 0b00000100 //设置光标在文字插入后自动左移#define DISP_AUTO_R 0b00000111 //设置显示在文字插入后自动右移*/#define DISP_AUTO_L 0x00000101 //设置显示在文字插入后自动左移*///显示开关控制*/#define DISP_ON 0b00001111 //显示开*/#define DISP_OFF 0b00001011 //显示关*/#define CUR_ON 0b00001111 //光标开*/#define CUR_OFF 0b00001101 //光标关*/#define BLINK_ON 0b00001111 //光标闪烁开*/#define BLINK_OFF 0b00001110 //光标闪烁关*///光标或显示移位*/#define CUR_SHIFT_L 0b00010000 //光标左移*/#define CUR_SHIFT_R 0b00010100 //光标右移*/#define DISP_SHIFT_L 0b00011000 //显示左移*/#define DISP_SHIFT_R 0b00011100 //显示右移*///工作模式设置#define LCD_MODE_STD 0x38 //1602标准工作模式:8位数据传送,2行显示,字符点阵5*7*///字符发生器RAM地址设置*/#define SET_ADDR_CGRAM 0x40 //设置CGRAM地址*///数据存储器地址设置*/#define SET_ADDR_DDRAM 0x80 //设置DDRAM地址*///自定义字符*/#define USER_CHAR1 0x00//自定义字符1:年*/#define USER_CHAR2 0x01//自定义字符2:月*/#define USER_CHAR3 0x02//自定义字符3:日*/#define USER_CHAR4 0x03//自定义字符4:¥*/#define USER_CHAR5 0x04//自定义字符5:元*/#define USER_CHAR6 0x05//自定义字符6:℃*/#define USER_CHAR7 0x06//自定义字符7:↑*/#define USER_CHAR8 0x07//自定义字符8:小喇叭图标*/// 函数原型*/void LCD_init(void) ;//初始化*/void xianshi(unsigned int a);void LCD_wrcmd(unsigned char cmd) ;//写入控制命令*/void LCD_setxy(char x,char y) ;//设定显示位置,行x=1/2,列y=1~16的任意整数*/void LCD_wrchar(char str) ;//写入要显示的字符*/void LCD_wrstr(const rom char *s);//写入要显示的字符串常量,该函数相当于C18 库中的putrsXLCD函数,从程序存储器写一个字符串到LCD*/void LCD_wrul(unsigned long num);//写入要显示的无符号长整型数*/void LCD_wrlval(unsigned long num,unsigned char bits,unsigned char dp);//写入要显示的长变量*/ void CG_Write(void);//建立自定义字符块*/#endif//函数实现*/#include <p18cxxx.h>#include <stdlib.h>#include <delays.h>#include"LCD1602.h"const rom char cgtab[64]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,0x11,0x0a,0x04,0x1f,0x04,0x1f,0x04,0x00,0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,0x04,0x0a,0x15,0x04,0x04,0x04,0x04,0x00,0x01,0x03,0x1d,0x15,0x1d,0x03,0x01,0x00}; //年、月、日、¥、元、℃、↑、小喇叭图标*/void DELAY10mS(){Delay1KTCYx(25);}void delayzz(unsigned int n) //延时函数{unsigned int x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}void xianshi(unsigned int a){//CLR=0;//CLR=1;if((a&0x80)==0X80){AB=1;CLK=0;CLK=1;}//第7位else{AB=0;CLK=0;CLK=1;}if((a&0x40)==0X40){AB=1;CLK=0;CLK=1;}//第6位else{AB=0;CLK=0;CLK=1;}if((a&0x20)==0X20){AB=1;CLK=0;CLK=1;}//第5位else{AB=0;CLK=0;CLK=1;}if((a&0x10)==0X10){AB=1;CLK=0;CLK=1;}//第4位else{AB=0;CLK=0;CLK=1;}if((a&0x08)==0X08){AB=1;CLK=0;CLK=1;}//第3位else{AB=0;CLK=0;CLK=1;}if((a&0x04)==0X04){AB=1;CLK=0;CLK=1;}//第2位else{AB=0;CLK=0;CLK=1;}if((a&0x02)==0X02){AB=1;CLK=0;CLK=1;}//第1位else{AB=0;CLK=0;CLK=1;}if((a&0x01)==0X01){AB=1;CLK=0;CLK=1;}//第0位else{AB=0;CLK=0;CLK=1;}}void LCD_init(void){ADCON1=0x0F;//所有引脚均设置为数字IO脚*/DELAY10mS();//延时100ms*///设置单片机LCD控制引脚全为输出*/TRIS_LCD_RS=0;TRIS_LCD_EN=0;CLK=0;AB=0;TRIS_LCD_CLK=0;TRIS_LCD_AB=0;LCD_wrcmd(LCD_MODE_STD);//LCD标准工作模式:8位数据传送,2行显示,字符点阵5*7*/DELAY10mS();LCD_wrcmd(DISP_OFF);//显示关闭*/DELAY10mS();LCD_wrcmd(DISP_CLR);//清屏*/DELAY10mS();//清屏和光标归位需要较长的时间*/LCD_wrcmd(CUR_AUTO_R);//设置光标在文字插入后自动右移*/DELAY10mS();LCD_wrcmd(DISP_ON & CUR_OFF & BLINK_OFF);//显示开,无光标, 光标不闪烁*///LCD_wrcmd(DISP_ON & CUR_ON & BLINK_ON);/*显示开,光标, 光标闪烁*/DELAY10mS();CG_Write();//建立自定义字符块*/DELAY10mS();}//void LCD_wrcmd(Uchar cmd)/*写入控制命令*/void LCD_wrcmd(unsigned char cmd)//写入控制命令*/{xianshi(0X00);Nop();Nop();LCD_EN=0;Nop();Nop();Nop();Nop();LCD_RS=0;Nop();Nop();Nop();Nop();Nop();Nop();Nop();xianshi(cmd);delayzz(25);Nop();Nop();Nop();Nop();LCD_EN=1;Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();LCD_EN=0;Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();xianshi(0X00);}void LCD_wrchar(char str)//写入要显示的字符*/ {xianshi(0X00);Nop();Nop();Nop();LCD_EN=0;Nop();Nop();Nop();Nop();LCD_RS=1;Nop();Nop();Nop();Nop();Nop();Nop();Nop();xianshi(str);delayzz(25);Nop();Nop();Nop();Nop();LCD_EN=1;Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();LCD_EN=0;Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();xianshi(0X00);}void LCD_setxy(char x,char y) //设定显示位置,行x=1/2,列y=1~16的任意整数*/ {char temp;if(x==1){temp=0x80+y-1;LCD_wrcmd(temp);}else{temp=0xC0+y-1;LCD_wrcmd(temp);}}void LCD_wrstr(const rom char *s)//写入要显示的字符串*/{for(;*s!='\0';s++)LCD_wrchar(*s);}void LCD_wrul(unsigned long num)//写入要显示的无符号长整型数*/{char str[11];//无符号长整型数转换为字符串是10个,所以需要11个单元存储*/ int i=0;int j=0;ultoa(num,str);//将无符号长整型数转换为字符串*/LCD_wrcmd(CUR_AUTO_L);//设置光标在文字插入后自动左移*/while(str[i]!='\0')//搜索字符串结束符*/{i++;}while(i>0)//显示前面的有效数字*/{i--;LCD_wrchar(str[i]);j++;}while(j<10)//往前写满10位,也就是前面都写空格*/{LCD_wrchar(0x20);j++;}LCD_wrcmd(CUR_AUTO_R);//设置光标在文字插入后自动右移*/}void LCD_wrlval(unsigned long num,unsigned char bits,unsigned char dp)//写入要显示的长变量{char str[11];//无符号长整型数转换为字符串是10个,所以需要11个单元存储*/int i=0;int j=0;ultoa(num,str);//将无符号长整型数转换为字符串*/LCD_wrcmd(CUR_AUTO_L);//设置光标在文字插入后自动左移*/while(str[i]!='\0')//搜索字符串结束符*/{i++;}if (i>bits)//要显示的数据比规定的显示位数多,数据显示溢出*/{while(j<bits)//往前写满规定的位数,也就是前面都写空格,直到规定的位数*/ {LCD_wrchar('-'); //规定的位全部写-,表示数据溢出*/j++;if (j==dp) LCD_wrchar('.');//插入小数点*/}}else{while(i>0)//显示前面的有效数字*/{i--;LCD_wrchar(str[i]);j++;if (j==dp) LCD_wrchar('.');//插入小数点*/}while(j<bits)//往前写满规定的位数,也就是前面都写空格,直到规定的位数*/ {if (j==dp) LCD_wrchar('.');//插入小数点*/if (j<=dp) LCD_wrchar('0');//小数点前后补0字符*/else LCD_wrchar(0x20); //小数点前后补空字符*/j++;}}LCD_wrcmd(CUR_AUTO_R);//设置光标在文字插入后自动右移*/}void CG_Write(void)//建立自定义字符块*/{int i;LCD_wrcmd(SET_ADDR_CGRAM);//字符发生器CGRAM地址设置*/ for(i=0;i<64;i++){LCD_wrchar(cgtab[i]);};}。
LCD1602.H51单片机LCD1602显示驱动程序
![LCD1602.H51单片机LCD1602显示驱动程序](https://img.taocdn.com/s3/m/c440ca3590c69ec3d4bb7528.png)
LCD1602.H(51单片机LCD1602显示驱动程序)/*无敌高氯酸修改函数功能delay_ms(time) 延时time毫秒LCD_init() 初始化清空LCD屏LCD_print(x,y,str)在(x,y)坐标上显示str字符0=;0;i--)for (j=0;j<1140;j++);}/************************************************ *********************函数名称:LCD_print()功能描述:显示字符或字符串入口参数:字符或字符串返回值:无************************************************* *********************/void LCD_print(uchar x,uchar y,uchar *str){LCD_gotoxy(x,y);while(*str!='\0'){LCD_wdata(*str);str++;}}/************************************************** *******************函数名称:LCD_wcommand()功能描述:LCD写指令入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位返回值:无************************************************* ********************/void LCD_wcommand(uchar lcd_cmd,busy_f){if (busy_f) Rstatus(); //不忙才执行下个程序Port = lcd_cmd;Rw = 0;En = 0;En = 0;En = 1;}/************************************************ *********************函数名称:LCD_wdata()功能描述:LCD写数据入口参数:uchar wdata:所写数据返回值:无************************************************* ********************/void LCD_wdata(uchar wdata){Rstatus();Port = wdata;Rs = 1;Rw = 0;En = 0; //若晶振速度太高可以在这后加小的延时En = 0; //延时}/************************************************ *********************函数名称:LCD_rdata()功能描述:LCD读数据入口参数:无返回值:所读数据************************************************* ********************/uchar LCD_rdata(void){Rs = 1;Rw = 1;En = 0;En = 0;En = 1;return Port;}/************************************************ *********************函数名称:Rstatus()功能描述:LCD读忙状态入口参数:无返回值:若忙,则等待,不忙则返回Port************************************************* ********************/uchar Rstatus(void){Port = 0xFF;Rs = 0;Rw = 1;En = 0;En = 0;En = 1;while (Port & 0x80); //检测忙信号,不忙则退出等待return(Port);}/************************************************ *********************函数名称:LCD_init()功能描述:LCD初始化入口参数:无返回值:无************************************************* ********************/void LCD_init(void){Port = 0;LCD_wcommand(0x38,0); //三次显示模式设置,不检测忙信号delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,1); //显示模式设置(0X38双行(5*7),0X34单行(5*10)),0X30单行(5*7);开始要求每次检测忙信号LCD_wcommand(0x08,1); //关闭显示LCD_wcommand(0x01,1); //显示清屏LCD_wcommand(0x06,1); // 显示光标移动设置LCD_wcommand(0x0C,1); // 显示开及光标设置}/************************************************ *********************函数名称:LCD_gotoxy()功能描述:定位到(x,y)位置入口参数:x为行(0~1),y为列(0~15)返回值:无************************************************* ********************/void LCD_gotoxy(uchar x, uchar y){x &= 0x1; //限制x不能大于1,y不能大于15y &= 0xF;if(!x) LCD_wcommand(0x80|y,1);else LCD_wcommand(0xC0|y,1);}。
LCD1602驱动编程(二)——驱动程序编写
![LCD1602驱动编程(二)——驱动程序编写](https://img.taocdn.com/s3/m/975d420cb9d528ea81c7799b.png)
switch( y) {
case 1:LCD_WriteCommand(0x80+x-1);break; //第一行 case2:LCD_WriteCommand(0x80+0x40+x-1); break; //第二行
7. 初始化 void LCD_Initial( void ) { LCD_WriteCommand(0x38); //4 位总线,5*10 点阵字符 LCD_WriteCommand(0x01); //清屏 LCD_WriteCommand(0x06); //显示光标,光标右移 LCD_WriteCommand(0x0c); //开显示 }
8. 滚动字符 Void Character_move( void ) { LCD_WriteCommand(0x18); //字符左移 LCD_WriteCommand(0x1C); //字符右移 }
{
P0=0x00;
RS_SET_C; //数据总线
RW_SET_W; //操作
EN_SET_L;
_NOP( );
//tps1
EN_SET_H; //拉高使能端
while(P0&0x80); } 4. 清屏 Void LCD_Clear( void ) {
Read_busy( ); //判忙 LCD_WriteCommand(0x01) ; DelayMs(5); } 5. 显示字符串
{
Read_busy( ); //判忙
RS_SET_C; //命令总线
RW_SET_R; //写操作
一个旋转编码器+LCD1602的驱动程序
![一个旋转编码器+LCD1602的驱动程序](https://img.taocdn.com/s3/m/825a48054a7302768e9939b3.png)
#include<reg51.h>#include <MATH.H>/**********************************宏定义字符串**********************************/#define uchar unsigned char#define LCD_DAT P0 //LCD数据/指令输入端(D7,D6,D5,D4,D3,D2,D1,D0)sbit LCD_RW = P2^5;//LCD读写控制端sbit LCD_RS = P2^6;//LCD指令/数据控制端sbit LCD_E = P2^7; //LCD使能控制端sbit AA = P1^0;//接编码器A端sbit BB = P1^1;//接编码器B端/**********************************任意ms延时函数**********************************/void delayms(uchar count){uchar i,j;for(i = 0; i < count; i++)for(j = 0; j < 120; j++);}/**********************************5ms延时函数**********************************/void delay(void) //延时5ms{uchar a, b;for(b = 19; b > 0; b--)for(a = 130; a > 0; a--);}/**********************************LCD写函数**********************************/void LCD_W(uchar m, uchar com_dat) //m=0:写指令,m=1:写数据{LCD_RS = m;LCD_RW = 0;//写操作LCD_E = 0; //使能禁止LCD_DAT = com_dat; //在指令/数据端置数delay(); //5ms延时LCD_E = 1; //使能允许delay(); //5ms延时LCD_E = 0; //使能禁止}/**********************************LCD初始化函数**********************************/void LCD_INIT(){delay();delay();delay(); //5ms延时LCD_W(0, 0x38); //不检测忙信号delay();LCD_W(0, 0x38); //不检测忙信号delay();LCD_W(0, 0x38); //不检测忙信号LCD_W(0, 0x38); //显示模式LCD_W(0, 0x08); //显示关闭LCD_W(0, 0x06); //光标移动LCD_W(0, 0x0c); //显示开和光标设置}/**********************************LCD清屏函数**********************************/void CLS(){LCD_W(0, 0x01); //清屏}/**********************************LCD定位函数**********************************/void LOCATE(uchar H, uchar L){if(H == 1) //如果是第一行LCD_W(0, 0x80 + L - 1); //定位在第一行第L列elseLCD_W(0, 0x80 + 0x40 + L - 1); //否则定位在第二行第L列}/**********************************LCD显示数值函数**********************************/void LCD(unsigned long num){char n, m;unsigned long ww;if(num > 9) //两位数以上进行处理显示{n = log10(num); //取数值的位数for(m = n; m >= 0; m--) //从高位开始输出{ww = (num / pow(10, m)); //从高位向低位依次取数ww = ww % 10; //取各次的最低位数LCD_W(1, 48 + ww); //输出}}else LCD_W(1, 48 + num); //一位数直接显示LCD_W(1, ' '); //显示空格LCD_W(1, ' '); //显示空格LCD_W(1, ' '); //显示空格}/**********************************主函数**********************************/void main(){uchar kkk, keys, tmp = 1;LCD_INIT();//LCD初始化CLS();//清屏while(1){if(AA == 0)//开始检测是否旋转了开关{delayms(10);//消除抖动if(AA == 0) //确实是旋转了,进行正反转判断{if(BB == 0)//正转,进行正转处理{tmp = tmp * 2;//为了使LED正向递增if(tmp == 0)tmp = 128;//达到最大值,不再加kkk = '+';//正转显示 +}if(BB == 1)//反转,进行反转处理{tmp = tmp / 2;//为了使LED反向递减if(tmp == 0)tmp = 1;//达到最小值,不再减kkk = '-';//反转显示 -}}LOCATE(1,1);//定位第 1 行 1 列LCD(tmp);//显示数值LOCATE(1,5);//定位第 1 行 5 列LCD_W(1, kkk);//显示字符keys = 0;//延时等待计数器while(AA == 0)//等待开关A端复位(断开),防止出现乱加减的现象{delayms(20);//延时等待keys++;//计数器加 1if(keys == 50)break;//达到 1 秒没有复位,开关卡住了,退出继续扫描开关}}P3 = ~tmp; //输出到P0}}。
verilog驱动LCD1602程序
![verilog驱动LCD1602程序](https://img.taocdn.com/s3/m/bae9d41c0b4e767f5acfceaa.png)
parameter SETCGRAM=10'b0001000000;//设置CGRAM
parameter SETDDRAM1=10'b0010000001;//设置DDRAM
parameter SETDDRAM2=10'b0010000010;//设置DDRAM
state<=SWITCHMODE;end
SWITCHMODE:begin LCD_RS<=0;LCD_RW<=0;LCD_D[7:3]<=5'b00001; //显示状态开关设置0C
LCD_D[2]<=open_display;LCD_D[1]<=open_cur;
LCD_D[0]<=blank_cur;
end
endcase
end
endmodule
下面是testbench代码
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company: HITsz
最近在网上找了很多用verilog驱动LCD1602的程序,但基本没有一个是完美运行,很多论坛所谓大神的代码综合时候一样很多缺陷,要知道每一个warning都有可能是导致最终失败的原因。于是乎只能自己下功夫,找到一个稍微靠谱的开发板配套例程,但是分频器模块编的叫一塌糊涂,主时钟分频后继续分频而且组合时序乱用,通过分频模块重新编写后基本无warning完美运行,仿真功能实现并且下载显示成功,后面附上了我的testbench,本人用的软件为ISE12.2,不过个人感觉quartus应该一样跑,下面是代码,需要在1602显示什么字符自己改显示函数就行,希望对大家有帮助。
LCD1602程序代码
![LCD1602程序代码](https://img.taocdn.com/s3/m/e565abcf4028915f804dc269.png)
LCD1602程序代码#include<intrins.h> //包含NOP空指令的头文件#define uchar unsigned char#define uint unsigned int#define LCD1602_H 1 //宏定义手册中出现的H的定义#define LCD1602_L 0 //宏定义手册中出现的L的定义#define LCD1602_DAT 1 //数据#define LCD1602_COM 0 //命令#define LCD_15MS 300 //宏定义15MS延时需要的数值#defineLCD_5MS 100 //宏定义 5MS延时需要的数值/*显示模式指令*/#define LCD_Display_mode 0X38 //设置16x2显示 5x7点阵 8位数据接口/*显示开/关及光标设置*/#define LCD_shows0 0X0C //开显示不显示光标光标不闪烁#define LCD_shows2 0X0E //开显示显示光标光标不闪烁#define LCD_shows1 0X0F //开显示显示光标光标闪烁#define LCD_shows3 0X08 //关显示不显示光标光标不闪烁/*指针设置*/#define LCD_cursor1 0X04 //写一个字符地址指针减1#define LCD_cursor2 0X05 //写一个字符地址指针减1 并屏幕右移#define LCD_cursor3 0X06 //写一个字符地址指针加1#define LCD_cursor4 0X07 //写一个字符地址指针加1 并屏幕左移/*清屏指令*/#define LCD_clear 0x01 //清屏指令数据指针清零所有显示清零/*忙状态字*/#define LCD_WAY 0x80 //状态字/*宏定义显示起始地址*/#define LCD_ADDH 0X80 //第一行地址0x80-0xA7#define LCD_ADDL 0XC0 //第二行地址0xC0-0xE7/*IO口定义*/#define LCD1602_DATA P0 //宏定义8位数据线IO为P0口 D0~D7=P00~P07 8位数据线 D0=P00;sbit LCD1602_RS=P2^5; //数据/命令选择端(H/L)sbit LCD1602_RW=P2^6; //读/写选择端(H/L)sbit LCD1602_E =P2^7; //使能信号/*函数声明*/void LCD1602_init(); //液晶初始化函数void LCD1602_writecd(bit lcd_rs, uchar LCD1602_d);//写命令/数据函数bit lcd_rs是数据还是命令 uchar LCD1602_d要写入的数据uchar LCD1602_readway(); //读忙状态函数由写入和读取函数调用uchar LCD1602_readata(); //读数据函数void LCD_DELAY(uchar LCD_delay); ///*液晶初始化函数*/void LCD1602_init() //液晶初始化函数{ LCD_DELAY(LCD_15MS); //延时15MS 初始化LCD1602_writecd(LCD1602_COM,LCD_Display_mode);//写指令38H 设置16x2显示 5x7点阵 8位数据接口LCD1602_writecd(LCD1602_COM,LCD_shows0); //开显示不显示光标光标不闪烁LCD1602_writecd(LCD1602_COM,LCD_cursor1); //检查忙状态LCD1602_writecd(LCD1602_COM,LCD_clear); //写指令01H:显示清屏}/*液晶写命令/数据函数*/void LCD1602_writecd(bit lcd_rs, uchar LCD1602_cd)//写命令/数据函数{ uchar LCD1602_NUM; //定义变量用来液晶无忙回答的退出死循环LCD1602_NUM=255; //忙状态检测次数while(LCD1602_readway()) //检查忙状态{LCD1602_NUM--; //检测次数自减if(LCD1602_NUM==0) //判断检测次数等于0{break;} //退出循环判断忙}LCD1602_RW = LCD1602_L; //读/写选择端(H/L)LCD1602_RS = lcd_rs; //数据/命令选择端(H/L)LCD1602_DATA= LCD1602_cd; //IO口赋值LCD1602_E = LCD1602_H; //拉高使能信号开始传输数据LCD1602_E = LCD1602_L; //拉低使能信号锁存数据LCD1602_DATA= 0xff; //IO口数据清除}/*忙状态读取函数*/uchar LCD1602_readway()//读状态函数由写入和读取函数调用{ uchar LCD1602_way; //状态字变量LCD1602_DATA=0xff; //IO口数据清除LCD1602_RS = LCD1602_COM; //数据/命令选择端(H/L) 命令LCD1602_RW = LCD1602_H; //读/写选择端(H/L)LCD1602_E = LCD1602_H; //拉高使能信号开始接收状态LCD1602_way =LCD1602_DATA; //读取状态LCD1602_E = LCD1602_L; //拉低使能信号锁存数据LCD1602_way =LCD1602_way&LCD_WAY;//取忙状态字return(LCD1602_way); //返回状态字}/*液晶读数据函数*/uchar LCD1602_readata()//读数据函数{ uchar LCD1602_data; //数据暂存变量while(LCD1602_readway()); //检查忙状态 -------------------- LCD1602_DATA=0xff; //IO口数据清除LCD1602_RS = LCD1602_DAT; //数据/命令选择端(H/L) 数据LCD1602_RW = LCD1602_H; //读/写选择端(H/L)LCD1602_E = LCD1602_H; //拉高使能信号开始接收状态LCD1602_data= LCD1602_DATA; //读取状态LCD1602_E = LCD1602_L; //拉低使能信号锁存数据return(LCD1602_data); //返回数据}/*延时函数*/void LCD_DELAY(uchar LCD_delay)//{ uchar lcd_del;while(LCD_delay--) //自减{lcd_del=100;while(lcd_del--);}}。
LCD1602液晶屏驱动程序
![LCD1602液晶屏驱动程序](https://img.taocdn.com/s3/m/eaebdb3283c4bb4cf7ecd143.png)
//top module:LCD_1602 module LCD_1602 ( ////////////////////Clock Input//////////////////// CLOCK_50, // 50 MHz ////////////////////LCD Module 16X2//////////////// LCD_ON, // LCD Power ON/OFF LCD_BLON, // LCD Back Light ON/OFF LCD_RW, // LCD Read/Write Select, 0 = Write, 1 = Read
PDF 文件使用 "pdfFactory" 试用版本创建
// Line 1 LCD_LINE1+0: LUT_DATA<=9'h120; LCD_LINE1+1: LUT_DATA<=9'h121; LCD_LINE1+2: LUT_DATA<=9'h122; LCD_LINE1+3: LUT_DATA<=9'h123; LCD_LINE1+4: LUT_DATA<=9'h124; LCD_LINE1+5: LUT_DATA<=9'h125; LCD_LINE1+6: LUT_DATA<=9'h126; LCD_LINE1+7: LUT_DATA<=9'h127; LCD_LINE1+8: LUT_DATA<=9'h128; LCD_LINE1+9: LUT_DATA<=9'h129; LCD_LINE1+10:LUT_DATA<=9'h12a; LCD_LINE1+11:LUT_DATA<=9'h12b; LCD_LINE1+12:LUT_DATA<=9'h12c; LCD_LINE1+13:LUT_DATA<=9'h12d; LCD_LINE1+14:LUT_DATA<=9'h12e; LCD_LINE1+15:LUT_DATA<=9'h12f; //Change Line LCD_CH_LINE: LUT_DATA<=9'h0C0; //Line 2 LCD_LINE2+0: LUT_DATA<=9'h130; LCD_LINE2+1: LUT_DATA<=9'h131; LCD_LINE2+2: LUT_DATA<=9'h132; LCD_LINE2+3: LUT_DATA<=9'h133; LCD_LINE2+4: LUT_DATA<=9'h134; LCD_LINE2+5: LUT_DATA<=9'h135; LCD_LINE2+6: LUT_DATA<=9'h136; LCD_LINE2+7: LUT_DATA<=9'h137; LCD_LINE2+8: LUT_DATA<=9'h138; LCD_LINE2+9: LUT_DATA<=9'h139; LCD_LINE2+10:LUT_DATA<=9'h13a; LCD_LINE2+11:LUT_DATA<=9'h13b; LCD_LINE2+12:LUT_DATA<=9'h13c; LCD_LINE2+13:LUT_DATA<=9'h13d; LCD_LINE2+14:LUT_DATA<=9'h13e; LCD_LINE2+15:LUT_DATA<=9'h13f; default: LUT_DATA<=9'h000; endcase end LCD_Controller u0 ( //Host Side .iDATA(mLCD_DATA), .iRS(mLCD_RS),
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))
![基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))](https://img.taocdn.com/s3/m/f0717ed10408763231126edb6f1aff00bed570b4.png)
液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char 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){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
LCD1602 C语言驱动程序
![LCD1602 C语言驱动程序](https://img.taocdn.com/s3/m/6b3b04ad0029bd64783e2cfd.png)
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
void delay_nms(unsigned int n);//delay function
/********************************************************************/
void main(void)
{
LCD_init();
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//write lcd string function
void LCD_init(void);//lcd initize function
/********************************************************************/
(整理)LCD1602汇编程序.
![(整理)LCD1602汇编程序.](https://img.taocdn.com/s3/m/5ad72f63e55c3b3567ec102de2bd960590c6d9b3.png)
(整理)LCD1602汇编程序.LCD1602汇编程序;* 描述: LCD1602 滚动显示*;* 显示方式:*;* 1、从左到右逐字显示,闪动二次,清屏。
*;* 2、再从右到左逐字显示,闪动二次,清屏。
*;* 3、周期性地重复上述显示方式。
*;************************************************************** ***** LCD_RS EQU P2.0LCD_RW EQU P2.1LCD_EN EQU P2.2;************************************************************** ***** ORG 0000HAJMP MAINORG 0030H;************************************************************** ***** MAIN:MOV SP,#60HMOV R4,#02H ;设置闪烁次数ACALL LCD_INITMAIN1:ACALL LCDSET1MOV DPTR,#CHAR1ACALL WRITE1 ;MOV A,#0C0H ;显示第二行左边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR2 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL LCDSET2MOV DPTR,#CHAR3 ;ACALL WRITE1MOV A,#0C0H ;显示第二行右边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR4 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL MAIN1;************************************************************** *;LCD初始化设定子程序;************************************************************** * LCD_INIT:ACALL DELAY5MS ;延时15MSACALL DELAY5MS ;等待LCD 电源稳定ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#08H ;显示关ACALL LCD_CMD ;进行LCD 忙检测MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测MOV A,#06H ;移动光标ACALL LCD_CMD ;进行LCD 忙检测MOV A,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD 忙检测RET;************************************************************** * ;显示位置与移动光标设定;************************************************************** * LCDSET1:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标加1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行左边第一位位置ACALL LCD_CMDACALL DELAY5MSRETLCDSET2:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标减1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行右边第一位位置ACALL LCD_CMDACALL DELAY5MSRET;************************************************************** * ;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲;************************************************************** * LCD_CMD:ACALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ; 发送字符串子程序;************************************************************** * WRITE1:MOV R0,#16WRITE0:CLR AMOVC A,@A+DPTRINC DPTRACALL LCD_WDATACALL DELAY ;加延时形成滚动效果DJNZ R0,WRITE0RET;************************************************************** * ;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲;************************************************************** * LCD_WDATA:ACALL CHECKBUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ;检测LCD 控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据;************************************************************** * CHECKBUSY:PUSH ACCMOV P0,#0FFHCLR LCD_RSSETB LCD_RWSETB LCD_ENBUSYLOOP:NOPJB P0.7,BUSYLOOPCLR LCD_ENPOP ACCRET;************************************************************** * ;闪烁子程序;************************************************************** * SHAN:MOV A,#08H ;关闭显示ACALL LCD_CMDACALL DELAY4MOV A,#0CH ;开显示,关闭光标ACALL LCD_CMDACALL DELAY4DJNZ R4,SHANMOV R4,#02H ;设置闪烁次数RET;************************************************************** * ;延时120MS 子程序;发送字符串时使用;************************************************************** * DELAY:MOV R7,#240DL1: MOV R6,#250DL2: DJNZ R6,DL2DJNZ R7,DL1RET;************************************************************** * ;延时800MS 子程序;闪烁时使用;************************************************************** * DELAY4:MOV R0,#40DL3: MOV R1,#100DL4: MOV R2,#100DL5: DJNZ R2,DL5DJNZ R1,DL4DJNZ R0,DL3RET;************************************************************** * ;延时5MS子程序;LCD初始化使用;************************************************************** * DELAY5MS:MOV R1,#10DL6: MOV R2,#249DL7: DJNZ R2,DL7DJNZ R1,DL6RET;************************************************************** * ;延时1MS子程序;************************************************************** * DELAY1MS:MOV R6,#14H ;20DL8: MOV R7,#19H ;25DL9: DJNZ R7,DL9DJNZ R6,DL8RET;************************************************************** * CHAR1:DB "Welcome to Cras-"CHAR2:DB " yBoye WorkGroup"CHAR3:DB " QQ: 15910380 "CHAR4:DB "TEL: 139********";************************************************************** *END12864汇编程序X EQU 26H ;LCD 地址变量RS EQU P2.0RW EQU P2.1EN EQU P2.2PSB EQU P2.3RST EQU P2.5ORG 0000HJMP MAINORG 0003H ;外部中断INT0入口地址MAIN:MOV SP,#40HMOV A,#00HMOV R0,#20HLOOP0: MOV @R0,A ;20H-26H清零INC R0CJNE R0,#27H,LOOP0MOV IE,#81H ;允许总中断中断,使能INT0 外部中断MOV TCON,#01H ;触发方式为脉冲负边沿触发SETB RSTNOPSETB PSB ;8位数据,并口CALL SET_LCD ;初始化TS12864mCALL MENU1CALL MENU2CALL MENU3CALL MENU4LOOP1:MOV A,22HCJNE A,#40H,LOOP2LOOP2: CJNE A,#04H,LOOP3LOOP3: JMP LOOP1;====================================== =======; LCD 初始化设置;====================================== =======-SET_LCD:CLR ENMOV A,#34H ;34H--扩充指令操作CALL WCOMMOV A,#30H ;30H--基本指令操作CALL WCOMMOV A,#0CH ;开显示,关光标,CALL WCOMMOV A,#01H ;清除LCM 显示屏CALL WCOMRET;====================================== ============= ;在LCM 各行显示信息字符;====================================== ============= LCD_SHOW:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: CJNE A,#2,LINE3 ;判断是否为第三行MOV A,#090H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#090H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE3: CJNE A,#3,LINE4 ;判断是否为第三行MOV A,#088H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#088H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE4: CJNE A,#4,LINE5 ;判断是否为第三行MOV A,#098H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#098H ;设置LCD 的第三行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码LINE5: RETLC1: CALL WDA TA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;====================================== =========== ;清除该行LCM 的字符;====================================== =========== CLR_LINE:MOV R0,#16CL1: MOV A,#' 'CALL WDATADJNZ R0,CL1RET;====================================== ============ ;LCM 显示工作菜单信息;====================================== ============ MENU1:MOV DPTR,#MENU1AMOV A,#1 ;在第一行显示信息CALL LCD_SHOWRETMENU1A: DB "MUC 控制GPRS模块",0MENU2:MOV DPTR,#MENU2AMOV A,#2 ;在第二行显示信息CALL LCD_SHOWRETMENU2A: DB "TEL:139********",0MENU3:MOV DPTR,#MENU3AMOV A,#3 ;在第三行显示信息CALL LCD_SHOWRETMENU3A: DB "方案设计: 龚伟",0MENU4:MOV DPTR,#MENU4AMOV A,#4 ;在第四行显示信息CALL LCD_SHOWRETMENU4A: DB "程序编写: 靳鹏",0;====================================== ======== ; 写指令使能子程序;RS=L,RW=L,D0-D7=指令码,E=高脉冲;====================================== ======== WCOM:MOV P0,ACLR RSCLR RWSETB ENCALL DELAY0CLR ENRET;====================================== ======= ;写数据使能子程序;RS=H,RW=L,D0-D7=数据,E=高脉冲;=============================================WDATA:MOV P0,ASETB RSCLR RWSETB ENCALL DELAY0CLR ENRETDELAY0: MOV R7,#250 ;延时500微秒DJNZ R7,$RET END。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sbit RS = P2_;
sbit RW = P2_;
sbit E = P2_;
unsigned char flag = 1;
unsigned char shi = 23, fen = 59, miao = 50;
void lcd1602_write(unsigned char byte, unsigned char flag)
lcd1602_write(0x80,LCD_WRITE_COM);
lcd1602_write((temp / 16) + 0x30,LCD_WRITE_DATA);
lcd1602_write((temp % 16) + 0x37,LCD_WRITE_DATA);
}
void main()
{
time0_init();
{
EA = 1;
TMOD |= 0x01;
TH0 = (65536 - 20000) / 255;
TL0 = (65536 - 20000) % 255;
ET0 = 1;
TR0 = 1;
}
void TIme0_isr() interrupt 1
{
staTIc unsigned char i = 0;
lcd_init();
lcd_dis_hex();
lcd_dis_char(0,2,time:);
while(1)
{
lcd_diaplay_time();
}
}
#include reg52.h
#include ./delay/delay.h
#define LCDPORT P0
#define LCD_WRITE_DATA 1
lcd1602_write(0x08,LCD_WRITE_COM); //关闭显示,关闭光标和闪烁
delay_ms(5);
lcd1602_write(0x01,LCD_WRITE_COM); //清屏
delay_ms(5);
lcd1602_write(0x06,LCD_WRITE_COM); //设置指针方式,画面不平移
sbit E = P2_;
unsigned char flag = 1;
unsigned char shi = 23, fen = 59, miao = 50;
void lcd1602_write(unsigned char byte, unsigned char flag)
{
if(flag)
{
RS = 1; //选择输入的数据为数据
}
else
{
RS = 0; //选择输入的数据为命令
}
RW = 0; //写
E = 1; //选中lcd
LCDPORT = byte;
delay_ms(5);
E = 0; //失能LCD高电平有效
}
void lcd_init()
{
delay_ms(15);
lcd1602_write(0x38,LCD_WRITE_COM); //设置8位数据接口,两行指令,5*8点阵字符
lcd1602_write((miao / 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write((miao % 10) + 0x30,LCD_WRITE_DATA);
}
void lcd_dis_hex() //显示字符或数字
{
unsigned char temp = 0x2b;
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
lcd1602_write(0x38,LCD_WRITE_COM);
delay_ms(5);
TH0 = (65536 - 20000) / 255;
TL0 = (65536 - 20000) % 255;
i++;
if(50 == i)
{
i = 0;
miao++;
if(60 == miao)
{
miao = 0;
fen++;
if(60 == fen)
{ห้องสมุดไป่ตู้
fen = 0;
shi++;
if(24 == shi)
{
shi = 0;
}
}
}
}
}
void lcd_diaplay_TIme() //时间的显示函数
{
lcd1602_write(0x80 + 7, LCD_WRITE_COM);
lcd1602_write((shi / 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write((shi % 10) + 0x30,LCD_WRITE_DATA);
LCD1602的驱动程序的代码编写
#include reg52.h
#include ./delay/delay.h
#define LCDPORT P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0
sbit RS = P2_;
sbit RW = P2_;
{
if(flag)
{
RS = 1; //选择输入的数据为数据
}
else
{
RS = 0; //选择输入的数据为命令
}
RW = 0; //写
{
lcd1602_write(y + 0x80,LCD_WRITE_COM);
}
else if(1 == x)
{
lcd1602_write(y + 0xc0,LCD_WRITE_COM);
}
while(*s)
{
lcd1602_write(*s, LCD_WRITE_DATA);
s++;
}
}
void TIme0_init()
lcd1602_write(:,LCD_WRITE_DATA);
lcd1602_write((fen / 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write((fen % 10) + 0x30,LCD_WRITE_DATA);
lcd1602_write(:,LCD_WRITE_DATA);
delay_ms(5);
lcd1602_write(0x0c,LCD_WRITE_COM); //设置指针方式,画面不平移
delay_ms(5);
}
void lcd_dis_char(unsigned char x, unsigned char y, unsigned char *s)
{
if(0 == x)