LCD1602字符测试显示程序与仿真

合集下载

LCD1602液晶显示实验报告

LCD1602液晶显示实验报告

LCD1602液晶显示实验报告一、实验目的(1)了解LCD1602的基本原理,掌握其基本的工作流程。

(2)学习用Verilog HDL语言编写LCD1602的控制指令程序,能够在液晶屏上显示出正确的符号。

(3)能够自行改写程序,并实现符号的动态显示。

二、实验设备与器件Quartus II 软件、EP2C8Q208C8实验箱三、实验方案设计1.实验可实现的功能可以实现在LCD1602液晶屏第一行左侧第一位的位置循环显示0~9,并且可以用一个拨码开关BM8实现显示的复位功能。

2.LCD1602基本知识LCD1602液晶能够同时显示16x02即32个字符,模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如“A”。

1602通过D0~D7的8位数据端传输数据和指令。

3.系统工作原理系统的状态转换流程图如图3.1.1所示。

通过状态流程图可以看到,LCD1602液晶屏的状态是不断更新的,依次完成液晶的初始化和0~9的动态显示过程,并且过程可由开关控制。

if (!rst_n)cnt <= 0;elsecnt <= cnt + 1'b1;wire lcd_clk = cnt[23]; // (2^23 / 50M)=0.168s always@(posedge lcd_clk)if(cnt1>=24'd2)beginreg lcd_clk1;lcd_clk1=1;cnt1=0;endelsebegincnt1=cnt1+1; //cnt1对lcd_clk二分频lcd_clk1=0;endalways@(posedge lcd_clk1)beginrow1_val<=8'h30;//设初值case(row1_val) //数字0~9循环显示8'h30: row1_val<=8'h31;8'h31: row1_val<=8'h32;8'h32: row1_val<=8'h33;8'h33: row1_val<=8'h34;8'h34: row1_val<=8'h35;8'h35: row1_val<=8'h36;8'h36: row1_val<=8'h37;8'h37: row1_val<=8'h38;8'h38: row1_val<=8'h39;8'h39: row1_val<=8'h30;default: row1_val<=8'h30;endcaseendparameter IDLE = 8'h00;parameter DISP_SET = 8'h01; // 显示模式设置parameter DISP_OFF = 8'h03; // 显示关闭parameter CLR_SCR = 8'h02; // 显示清屏parameter CURSOR_SET1 = 8'h06; // 显示光标移动设置parameter CURSOR_SET2 = 8'h07; // 显示开及光标设置parameter ROW1_ADDR = 8'h05; // 写第1行起始地址parameter ROW1_0 = 8'h04;reg [5:0] current_state, next_state; // 现态、次态always @ (posedge lcd_clk, negedge rst_n)if(!rst_n) current_state <= IDLE;else current_state <= next_state;//在时钟信号作用期间,次态重复的赋给现态alwaysbegincase(current_state)IDLE : next_state = DISP_SET;DISP_SET : next_state = DISP_OFF;DISP_OFF : next_state = CLR_SCR;CLR_SCR : next_state = CURSOR_SET1;CURSOR_SET1 : next_state = CURSOR_SET2;CURSOR_SET2 : next_state = ROW1_ADDR;ROW1_ADDR : next_state = ROW1_0;ROW1_0 : next_state = ROW1_ADDR;default : next_state = IDLE ;endcaseendalways @ (posedge lcd_clk, negedge rst_n)beginif(!rst_n)beginlcd_rs <= 0;lcd_data <= 8'hxx;endelsebegincase(next_state)IDLE : lcd_rs <= 0;DISP_SET : lcd_rs <= 0;DISP_OFF : lcd_rs <= 0;CLR_SCR : lcd_rs <= 0;CURSOR_SET1 : lcd_rs <= 0;CURSOR_SET2 : lcd_rs <= 0;ROW1_ADDR : lcd_rs <= 0;ROW1_0 : lcd_rs <= 1;endcasecase(next_state)IDLE : lcd_data <= 8'hxx;DISP_SET : lcd_data <= 8'h38;DISP_OFF : lcd_data <= 8'h08;CLR_SCR : lcd_data <= 8'h01;CURSOR_SET1 : lcd_data <= 8'h04;CURSOR_SET2 : lcd_data <= 8'h0C;ROW1_ADDR : lcd_data <= 8'h80;ROW1_0 : lcd_data <= row1_val[127:120];endcaseendendassign lcd_e = lcd_clk; // 数据在时钟高电平被锁存assign lcd_rw = 1'b0; // 只写endmodule5.下载电路及引脚分配设计设计中用实验箱自带的50MHz时钟信号作为输入端,用sel0、sel1、sel2三个使能端选通LCD1602液晶屏,EP2C8Q208C8就会工作在给液晶下命令的状态,使得点阵正常工作,如图3.5.1所示。

LCD1602液晶显示器

LCD1602液晶显示器

实验11:1602液晶显示屏显示(字符型液晶显示器)字符型液晶显示器用于数字、字母、符号并可显示少量自定义符号。

这类液晶显示器通常有16根接口线,下表是这16根线的定义。

