1. 首页 > 笙耀百科 >

lcd1602需要程序吗 lcd1602c

写出编程LCD1602液晶的初始化程序

#include

lcd1602需要程序吗 lcd1602clcd1602需要程序吗 lcd1602c


#define uchar unsigned char

#define uint unsigned int

#define lcd_ports P1

sbit lcdrs=P3^5;

sbit lcdrw=P3^3;

sbit lcde=P3^4;

void delay(uint z) //延迟子程序

{uchar i,j;

for(i=z;i>0;i--)

for(j=256;j>0;j--);

}void write_com(uchar com) //1602写指令

{lcdrs=0;

P1=com;

delay(5);

lcde=1;

delay(5);

lcde=0;

}void write_data(uchar date) //1602写数据,写的是你要显示数据的ASCLL码值

{lcdrs=1;

P1=date;

delay(5);

lcde=1;

delay(5);

lcde=0;

}void init() //初始化

{lcdrw=0;

lcde=0;

write_com(0x38); //使液晶显示点阵

write_com(0x0e); //初始设置

write_com(0x06); //初始设置

write_com(0x01); //清零

write_com(0x80+0x00); //使指针指向第一行第一列

}void main()

{init();

while(1){

write_com(0x80);//从第一行第一列开始写数据。

write_data(0x73); //显示s字符

write_data(0x69);//第一行第二列显示字符i

write_data(0x6e);//第一行第三列显示字符n

write_data(0x65);//第一行第四列显示字符e;}

}

可以给你写一份

不用加,LCD1602的数据端口几乎不需要电流,单片机可以直接驱动

加74HC245完全多余

不知道别的芯片可不可以,具体的程序要根据相应的电路来写的,芯片不一样真值表可能就不一样,程序肯定会有变化的

让LCD1602显示字符前要输入字符所在的地址,这也是每显示一个字符地址要加一的原因,在下面的一段代码里你会明白怎么设置地址,怎么让地址自动加一,怎么清屏,怎么显示字符,希望你能看懂哦

sbit LCD_E=P2^0; //lcd1602控制置位

sbit LCD_RW=P2^1; //lcd1602控制置位

sbit LCD_RS=P2^2; //lcd1602控制置位

void LCD_command(unsigned char com)

{LCD_E=0;

LCD_RW=0;

LCD_RS=0;

P1=com;

delay_us(100);

LCD_E=1;

delay_us(100);

LCD_E=0;

}void LCD_date(unsigned char dat)

{LCD_E=0;

LCD_RW=0;

LCD_RS=1;

P1=dat;

delay_us(100);

LCD_E=1;

delay_us(100);

LCD_E=0;

}LCD_command(0x38); //设置LCD为16*2显示,5*7点阵,8位数据接口

LCD_command(0x0c); //设置LCD显示开,光标显示关

LCD_command(0x06); //写一个数据后地址加1

LCD_command(0x01); //显示清屏

LCD_command(0x80); //数据指针设置为第一行第一位

LCD_date('pi');

LCD_date('l');

LCD_date('e');

LCD_date('a');

LCD_date('s');

LCD_date('e');

LCD_date(' ');

LCD_date('c');

LCD_date('h');

LCD_date('e');

LCD_date('c');

LCD_date('k');

LCD_date(' ');

LCD_date('t');

LCD_date('h');

LCD_date('e');

LCD_command(0x80+0x40); //LCD地址指针指向第二行第一个位置

LCD_date('c');

LCD_date('o');

LCD_date('n');

LCD_date('n');

LCD_date('e');

LCD_date('c');

LCD_date('t');

LCD_date('i');

LCD_date('o');

LCD_date('n');

LCD_date('!');

LCD_date('!');

需要给你写吗

; LCD Display Driver Demo.

; Timing code assumes 1.2MHz Clock

;LCD Registers addresses

LCD_CMD_WR equ 0 ;宏定义

LCD_DATA_WR equ 1

LCD_BUSY_RD equ 2

LCD_DATA_RD equ 3

;LCD Commands

LCD_CLS equ 1

LCD_HOME equ 2

LCD_SETMODE equ 4

LCD_SETVISIBLE equ 8

LCD_SHIFT equ 16

LCD_SETFUNCTION equ 32

LCD_SETCGADDR equ 64

LCD_SETDDADDR equ 128

;Reset vector

org 0000h;程序开始入口地址0x00

jmp start;跳转到start处

;Start of the program

org 0100h

string1a:db ' !! A M A Z I N G !! ' ;表格,要显示的内容。

db 0

string1b:db '!! A M A Z I N G !! '

db 0

string2:db ' A virtual LM032L... '

db 0

string3:db ' driven by a virtual '

db 0

string4:db ' 8051 processor!'

db 0

start: mov A,#038h ;为什么是38h:查1602数据手册,38h的命令

call wrcmd

loop: mov A,#LCD_SETVISIBLE+6 ;Make the display & blink visible:

call wrcmd

mov R7,#2

loop2:

mov DPTR,#string1a

call wrstr

mov DPTR,#200

call wtms

mov A,#LCD_CLS ;Clear screen

call wrcmd

mov DPTR,#string1b

call wrstr

mov DPTR,#200

call wtms

mov A,#LCD_CLS ;Clear screen

call wrcmd

djnz R7,loop2

mov DPTR,#string1a

call wrstr

mov DPTR,#400

call wtms

mov A,#LCD_SETDDADDR+64

call wrcmd

mov DPTR,#string2

call wrslow

mov DPTR,#200

call wtms

mov A,#LCD_CLS ;Clear screen

call wrcmd

mov DPTR,#string3

call wrslow

mov A,#LCD_SETDDADDR+64

call wrcmd

mov DPTR,#string4

call wrslow

mov A,#LCD_SETVISIBLE+7 ;Show the blink cursor as well.

call wrcmd

mov DPTR,#2000

call wtms

mov A,#LCD_CLS ;Clear screen

call wrcmd

jmp loop

;Sub routine to write null terminated string at DPTR in program ram.

wrstr: mov R0,#LCD_DATA_WR

wrstr1: clr A

movc A,@A+DPTR

jz wrstr2

movx @R0,A

call wtbusy

inc DPTR

push DPL

push DPH

pop DPH

pop DPL

jmp wrstr1

wrstr2: ret

;Sub routine to write null terminated string at DPTR in program ram. Slowly

wrslow: mov R0,#LCD_DATA_WR

wrslw1: clr A

movc A,@A+DPTR

jz wrslw2

movx @R0,A

call wtbusy

inc DPTR

push DPL

push DPH

mov DPTR,#100

call wtms

pop DPH

pop DPL

jmp wrslw1

wrslw2: ret

;Sub routine to write command:

wrcmd: mov R0,#LCD_CMD_WR

movx @R0,A

jmp wtbusy

;Sub routine to write character:

wrchar: mov R0,#LCD_DATA_WR

movx @R0,A

;Subroutine to wait for busy clear

wtbusy: mov R1,#LCD_BUSY_RD

movx A,@r1

jb ACC.7,wtbusy

ret

;Wait for number of seconds in A

wtsec: push ACC

call wtms

pop ACC

dec A

jnz wtsec

ret

;Wait for number of milliseconds in DPTR

wtms: xrl DPL,#0FFh ;Can't do DEC DPTR, so do the loop by forming 2's complement

xrl DPH,#0FFh ;and incrementing instead.

inc DPTR

wtms1: mov TL0,#09Ch ;100 ticks before overflow = 1ms at 1.2MHz Clock

mov TH0,#0FFh

mov TMOD,#1 ;Timer 0 mode 1

setb TCON.4 ;Timer 0 runs

wtms2: jnb TCON.5,wtms2

clr TCON.4 ;Timer 0 stops

clr TCON.5

inc DPTR

mov A,DPL

orl A,DPH

jnz wtms1

ret

END

呵呵。汇编的看不大懂,c语言的要么、。、

这么一大坨啊~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息