写出编程LCD1602液晶的初始化程序
#include
lcd1602需要程序吗 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 举报,一经查实,本站将立刻删除。