字符型液晶接口说明编号符号引脚说明编号符号引脚说明1 Vss 电源地 9 D2 数据线22 Vdd 电源正 10 D3 数据线33 VL 液晶显示偏压信号 11 D4 数据线44 RS 数据/命令选择端 12 D5 数据线55 R/W 读/ 写选择端 13 D6 数据线66 E 使能信号 14 D7 数据线77 D0 数据线0 15 BLA 背光源正极8 D1 数据线1 16 BLK 背光源负极(本学习板配的内部已经接地)下图是字符型液晶显示器与单片机的接线图。

这用了P0口的8根线作为液晶显示器的数据线,用P20、P21、P22做为3根控制线。

字符型液晶显示器与单片机的接线图字符型液晶显示器的使用,字符型液晶显示器一般采用HD44780芯片做为控制器的。

1.字符型液晶显示器的驱动程序这个驱动程序适用于1602型字符液晶显示器,1) 初始化液晶显示器命令(RSTLCD)设置控制器的工作模式,在程序开始时调用。

参数:无。

2) 清屏命令(CLRLCD)清除屏幕显示的所有内容参数:无3) 光标控制命令(SETCUR)用来控制光标是否显示及是否闪烁参数:1个,用于设定显示器的开关、光标的开关及是否闪烁。

4) 写字符命令(WRITECHAR)在指定位置(行和列)显示指定的字符。

参数:共有3个,即行值、列值及待显示字符,分别存放在XPOS、YPOS和A中。

其中行值与列值均从0开始计数,A中可直接写入字符的符号,编译程序自动转化为该字符的ASCII值。

5) 字符串命令(WRITESTRING)在指定位置显示指定的一串字符。

参数:共有3个,即行值、列值和R0指向待显示字符串的内存首地址,字符串须以0结尾。

如果字符串的长度超过了从该列开始可显示的最多字符数,则其后字符被截断,并不在下行显示出来。

1602液晶应用proteus仿真+源程序

1602液晶应用proteus仿真+源程序

