Ⅰ 51单片机编写lcd1602显示程序,第一行显示自己的姓名,第二行显示学号
1、首先我们打开Keil μVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并启动器添加STARTUP.A51文件,然后在当前目录下新建一个C文件,并将其添加入工作路径。
Ⅱ lcd1602程序流程应该怎么描述
LCD1602是一种常见携腔的字符型液晶显示屏,通常与单片机一起使用。芦隐袜下面是LCD1602程序流程的一般描述:
初始化:设置数据总线和控制总线的方向及初始状态,将LCD1602的控制寄存器和数据寄存器初始化,设置显示模式、光标位置等。
发送指令:将需要执行的指陪激令通过数据总线发送到LCD1602的指令寄存器中。
发送数据:将需要显示的数据通过数据总线发送到LCD1602的数据寄存器中。
延时:在发送指令和数据的过程中,需要适当的延时等待LCD1602完成操作。
循环显示:根据需要不断发送指令和数据,以显示所需的内容。
清屏操作:当需要清空显示内容时,通过发送清屏指令实现。
光标控制:根据需要移动光标的位置或改变光标显示状态。
显示控制:根据需要控制显示内容的开关、显示光标等。
结束程序:完成所需的显示后,关闭LCD1602的电源或将其重置为初始状态。
以上是LCD1602程序流程的一般描述,实际编程时还需要根据具体需求进行具体的指令和数据的发送操作。
Ⅲ 51单片机+ADC0809+LCD1602用汇编语言编程
你把这两个程序合起来改下就差不多咯!时间忙 只能把自己以前学的子程序给你咯
; :1602显示
LCD_RS EQU P2.0
LCD_RW EQU P2.1
LCD_EN EQU P2.2
LCD_DATA EQU P0
;*******************************************************************
ORG 0000H
AJMP MAIN
ORG 0030H
;*******************************************************************
MAIN:
MOV SP,#60H
ACALL LCD_INIT ;LCD初始化
MAIN1:
ACALL CLR_LCD ;清LCD
MOV A,#90H ;在第一行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE1 ;第一行字符串的起始地址送入DPTR。
ACALL WRITE
MOV A,#0D0H ;在第二行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE2 ;第二行字符串的起始地址送入DPTR。
ACALL WRITE
MOV R3,#10H ;向左移动16格
LOOPA:
MOV A,#18H ;字符同时左移一格
ACALL LCD_CMD
MOV R5,#03H ;延时375MS
ACALL DELAY125MS
DJNZ R3,LOOPA
ACALL DELAY4 ;延时1.6s
ACALL DELAY4
MOV R4,#02H ;设置闪烁次数
ACALL FLASH ;开始闪烁
AJMP MAIN1
LINE1:
DB "YALONG:",00H
LINE2:
DB "welcome you!",00H
;***************************************************************
;LCD初始化设定子程序
;***************************************************************
LCD_INIT:
ACALL DELAY5MS ;延时15MS
ACALL DELAY5MS ;等待LCD电源稳定
ACALL DELAY5MS
MOV A,#38H ;16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H ;16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H ;16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC ;不进行LCD忙检测
ACALL DELAY5MS
MOV A,#08H ;显示关
ACALL LCD_CMD ;进行LCD忙检测
MOV A,#01H ;清除屏幕
ACALL LCD_CMD ;进行LCD忙检测
MOV A,#0CH ;显示开,关光标
ACALL LCD_CMD ;进行LCD忙检测
RET
;***************************************************************
;清LCD子程序
;***************************************************************
CLR_LCD:
MOV A,#01H ;清除屏幕
ACALL LCD_CMD ;进行LCD忙检测
RET
;***************************************************************
;写指令数据到LCD
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;***************************************************************
LCD_CMD:
CALL CHECKBUSY
LCD_CMD_NC:
CLR LCD_RS
CLR LCD_RW
MOV LCD_DATA,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;***************************************************************
;写显示数据到LCD
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;***************************************************************
LCD_WDATA:
ACALL CHECKBUSY
SETB LCD_RS
CLR LCD_RW
MOV LCD_DATA,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;***************************************************************
;检测LCD控制器忙状态
;读数据
;RS=L,RW=H,E=H,输出:D0-D7=数据
;LCD_DATA.7=1,LCD忙,等待。LCD_DATA.7=0,LCD闲,可以进行读写操作。
;***************************************************************
CHECKBUSY:
PUSH ACC
MOV LCD_DATA,#0FFH
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
BUSYLOOP:
NOP
JB LCD_DATA.7,BUSYLOOP
CLR LCD_EN
POP ACC
RET
;***************************************************************
; 发送字符串子程序
;***************************************************************
WRITE:
PUSH ACC
WRITE1:
CLR A
MOVC A,@A+DPTR
JZ WRITE2
INC DPTR
ACALL LCD_WDATA
JMP WRITE1
WRITE2:
POP ACC
RET
;***************************************************************
;闪烁子程序
;***************************************************************
FLASH:
MOV A,#08H ;关闭显示
ACALL LCD_CMD
ACALL DELAY4
MOV A,#0CH ;开显示,关闭光标
ACALL LCD_CMD
ACALL DELAY4
DJNZ R4,FLASH
RET
;***************************************************************
;延时5MS子程序
;LCD初始化使用
;***************************************************************
DELAY5MS:
MOV R6,#10
DL1:
MOV R7,#249
DL2:
DJNZ R7,DL2
DJNZ R6,DL1
RET
;***************************************************************
;延时125MS子程序
;字符串移动时使用
;***************************************************************
DELAY125MS:
DL3:
MOV R6,#250
DL4:
MOV R7,#249
DL5:
DJNZ R7,DL5
DJNZ R6,DL4
DJNZ R5,DL3
RET
;***************************************************************
;延时800MS子程序
;闪烁时使用
;***************************************************************
DELAY4:
MOV R5,#40
DL6:
MOV R6,#100
DL7:
MOV R7,#100
DL8:
DJNZ R7,DL8
DJNZ R6,DL7
DJNZ R5,DL6
RET
;***************************************************************
ENd
; ADC0809子程序
; 引脚定义
ADC_EOC EQU P2.0
ADC_CS EQU P2.1
ADC_RD EQU P2.2
ADC_WR EQU P2.3
ADC_DATA EQU P0
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
SETB ADC_EOC
SETB ADC_WR
SETB ADC_RD
SETB ADC_CS
CLR ADC_CS ;START and ALE is H
CLR ADC_WR
NOP
NOP
NOP
SETB ADC_WR
SETB ADC_CS
NOP
JB ADC_EOC,$ ; JNB ADC_EOC,$
CLR ADC_CS
CLR ADC_RD
MOV ADC_DATA,#0FFH
MOV A,ADC_DATA
SETB ADC_RD
SETB ADC_CS
CJNE A,#00H,BELL
INC A
BELL:
MOV R5,A
BELL1: ACALL DELAY
DJNZ R5,BELL1
CPL P2.7
AJMP MAIN
DELAY:
MOV R7,#02H
D1:
MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,D1
RET
END
Ⅳ 单片机LCD1602液晶显示的汇编程序
也没去理解AC,只知道第一行第1点的地址是80H,第二行第1点是C0H。
下面就是你要的程序,仅供参考
RSBITP1.2;这3位是液晶屏的控制信号,连接方式由具体硬件而定
RWBITP1.1
EBITP1.0
ORG00H
AJMPMAIN
ORG30H
MAIN:
movR0,#24
ACALLINITIAL
ACALLDISPLAY;调用液晶显示子程序
AJMPMAIN
;-------液晶显示---------------------------------------
DISPLAY:
MOVA,#80H ;第一行第1个点
ACALLWR_CMD
MOVDPTR,#LINE1
ACALLPR_STR
ACALLWR_DATA
DISP1:
MOVA,#1CH ;字符左移命令(注:实物中左移命令字为18H)
ACALLWR_CMD
ACALLD05S
DJNZR0,DISP1
RET
;---液晶屏初始化-------------------------------------------------
INITIAL:
MOVA,#01H
ACALLWR_CMD
MOVA,#38H
ACALLWR_CMD
MOVA,#0CH
ACALLWR_CMD
MOVA,#06H
ACALLWR_CMD
RET
;----写液晶指令的子程序------------------------------------------
WR_CMD:
MOVP3,A
CLRRS;写入控制命令
CLRRW
CLRE
ACALLDELAY
SETBE
RET
;----写液晶数据---------------------------------------------
WR_DATA:
MOVP3,A
SETBRS;写入数据
CLRRW
CLRE
ACALLDELAY;判断液晶模块是否忙?
SETBE
RET
;-----写行字符---------------------------------------------------------------
PR_STR:
CLR A
MOVCA,@A+DPTR
JZ END_PR
ACALLWR_DATA
INC DPTR
AJMPPR_STR
END_PR:
RET
;----查看液晶忙碌信号---------------------------------------------------------
DELAY:
MOVP3,#0FFH;判断液晶显示器是否忙的子程序
CLRRS
SETBRW
CLRE
NOP
SETBE
JBP3.7,DELAY;如果P3.7为高电平表示忙就循环等待
RET
;----0.5S延时(按12MHZ算)-----------------------------------------------------------------
D05S:
MOVR6,#25
MOVR5,#100
MOVR4,#100
DJNZR4,$
DJNZR5,$-4
DJNZR6,$-8
RET
;--------------------------------------------------------------------------------------
LINE1:
DB'ZHUNIYISHENGPINGAN',00H
Ⅳ 单片机LCD1602显示程序(汇编),小弟有很多地方不懂,希望高人能加上注释,有助于本人学习
; 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