用汇编语言写一个LCD1602驱动显示程序

发布时间:2023-01-30  

Fosc_KHZ EQU 22118 ;22118KHZ

STACK_POIRTER EQU 0D0H ;堆栈开始地质

P4 DATA 0C0H

P5 DATA 0C8H

P0M1 DATA 0x93

P0M0 DATA 0x94

P1M1 DATA 0x91

P1M0 DATA 0x92

P2M1 DATA 0x95

P2M0 DATA 0x96

P3M1 DATA 0xB1

P3M0 DATA 0xB2

P4M1 DATA 0xB3

P4M0 DATA 0xB4

P5M1 DATA 0xC9

P5M0 DATA 0xCA

P6M1 DATA 0xCB

P6M0 DATA 0xCC

P7M1 DATA 0xE1

P7M0 DATA 0xE2

P_HC595_SER BIT P4.0

P_HC595_RCLK BIT P5.4

P_HC595_SRCLK BIT P4.3

hour DATA 0x30

minute DATA 0x31

second DATA 0x32

ORG 0000H

LJMP F_Main

TestString1: DB "---Clock demo---", 0x00

ORG 0100H

F_Main:

CLR A

MOV P0M1, A ;设置为准双向口

MOV P0M0, A

MOV P1M1, A ;设置为准双向口

MOV P1M0, A

MOV P2M1, A ;设置为准双向口

MOV P2M0, A

MOV P3M1, A ;设置为准双向口

MOV P3M0, A

MOV P4M1, A ;设置为准双向口

MOV P4M0, A

MOV P5M1, A ;设置为准双向口

MOV P5M0, A

MOV P6M1, A ;设置为准双向口

MOV P6M0, A

MOV P7M1, A ;设置为准双向口

MOV P7M0, A

MOV SP, #STACK_POIRTER

MOV PSW, #0

USING 0

LCALL F_Initialize_LCD

MOV A, #0

LCALL F_ClearLine

MOV A, #1

LCALL F_ClearLine

ANL P2M1, #NOT (1 SHL 4)

ORL P2M0, # (1 SHL 4)

SETB P2.4

LCALL F_DisableHC595

MOV R2, #0

MOV R3, #0

MOV DPTR, #TestString1

LCALL F_PutString

MOV hour, #12

MOV minute, #0

MOV second, #0

LCALL F_DisplayRTC

LCALL F_DisableHC595

L_MainLoop:

MOV A, #250 ;延时250 ms

LCALL F_delay_ms

MOV A, #250 ;延时250 ms

LCALL F_delay_ms

MOV A, #250 ;延时250 ms

LCALL F_delay_ms

MOV A, #250 ;延时250 ms

LCALL F_delay_ms

LCALL F_RTC

LCALL F_DisplayRTC

LJMP L_MainLoop

F_DisableHC595:

PUSH AR7

SETB P_HC595_SER

MOV R7, #20

L_DisableHC595_Loop:

SETB P_HC595_SRCLK

NOP

CLR P_HC595_SRCLK

NOP

DJNZ R7, L_DisableHC595_Loop

SETB P_HC595_RCLK = 1;

NOP

CLR P_HC595_RCLK = 0; //锁存输出数据

SETB P_HC595_RCLK = 1;

NOP

CLR P_HC595_RCLK = 0; //锁存输出数据

POP AR7

RET

F_delay_ms:

PUSH AR2 ;入栈R2

PUSH AR3 ;入栈R3

PUSH AR4 ;入栈R4

MOV R2,A

L_Delay_Nms_Loop1:

MOV R3, #HIGH (Fosc_KHZ / 14)

MOV R4, #LOW (Fosc_KHZ / 14)

L_Delay_Nms_Loop2:

MOV A, R4 ; 1T

CLR C ; 1T

SUBB A, #1 ; 2T

MOV R4, A ; 1T

MOV A, R3 ; 1T

SUBB A, #0 ; 2T

MOV R3, A ; 1T

ORL A, R4 ; 1T

JNZ L_Delay_Nms_Loop2 ; 4T

DJNZ R2, L_Delay_Nms_Loop1

POP AR4 ;出栈R2

POP AR3 ;出栈R3

POP AR2 ;出栈R4

RET

F_DisplayRTC:

MOV R2, #1 ;第2行

MOV R3, #4 ;第4个字符

MOV A, hour

MOV B, #10

DIV AB

ADD A, #'0'

LCALL F_WriteChar

INC R3 ;第5个字符

MOV A, B

ADD A, #'0'

LCALL F_WriteChar

INC R3 ;第6个字符

MOV A, #'-'

LCALL F_WriteChar

INC R3 ;第7个字符

MOV A, minute

MOV B, #10

DIV AB

ADD A, #'0'

LCALL F_WriteChar

INC R3 ;第8个字符

MOV A, B

ADD A, #'0'

LCALL F_WriteChar

INC R3 ;第9个字符

MOV A, #'-'

LCALL F_WriteChar