uchar num; sbit lcden=P3^4; //液晶使能端
sbit lcdrs=P3^5; //液晶数据命令选择端 选择写数据还是写命令
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
} void write_com(uchar com)
} void init() { lcden=0; write_com(0x38); //设置 16x2 显示 5x7 点阵,8 位数据接口 write_com(0x0c); //设置开始显示 不显示光标 write_com(0x06); //写一个字符后地址指针加 1 write_com(0x01); //显示清零 数据指针清零 } void main() {
init(); write_com(0x80+0x10); //将数据指针第一行第一个字处, for(num=0;num<13;num++) { write_data(table[num]); delay(5); }
write_com(0x80+0x50); //定义指针位置 for(num=0;num<12;num++)
//写入
{
lcdrs=0; //LCD 选择输入命令
P0=com;
//向 P0 口输入命令
delay(5); lcden=1;
//延时 //打开 LCD 使能
delay(5); lcden=0;
//一个高脉冲 //关闭 LCD 使能
}
void write_data(uchar date)
{

单片机控制LCD1602显示字符(测试通过)

单片机控制LCD1602显示字符(测试通过)

单片机控制LCD1602显示字符(测试通过)
本次测试的是常用LCD1602 显示屏,操作流程很简单,但有些小问题要
注意,如该LCD 处理速度有些慢,单片机在发送控制指令时需要适当延时,
否则可能操作失败。

一、硬件简介
1>引脚介绍
具体引脚如下:
单片机需要操作的引脚有:RS、RW、E 及DB0~7
2>指令介绍
在这里,仅仅介绍下什么是CGRAM、什么是DDRAM?
CGRAM:是用户自定义字符存放存储器,可以自己在指定地址定义字符DDRAM:是对应屏幕位置的存储器,设定了该地址,就确定了从屏幕什么
位置开始显示字符
二、软件部分
#include#include#define DATA P0sbit RS=P2;sb it RW=P2 ;sbit EN=P2;un sign ed char zifu[]={“Hello,World!0”};unsigned char wangzhi[]={“shop108408772.taobao/”};void delayms(unsigned char m) //适当延时{unsigned char i;while(m--){for(i=0;i//写1 个字节{RW=0;_nop_();_nop_(); EN=1;_nop_();DATA=canshu;EN=0;_nop_();_nop_();}
void main(){unsigned char *point;RS=0;WRITE_BYTE(1);//清屏delayms(10);//。

LCD1602显示全部字库字符

LCD1602显示全部字库字符

LCD1602显示全部字库字符、看门狗定时器测试LCD1602液晶内含有192个字符字库,这个程序是分6屏进行显示,整个显示过程长约7秒,看门狗定时器设置时间为8.38秒,刚好显示完全部字符,修改看门狗就可以看到在显示中途重启,比较直观LCD_E BIT P3.4 ;LCD片选LCD_RS BIT P3.5 ;指令、数据位LCD_RW BIT P3.6 ;读、写位PORT EQU P0 ;端口定义WDT_COUNT EQU 0E1H ;看门狗START: LCALL LCD_INITLCALL WDT_INITMOV A,#01H ;清屏LCALL WR_CMDDISP_LOOP: MOV R0,#06H ;循环计数器MOV R1,#80H ;LCD地址计数器MOV R2,#00H ;字符表指针计数器MOV DPTR,#TABWR_DAT_LOOP: MOV A,R1 ;地址命令LCALL WR_CMDINC R1 ;地址加一MOV A,R2 ;表指针MOVC A,@A+DPTRLCALL WR_DA TLCALL DELAY100MSINC R2 ;表指针加一CJNE R1,#90H,BIJIAO ;字符是否到16MOV R1,#0C0H ;到16,换地址BIJIAO: CJNE R1,#0D0H,WR_DAT_LOOP ;字符数是否到32MOV R1,#80H ;地址回归LCALL DELAY1SMOV A,#1B ;清屏LCALL WR_CMDDJNZ R0,WR_DA T_LOOPMOV WDT_COUNT,#00110111BLJMP DISP_LOOPLCD_INIT: MOV A,#111000B ;8位总线LCALL WR_CMDMOV A,#10B ;数据指针清零LCALL WR_CMDMOV A,#01H ;清屏LCALL WR_CMDMOV A,#1111B ;显示开,光标开,闪烁开LCALL WR_CMDMOV A,#10000000B ;设置显示地址00HLCALL WR_CMDRETWDT_INIT: MOV WDT_COUNT,#00110111B ;看门狗定时器设置时间1.1秒RETCHK_BUSY: SETB PORT.7CLR LCD_RSSETB LCD_RWWAIT1: SETB LCD_EMOV C,PORT.7JC WAIT1CLR LCD_ERETWR_CMD: LCALL CHK_BUSYCLR LCD_RSCLR LCD_RWSETB LCD_EMOV PORT,ACLR LCD_ERETWR_DAT: LCALL CHK_BUSYSETB LCD_RSCLR LCD_RWSETB LCD_EMOV PORT,ACLR LCD_ERETDELAY100MS: MOV R7,#10DL5: MOV R6,#250DL4: NOPNOPDJNZ R6,DL4DJNZ R7,DL5RETDELAY1S: MOV R7,#10DL1: MOV R6,#200DL2: MOV R5,#248DL3: DJNZ R5,DL3DJNZ R6,DL2DJNZ R7,DL1RETTAB: DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H,2AH,2BH,2CH,2DH,2EH,2FHDB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FHDB40H,41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH,4DH,4EH,4FHDB50H,51H,52H,53H,54H,55H,56H,57H,58H,59H,5AH,5BH,5CH,5DH,5EH,5FHDB60H,61H,62H,63H,64H,65H,66H,67H,68H,69H,6AH,6BH,6CH,6DH,6EH,6FHDB70H,71H,72H,73H,74H,75H,76H,77H,78H,79H,7AH,7BH,7CH,7DH,7EH,7FHDB0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H,0A7H,0A8H,0A9H,0AAH,0ABH,0ACH,0ADH,0 AEH,0AFHDB0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H,0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BE H,0BFHDB0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H,0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CE H,0CFHDB0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H,0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0 DEH,0DFHDB0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H,0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH ,0EFHDB0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH,0 FFHEND。

字符型液晶LCD1602显示技术

字符型液晶LCD1602显示技术
本实验初始第一行显示¡ Study by MCS51¡,第二行¡ Come On Baby!¡;按一下按键 SW1 液晶上第一行将显示¡ Welcome To Use¡ ,第二行¡ ¡;再按一下 SW1 液晶上就第一行显示¡ QQ:289994918¡,第二行¡ Tel:07732996883¡;再按一下 SW1 就 逐个显示数字;再按一次就回到初始显示状态。
void lcd_displaystr(unsigned char x,unsigned char y,unsigned char code *str) { //x 表示行,y 表示该行的位置(也就是列)
switch(x) {
case 0: write_lcd_command(0x80+y); break; case 1: write_lcd_command(0xc0+y); break;
if(P2_0==0) { mode++; if(mode>=4) mode=0; write_lcd_command(0x01); //清屏 }
while(P2_0==0); } switch(mode)
{ case 0x00:
lcd_displaystr(0,0x00," Study by MCS51 "); lcd_displaystr(1,0x00," Come On Baby! "); break; case 0x01: lcd_displaystr(0,0x00," Welcome To Use "); lcd_displaystr(1,0x00,""); break; case 0x02: lcd_displaystr(0,0x00," QQ:289994918 "); lcd_displaystr(1,0x00,"TEL:07732996883"); break; case 0x03: for(i=0;i<32;i++)

LCD1602学习——Proteus仿真(显示操作)

LCD1602学习——Proteus仿真(显示操作)

LCD1602学习——Proteus仿真(显⽰操作)学习关键:先看懂液晶操作时序图(写操作:写命令、写数据)读状态输⼊RS=L,R/W=H,E=H输出D0—D7=状态字写指令输⼊RS=L,R/W=L,D0—D7=指令输出⽆码,E=⾼脉冲读数据输⼊RS=H,R/W=H,E=H输出D0—D7=数据写数据输⼊RS=H,R/W=L,D0—D7=数据,E=输出⽆⾼脉冲由时序图可知,写操作时(包括写指令、写数据),RS=0;RW=0;再进⾏I/O⼝写操作,然后使能端⼝完成⼀次⾼脉冲(——⾼——低),这是液晶就会执⾏写操作的内容;1602液晶模块内部的控制器共有11条控制指令,如表10-14所⽰:序号指令RS R/W D7D6D5D4D3D2D1D01清显⽰00000000012光标返回000000001*3置输⼊模式00000001I/D S4显⽰开/关控制0000001D C B5光标或字符移位000001S/C R/L**6置功能00001DL N F**7置字符发⽣存贮器地址0001字符发⽣存贮器地址8置数据存贮器地址001显⽰数据存贮器地址9读忙标志或地址01BF计数器地址10要写的数据内容10写数到CGRAM或DDRAM)11读出的数据内容11从CGRAM或DDRAM读数思路:1、控制液晶显⽰输出,需要对其进⾏写数据(写数据前,同样需要先告诉液晶你下⼀步要在哪⾥写,因此写数据前,要写命令先设定数据指针)程序设计⽅式:write_com();//写命令函数,write_date();//写数据函数2、由于要先进⾏初始化,(初始化实际就是对液晶写指令,告诉其⼯作⽅式等)因此初始化函数⾥⾯⾃然就需要调⽤写命令函数write_com();程序结构如下:int init(){ EN = 0; write_com(0X38);//设置16*2显⽰,5*7点阵,8位数据接⼝ write_com(0X0C);//设置开显⽰,不显⽰光标 write_com(0X06);//写⼀个字符时,整屏右移 write_com(0X01);//显⽰清零 return 0;} 主函数部分程序结构:int main(){ init();//调⽤初始化函数 write_com(0x80);//调⽤写指令函数,设置写数据开始指针(第⼀⾏) for(x=0;x<6;x++)//数据写⼊循环程序 { write_date(table[x]); delay(150); } write_com(0x80+0x40); ;//调⽤写指令函数,设置写数据开始指针(第⼆⾏) for(x=0;x<17;x++)//数据写⼊循环程序 { write_date(table1[x]); delay(150); } while(1);return 0;}完整程序如下:1 #include<reg52.h>2int init(); //声明初始化函数3int write_com(unsigned char);//声明写命令函数4int write_date(unsigned char);//声明写数据函数5int delay(unsigned char);//声明延迟函数6 unsigned char x;7 sbit RS = P1^0;8 sbit RW = P1^1;9 sbit EN = P1^2;10 unsigned char code table[]="HELLO!";11 unsigned char code table1[]="MY name is Terry!";1213int main(void)//主函数14 {15 init();16 write_com(0x80);17for(x=0;x<6;x++)18 {19 write_date(table[x]);20 delay(150);21 }22 write_com(0x80+0x40);23for(x=0;x<17;x++)24 {25 write_date(table1[x]);26 delay(150);27 }28while(1);29return0;30 }3132int init()//初始化函数体33 {34 EN = 0;35 write_com(0X38);//设置16*2显⽰,5*7点阵,8位数据接⼝36 write_com(0X0C);//设置开显⽰,不显⽰光标37 write_com(0X06);//写⼀个字符时,整屏右移38 write_com(0X01);//显⽰清零39return0;40 }4142int write_com(unsigned char com)//写命令的函数体43 {44 RS = 0;45 RW = 0;46 P0 = com;47 delay(5);48 EN = 1;49 delay(5);50 EN = 0;51return0;52 }5354int write_date(unsigned char date)//写数据的函数体55 {56 RS = 1;57 RW = 0;58 P0 = date;59 delay(5);60 EN = 1;61 delay(5);62 EN = 0;63return0;64 }6566int delay(unsigned char xms)67 {68 unsigned char x,y;69for(x=xms;x>0;x--)70for(y=110;y>0;y--);71return0;72 }显⽰输出如下:。

简易计算器LCD1602全部显示后清除程序与仿真

简易计算器LCD1602全部显示后清除程序与仿真
jg[9]=c%10;
jg[8]=c/10%10;
jg[7]=c/100%10;
jg[6]=c/1000%10;
jg[5]=c/10000%10;
jg[4]=c/100000%10;
jg[3]=c/1000000%10;
jg[2]=c/10000000%10;
jg[1]=c/100000000%10;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:key=15;break;
case 0xd7:key=0;break;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;iLeabharlann (temp!=0xf0){
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:key=4;break;
case 0xdd:key=5;break;
if(key==12)
write_date('*');
if(key==13)
write_date('/');
key=0;
}
if(key!=10&&key!=11&&key!=12&&key!=13)

LCD1602的简单显示程序

LCD1602的简单显示程序

/*========================================================= 1602液晶显示的实验例子-------------------------------------------------| DB4-----P0.4 | RW-------P2.1| DB5-----P0.5 | RS-------P2.2| DB6-----P0.6 | E--------P2.0| DB7-----P0.7 |---------------------------------------------------LCD1602的简简单显示=========================================================*/ #include#include#define LCM_RW P2_1 //定义引脚#define LCM_RS P2_2#define LCM_E P2_0#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识/*------------------------------------------子函数声明------------------------------------------*/void Write_Data_LCM(unsigned char WDLCM);void Write_Command_LCM(unsigned char WCLCM,BuysC);void Read_Status_LCM(void);void LCM_Init(void);void Set_xy_LCM(unsigned char x, unsigned char y);void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s);void main(void){LCM_Init(); //LCM初始化delay_nms(5);//延时片刻(可不要)while(1){Display_List_Char(0, 0, "");Display_List_Char(1, 0, "Robot-AT89S52");}}/*=====================================函数名:Read_Status_LCM()功能:忙检测函数======================================*/void Read_Status_LCM(void){unsigned char read=0;LCM_RW = 1;LCM_RS = 0;LCM_E = 1;LCM_Data = 0xff;do{read = LCM_Data;}while(read & Busy);LCM_E = 0;}/*------------------------------------------- 函数名:Write_Data_LCM ( )功能:对LCD 1602写数据--------------------------------------------*/ void Write_Data_LCM(unsigned char WDLCM){Read_Status_LCM(); //检测忙LCM_RS = 1;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1; //若晶振速度太高可以在这后加小的延时LCM_E = 1; //延时LCM_E = 0;WDLCM = WDLCM<<4;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1;LCM_E = 1; //延时LCM_E = 0;}/*-------------------------------------------函数名:Write_Command_ LCM ( )功能:对LCD 1602写指令--------------------------------------------*/void Write_Command_LCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC)Read_Status_LCM(); //根据需要检测忙LCM_RS = 0;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;//传输高四位LCM_E = 1;LCM_E = 1;LCM_E = 0;WCLCM = WCLCM<<4; //传输低四位LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;LCM_E = 1;LCM_E = 1;LCM_E = 0;}/*-------------------------------------------函数名:LCM_Init()功能:对LCD 1602初始化--------------------------------------------*/void LCM_Init(void) //LCM初始化{LCM_Data = 0;Write_Command_LCM(0x28,0); //三次显示模式设置,不检测忙信号delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,1); //显示模式设置,开始要求每次检测忙信号Write_Command_LCM(0x08,1); //关闭显示Write_Command_LCM(0x01,1); //显示清屏Write_Command_LCM(0x06,1); //显示光标移动设置Write_Command_LCM(0x0C,1); //显示开及光标设置}/*-------------------------------------------函数名:Set_xy_LCM ()功能:设定显示坐标位置--------------------------------------------*/void Set_xy_LCM(unsigned char x, unsigned char y){unsigned char address;if( x == 0 )address = 0x80+y;elseaddress = 0xc0+y;Write_Command_LCM(address,1);}/*-------------------------------------------函数名:Display_List_Char()功能:按指定位置显示一串字符--------------------------------------------*/void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s){Set_xy_LCM(x,y);while(*s){LCM_Data = *s;Write_Data_LCM(*s);s++;}}datasheet搜索: 。

lcd1602显示(c语言)简单测试

lcd1602显示(c语言)简单测试

因编译器出了问题,加汉字注释老是编译不能通过,故所加注释较少,看一下lcd1602的资料就明白了电路图如下(该图只是仿真图,做实物时要1脚应加一小电阻,实物中1602还有两个脚,是背光电源正负极,正极要加可变电阻调节亮度,网上能找到详细的电路图):原程序:#include<reg51.h>unsigned char code str1[]={"count: "};unsigned char data disdata[1];unsigned int snum=0;sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;void delay1ms(unsigned int t)延时{unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令// { delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void numpro()循环显示数字{ delay1ms(250);delay1ms(250);if(snum==20)snum=0;elsesnum++;disdata[0]=snum/10+0x30;disdata[1]=snum%10+0x30;wr_com(0x86);wr_dat(disdata[0]);wr_com(0x87);wr_dat(disdata[1]);wr_com(0xc6);wr_dat(disdata[0]);wr_com(0xc7);wr_dat(disdata[1]);}void display(unsigned char *p)//显示字符串// {while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}void main(){ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str1);while(1){numpro(); }}。

LCD1602字符测试显示程序与仿真

LCD1602字符测试显示程序与仿真

#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intuchar code table1 []={" WELCOME "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 //************管脚定义************************sbit lcd_rs = P3^0; //液晶数据命令选择端sbit lcd_en = P3^1; //液晶使能//************参数定义************************uint tvalue;//温度值uchar tflag;//温度正负标志uchar data disdata[5];//************子函数定义************************void delay(uchar z); //delay延时子程序void init_lcd(); //LCD1602初始化函数void write_com(uchar com); //LCD1602写指令函数void write_data(uchar date); //LCD1602写数据函数void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数void welcome_1(); //LCD1602显示欢迎函数1//************主函数************************void main(){welcome_1();delay(200);while(1);}//************delay延时子程序************************void delay(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<114;y++);}//************LCD1602初始化函数************************void init_lcd(){lcd_en = 0; // 将使能端置0以完成脉冲write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x08); //写一个字符后地址指针加1write_com(0x01); //显示清零,数据指针清零write_com(0x06); //写一个字符后地址指针加1write_com(0x0c); //关显示,光标不显示不闪烁}//************LCD1602写指令函数************************void write_com(uchar com){delay(5);lcd_rs = 0; // 选择写指令lcd_en = 0; // 将使能端置0P2 = com; // 将要写的命令送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602写数据函数************************void write_data(uchar date){delay(5);lcd_rs = 1; // 选择写数据lcd_en = 0; // 将使能端置0P2 = date; // 将要写的数据送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602显示函数******************void lcd1602_display(uchar *q,uchar *p){write_com(0x80); // 现将数据指针定位到第一行第一个字处while(*q!='\0'){write_data(*q);q++;delay(1);}write_com(0xc0); // 现将数据指针定位到第二行第一个字处while(*p!='\0'){write_data(*p);p++;delay(1);}}//************LCD1602显示欢迎函数1******************void welcome_1(){init_lcd();lcd1602_display(table1,table2);delay(200);}。

LCD1602原理及显示程序

LCD1602原理及显示程序

在日常生活中,我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表与很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。

发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。

在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。

因此,液晶显示器画质高且不会闪烁。

数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比一样显示面积的传统显示器要轻得多。

功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。

除了黑白显示外,液晶显示器还有多灰度有彩色显示等。

如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。

③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

单片机LCD1602闪动显示字符以及protues仿真设计

单片机LCD1602闪动显示字符以及protues仿真设计

单片机LCD1602闪动显示字符以及protues仿真————我的实验(二)以下是我亲自做的protues仿真,代码绝对正确,仿真结果完全正确。

实物也可完美运行。

在网上的代码总有问题,总想把正确的分享给学弟学妹,哈哈。

1.原理图(原理图放大版)2.仿真图结果3.c语言代码#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code string[ ]= {""};unsigned char code string1[ ]={"QUICK STUDY MCU"};/*****************************************************函数功能:延时1ms***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

DS18B20用LCD1602显示Proteus仿真

DS18B20用LCD1602显示Proteus仿真

/******************************DIY-18B20-LCD1602******************************/#include<pic.h>__CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define uchar unsigned char //给unsigned char起别名uchar#define uint unsigned int#define DQ RA4 //定义18B20数据端口#define DQ_DIR TRISA4 //定义18B20D口方向寄存器#define DQ_HIGH() DQ_DIR =1 //设置数据口为输入#define DQ_LOW() DQ = 0; DQ_DIR = 0 //设置数据口为输出unsigned char temp1 = 0 ; //采集到的温度高8位unsigned char temp2 = 0; //采集到的温度低8位unsigned char D[]={"DS18B20 TEMP:"};unsigned char T[10];/*********************函数延时部分********************************/void delayms(uint ms){uchar i;while(ms--){for(i=0;i<87;i++);}}/*延时时间为:(10个固定周期2.5US)+(次数*【1.5US(5+1个周期)】=总延时时间)即就是(10+6N)*T=time */void delay(unsigned char t) //跳入这个循环需要3个指令周期{ //跳出这个循环需要3个指令周期while(t>0) //while第一次判断语句要消耗3个指令周期,之后需要5个t--; //t=t-1,消耗1个指令周期} //也就是说t=0时需要10个指令周期void delay10us(void) //4Mhz下一个指令周期NOP为1Us{NOP();NOP();NOP();NOP();NOP();NOP();}void delay40us(void) //延时42us{delay10us();delay10us();delay10us();delay10us();}/*******************18B20部分********************************/void reset(void){char presence = 1;DQ_HIGH();NOP();NOP();while (presence){DQ_LOW() ; //主机拉至低电平delay(100); //延时610usDQ_HIGH(); //释放总线等电阻拉高总线,并保持15~60usdelay40us(); //延时42usif (DQ == 1) presence = 1; //没有接收到应答信号,继续复位else presence = 0; //接收到应答信号delay(100); //延时610us}}void write_byte(uchar data){uchar i;uchar temp;DQ_HIGH();NOP();NOP();for (i = 8;i > 0;i--){temp = data & 0x01; //最低位移出DQ_LOW();NOP();NOP();NOP();NOP();NOP();//从高拉至低电平,产生写时间隙5usif (temp == 1)DQ_HIGH(); //如果写1,拉高电平delay40us(); //延时42usDQ_HIGH();NOP();NOP();data = data >> 1; //右移一位}}uchar read_byte(void){uchar i;uchar data = 0; //读出温度uchar j;for (i = 8;i > 0;i--){data >>= 1;DQ_HIGH();NOP();NOP();DQ_LOW();NOP();NOP();NOP();NOP();NOP();NOP(); //6usDQ_HIGH(); //拉至高电平NOP();NOP();NOP();NOP();NOP(); //4usj = DQ;if (j)data=data |0x80;delay(10); //延时70us}return (data);}void get_temp(void){float temp,m=0,n=0;unsigned char x;// m=0;// unsigned long temper1;unsigned char temper;unsigned char lsb,msb;reset();write_byte(0xCC);write_byte(0x44);delayms(100);reset();write_byte(0xCC);write_byte(0xBE);temp1=read_byte();temp2=read_byte();lsb=temp1&0x0f; //temp1的低4位为小数部分msb=(temp1>>4)|(temp2<<4);//temp1的高4位和temp2拼成整数部分T[0]=msb/10+0x30;T[1]=msb%10+0x30;T[2]='.';// temp=(temp2*256+temp1)*0.0625*10000;// temper=(unsigned char)temp;// T[0]=temper/100000+0x30;;// T[1]=temper%100000/10000+0x30;// T[2]='.';// T[3]=temper%10000/1000+0x30;// T[4]=temper%1000/100+0x30;// T[5]=temper%100/10+0x30;// T[6]=temper%10+0x30;if(lsb&0x08) m=m+0.5;if(lsb&0x04) m=m+0.25;if(lsb&0x02) m=m+0.125;if(lsb&0x01) m=m+0.0625;n=m*10000;x=(unsigned char)n;T[3]=x/1000+0x30;T[4]=x%1000/100+0x30;T[5]=x%100/10+0x30;T[6]=x%10+0x30;T[7]=0xdf;T[8]=0x43;T[9]='\0';}/******************************LCD1602部分**********************************/ #define rs RC0#define rw RC1#define ep RC2#define LCD PORTDvoid Busy_Check(void) //测试忙碌状态{uchar LCD_Status;rs=0;rw=1;ep=1;NOP();NOP();NOP();NOP();while(1){LCD_Status=PORTD;LCD_Status&=0x80;if(LCD_Status==0);break;}ep=0;}void lcd_wcmd(uchar cmd) //写入指令数据到lcd {Busy_Check();TRISD=0x00;rs=0;rw=0;ep=0;NOP();NOP();LCD=cmd;NOP();NOP();NOP();NOP();ep=1;NOP();NOP();NOP();NOP();ep=0;}void lcd_wdat(uchar dat) //写入字符显示数据到lcd {Busy_Check();TRISD=0x00;rs=1;rw=0;ep=0;LCD=dat;NOP();NOP();NOP();NOP();ep=1;NOP();NOP();NOP();NOP();ep=0;}void lcd_pos(uchar pos) //设定显示位置{lcd_wcmd(pos|0x80); //设定lcd当前光标的位置}void LCD_disp(void){uchar i=0;lcd_pos(0x00);while(D[i]!='\0'){lcd_wdat(D[i]);i++;}lcd_pos(0x40); //设置显示位置为第2行的的二个位置i=0;while(T[i]!='\0'){lcd_wdat(T[i]);i++;}}void lcd_init(void) //lcd初始化设定{lcd_wcmd(0x38);delayms(1);lcd_wcmd(0x0F);delayms(1);lcd_wcmd(0x06);delayms(1);lcd_wcmd(0x01);delayms(1);}/****************************主函数部分***********************************/void main(void){TRISA=0xff; //初始化RA5-RA0的输入输出方向PORTA=0x00; //初始化RA5-RA0数值TRISC=0x00;//初始化对RC口的初始方向进行设置设置为输出TRISD=0x00;//初始化RD口的初始方向进行设置,设置为输出PORTC=0xFF; //初始化RC口的数值PORTD=0x00; //初始化RD口的数值lcd_init();delayms(10);while(1){get_temp();LCD_disp();}}。

字符型LCD1602显示字符试验分析6

字符型LCD1602显示字符试验分析6
六、程序设计
在LCD1602中显示“LCD1602 check ok”下排显示“study up” 程序中没有用到忙检测,而是用的是延时函数来替代忙检测。
➢ 程序分析-1:
#include<reg52.h> //包含头文件
#define uint unsigned int //预定义一下
#define uchar unsigned char
显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm
字符型LCD1602显示字符实验分析 4
三、引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各 引脚接口说明如表10-13所示:
//使能线电平变化,数据送入1602的8位数据口
en=0;
}
字符型LCD1602显示字符实验分析 11
六、程序设计
➢ 程序分析-5:
void lcd_init() {
lcd_wcom(0x38); lcd_wcom(0x0c); lcd_wcom(0x06); 置右移一位 lcd_wcom(0x01); }
4 显示开/关控制
0 0 0 0 0 0 1DC B
5 光标或字符移位
0 0 0 0 0 1 S/C R/L * *
6 置功能
0 0 0 0 1 DL N F * *
7 置字符发生存贮器地址 0 0 0 1
字符发生存贮器地址
8 置数据存贮器地址
0 01
显示数据存贮器地址
9 读忙标志或地址
0 1 BF
计数器地址
10
写数到CGRAM或 DDRAM)

任务四 LCD1602的仿真

任务四 LCD1602的仿真
83\AT89C51\Debug\Debug.OMF”。
(3)调试。
调试方法如下:
1)单击菜单“Debug”(调试)→“Start VSM Debugging”(开始VSM调试),进入调试状态。
2)如果要想查看某个程序段的执行情况,就可以单击选中此程序段,单击右键添加断点。
选择“Toggle(set/Clear)Breakpoint”(设置/清除断点),则可添加断点。
如果想要使用程序能够进行调试,在编译时需要选择“Debug”模式。方法是单击“Compile”编译图标,选择Debug(调试版),Debug版本只会生成一个临时文件,存在C盘,不会产生*.hex文件。
返回ISIS界面,双击单片机属性,就会发现Debug编译后自动加载的编译文件是一个临时文件,存放路径是“C:\DOCUME`1\SXGY\LOCALS`1\Temp\331ee75b20d74c6b910ee3c866d2c7
在编写程序后,调试程序是程序设计人员检查程序正确与否依据的重要手段。调试程序时,编译文件需要调试Debug文件,在调试代码窗口选择“Debug(调试版)”图标 ,之后再单击编译图标 ,则会生成Debug编译文件,但是不会生成*.Debug文件。
本项目中使用的外部显示设备为LCD1602,调试过程需要观察LCD1602的动态显示过程。所以要把LCD1602进行框定,单击暂停图标,就会出现代码行,右侧则会出现LCD1602显示窗口,如图4-62所示。
{
while(*s>0)
{
write_dat(*s);
s++;
}
}
main()
{
csh();
write_com(0x01);//清屏

单片机驱动LCD1602显示字符串程序

单片机驱动LCD1602显示字符串程序

;声 明: ; ; ;
版权所有,嵌入式应用软件园。 此文件只限购买者个人使用,请勿在互联网中传播,如有侵权,将追究相应责任。 如需单片机代码/技术支持,请访问:嵌入式应用软件园
如需源代码/此代码技术支持,请访问: 嵌入式应用软件园。
8
;****************************************************************************** ;函数名:DISP ;输 入:无 ;输 出:无 ;调 用:WRITE_DATA ;描 述:显示字符串到 LCM ;****************************************************************************** ;*******子程序******** DISP:
MOV A,#00000001B
7
嵌入式应用软件园,版权所有,请勿转载/销售。
LCALL WRITE_COM RET
;****************************************************************************** ;函数名:DEL ;输 入:无 ;输 出:无 ;调 用:无 ;描 述:延时 ;****************************************************************************件园,版权所有,请勿转载/销售。
第 1 章 程序功能
程序中包含 LCM 用到的所有函数:初始化、写指令、写数据、判忙碌、清屏 幕。
单片机(51/STC)P1.1,P1.2,P1.3,P1.4 外接按键,按下不同的按键,LCM 上会显 示不同的字符串,用于报警。

实验八 LCD1602液晶显示实验

实验八 LCD1602液晶显示实验

实验报告八实验名称:LCD1602液晶显示实验实验目的:1了解LCD显示的基本原理2了解LCD的接口与控制方法3掌握LCD显示图形的方法4掌握LCD显示字符的方法实验原理:1、LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。

因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使用光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。

,2、由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。

驱动模块具有八位数据总线,外加一些电源接口和控制信号。

而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。

由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。

硬件原理图:1602液晶显示模块可以和单片机AT89C51直接接口,电路如图下图所示:PROTEUS中仿真观察结果.图一程序如下所示:RS EQU p2.6RW EQU p2.5E EQU p2.7ORG 0000HMOV SP , #70HMOV p0, #01HCALL ENABLEMOV p0, #38HCALL ENABLEMOV p0, #0FHCALL ENABLEMOV p0, #06HCALL ENABLEMOV p0, #80HCALL ENABLEMOV DPTR, #TABLE1CALL WRITE1MOV p0, #0C0HCALL ENABLEMOV DPTR, #TABLE2CALL WRITE1MOV p0, #0C2HCALL ENABLEJMP $ENABLE: CLR RSCLR RWCLR ECALL DELAYSETB ERETWRITE1: MOV R1, #00HA1: MOV A, R1MOVC A, @A+DPTRCALL WRITE2INC R1CJNE A, #00H, A1RETWRITE2: MOV p0 , ASETB RSCLR RWCLR ECALL DELAYSETB ERETDELAY: MOV R4, #05D1: MOV R5, #0FFHDJNZ R5, $DJNZ R4, D1RETTABLE1: DB" XIA MEN GUANJIE ",00HTABLE2: DB"XIAN SHI QI TECHNOLOGY ",00H END程序流程图如下所示:实验现象:从左往右逐字显示,闪动两次,清屏,再从右往左显示,闪动两次,清屏,安周期性重复上述现象!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table1 []={" WELCOME "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 //************管脚定义************************
sbit lcd_rs = P3^0; //液晶数据命令选择端
sbit lcd_en = P3^1; //液晶使能
//************参数定义************************
uint tvalue;//温度值
uchar tflag;//温度正负标志
uchar data disdata[5];
//************子函数定义************************
void delay(uchar z); //delay延时子程序
void init_lcd(); //LCD1602初始化函数
void write_com(uchar com); //LCD1602写指令函数
void write_data(uchar date); //LCD1602写数据函数
void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数
void welcome_1(); //LCD1602显示欢迎函数1
//************主函数************************
void main()
{
welcome_1();
delay(200);
while(1);
}
//************delay延时子程序************************
void delay(uchar z)
{
uchar x,y;
for(x=0;x<z;x++)
for(y=0;y<114;y++);
}
//************LCD1602初始化函数************************
void init_lcd()
{
lcd_en = 0; // 将使能端置0以完成脉冲
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x08); //写一个字符后地址指针加1
write_com(0x01); //显示清零,数据指针清零
write_com(0x06); //写一个字符后地址指针加1
write_com(0x0c); //关显示,光标不显示不闪烁
}
//************LCD1602写指令函数************************
void write_com(uchar com)
{
delay(5);
lcd_rs = 0; // 选择写指令
lcd_en = 0; // 将使能端置0
P2 = com; // 将要写的命令送到数据总线上
delay(5); // 延时5ms,待数据稳定
lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定
lcd_en = 0; // 将使能端置0以完成脉冲
}
//************LCD1602写数据函数************************
void write_data(uchar date)
{
delay(5);
lcd_rs = 1; // 选择写数据
lcd_en = 0; // 将使能端置0
P2 = date; // 将要写的数据送到数据总线上
delay(5); // 延时5ms,待数据稳定
lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定
lcd_en = 0; // 将使能端置0以完成脉冲
}
//************LCD1602显示函数******************
void lcd1602_display(uchar *q,uchar *p)
{
write_com(0x80); // 现将数据指针定位到第一行第一个字处
while(*q!='\0')
{
write_data(*q);
q++;
delay(1);
}
write_com(0xc0); // 现将数据指针定位到第二行第一个字处while(*p!='\0')
{
write_data(*p);
p++;
delay(1);
}
}
//************LCD1602显示欢迎函数1******************
void welcome_1()
{
init_lcd();
lcd1602_display(table1,table2);
delay(200);
}。

相关文档
最新文档