INC R3 ;第10个字符

MOV A, second

MOV B, #10

DIV AB

ADD A, #'0'

LCALL F_WriteChar

INC R3 ;第11个字符

MOV A, B

ADD A, #'0'

LCALL F_WriteChar

RET

F_RTC:

INC second

MOV A, second

CLR C

SUBB A, #60

JNC $+3

RET

MOV second, #0

INC minute

MOV A, minute

CLR C

SUBB A, #60

JNC $+3

RET

MOV minute, #0

INC hour

MOV A, hour

CLR C

SUBB A, #24

JNC $+3

RET

MOV hour, #0

RET

LineLength EQU 16 ;16x2

LCD_BUS DATA 0x80

LCD_B7 BIT LCD_BUS.7

LCD_B6 BIT LCD_BUS.6

LCD_B5 BIT LCD_BUS.5

LCD_B4 BIT LCD_BUS.4

LCD_B3 BIT LCD_BUS.3

LCD_B2 BIT LCD_BUS.2

LCD_B1 BIT LCD_BUS.1

LCD_B0 BIT LCD_BUS.0

LCD_ENA BIT P2.7

LCD_RW BIT P2.6

LCD_RS BIT P2.5

C_CLEAR EQU 0x01

C_HOME EQU 0x02

C_CUR_L EQU 0x04

C_RIGHT EQU 0x05

C_CUR_R EQU 0x06

C_LEFT EQU 0x07

C_OFF EQU 0x08

C_ON EQU 0x0C

C_FLASH EQU 0x0D

C_CURSOR EQU 0x0E

C_FLASH_ALL EQU 0x0F

C_CURSOR_LEFT EQU 0x10

C_CURSOR_RIGHT EQU 0x10

C_PICTURE_LEFT EQU 0x10

C_PICTURE_RIGHT EQU 0x10

C_BIT8 EQU 0x30

C_BIT4 EQU 0x20

C_L1DOT7 EQU 0x30

C_L1DOT10 EQU 0x34

C_L2DOT7 EQU 0x38

C_4bitL2DOT7 EQU 0x28

C_CGADDRESS0 EQU 0x40

C_DDADDRESS0 EQU 0x80

F_LCD_DelayNop:

NOP

NOP

NOP

NOP

NOP

NOP

NOP

RET

F_CheckBusy:

PUSH ACC

PUSH AR2

PUSH AR3

MOV R2, #HIGH 10000

MOV R3, #LOW 10000

L_CheckBusyLoop:

JNB LCD_B7, L_QuitCheckBusy ; 5T

MOV A, R3 ; 1T

CLR C ; 1T

SUBB A, #1 ; 2T

MOV R3, A ; 1T

MOV A, R2 ; 1T

SUBB A, #0 ; 2T

MOV R2, A ; 1T

ORL A, R3 ; 1T

JNZ L_CheckBusyLoop ; 4T

L_QuitCheckBusy:

POP AR3

POP

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    ; 4 0 0 0 0 ; n++ ) ; //延时 Ledi++;//力(x 1 i f ( ledi== 8 ) ledi= 0 ; } ) 通过这个实现同一功能的两个程序可以发现,采用汇编语言编写......
    斯方块是一款风靡全世界的十分经典的休闲游戏。本文在基于MCS51单片机和具有矩阵式按键、双色LED点阵和数码管等功能模块的实验系统上,采用以上所述的汇编语言结构化的编程思想,编写能够运用按键操作游戏、将游戏图像显示于16×8LED双色......
    告诉你怎么编写一个最简单的单片机程序;在汇编语言中,让某个端口输出高电平或低电平都有专用的语句,以P1.0端口为例: 让该端口输出高电平的语句是: SETB P1.0 让该......
    程序(Startup.S) 因为要设置p15协处理器,所以初始化时钟用汇编语言来写。 .text                     /*定义代码段*/ .global _start......
    ; //work LED flash //LED灯闪烁     } } void init_timer0() {     runCode=3;     TMOD = 0x01; //set timer0......
    形式。采用机器语言编写的程序称之为目标程序。采用汇编语言编写的程序称之为源程序。计算机能够直接识别并执行的只有机器语言汇编语言程序不能被计算机直接识别并执行,必须经过一个中间环节把它翻译成机器语言......
    51单片机实现最小系统的原理和电路与编程设计说明;本课以AT89S51单片机最小系统来教你如何实现单片机编程,该程序驱动单片机P1.7端口上的发光二极管不停闪烁,系统程序用keil 汇编语言编写......
    给出了采用51汇编语言编写程序。 1 硬件电路多位LED显示时,常将所有位的段选线并联在一起,由一个8位I/O口控制,而共阴极点或共阳极点分别由另一个8位I/O口控制;也可......
    键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。然后,单击“保存”按钮。 6)回到编辑界面后,单击“Target 1”前面的“+”号......
    样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序通常由三部分组成:指令、伪指令和宏指令。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作。例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>