⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7_4_2.asm

📁 使用80C51芯片控制LCD显示时间。采用汇编语言实现。
💻 ASM
字号:

       COM EQU 20H          ;指令存储器地址
       DAT EQU 21H          ;数据存储器地址
       CW_ADD EQU 0000H       ;指令口写地址
       CR_ADD EQU 0002H       ;指令口读地址
       DW_ADD EQU 0001H       ;数据口写地址
       DR_ADD EQU 0003H       ;数据口读地址
       HOUR   EQU 30H         ;存放小时变量
       MIN    EQU 31H         ;存放分钟变量
       SEC    EQU 32H         ;存放秒钟变量
       TEMP   EQU 33H         ;存放10ms计数值
       
       ORG 0000H
       LJMP MAIN
       ORG 000BH;定时器T0中断入口地址
       LJMP T0_INT
       
       ORG 0010H
MAIN:  MOV SP,#60H;堆栈指针指向60H
       LCALL DELAY;等待电压上升
       LCALL INIT_LCD;;调用初始化子程序
       ;LCD第一行显示控制
       MOV COM,#80H;写入显示起始地址
       LCALL WR_COM;调用写指令子程序
       MOV DPTR,#LINE1;字符串地址送入DPTR
       MOV R0,#0AH;字符串的字符数
       LCALL DISP;调用查表子程序
       ;显示年、月、日
       LCALL CGR
       MOV COM,#84H;'年'的显示地址
       LCALL WR_COM
       MOV DAT,#00H;CGRAM内第0号图形
       LCALL WR_DAT
       MOV COM,#87H;'月'的显示地址
       LCALL WR_COM
       MOV DAT,#01H;CGRAM内第1号图形
       LCALL WR_DAT
       MOV COM,#8AH;'日'的显示地址
       LCALL WR_COM
       MOV DAT,#02H;CGRAM内第2号图形
       LCALL WR_DAT

       ;LCD第二行显示控制
       MOV HOUR,#10;设置初始时间
       MOV MIN,#0
       MOV SEC,#0
       LCALL SH_TIME;分别将各位时间显示

       MOV TMOD,#01H;定时器T0模式1
       MOV IE,#82H;开通中断
       MOV TL0,#0E0H
       MOV TH0,#0D8H;装入初值
       SETB TR0;开启定时器0
       SJMP $;等待定时器中断

T0_INT:PUSH ACC;压入栈保护
       MOV TL0,#0E0H
       MOV TH0,#0D8H;重加载
       INC TEMP
       MOV A,TEMP;10ms计数值加1
       CJNE A,#100,T0END
       MOV TEMP,#0
       INC SEC;秒加1
       LCALL SH_TIME;调用时间显示程序
       MOV A,SEC
       CJNE A,#60,T0END
       MOV SEC,#0
       INC MIN;分加1
       LCALL SH_TIME;调用时间显示程序
       MOV A,MIN
       CJNE A,#60,T0END
       MOV MIN,#0
       INC HOUR;时加1
       LCALL SH_TIME;调用时间显示程序
       MOV A,HOUR
       CJNE A,#24,T0END
       MOV TEMP,#0
       MOV SEC,#0;秒\分\时单元清0
       MOV MIN,#0
       MOV HOUR,#0
       LCALL SH_TIME;调用时间显示程序
 T0END:POP ACC;出栈
       RETI;中断程序返回


       

       
       
INIT_LCD:   
	MOV A,#30H         ;工作方式设置指令代码
        MOV DPTR,#CW_ADD   ;指令口地址设置
        MOV R2,#03H        ;循环量=3
  INIT1:MOVX @DPTR,A       ;写指令代码
        LCALL DELAY        
	DJNZ R2,INIT1
	MOV A,#38H         ;设置8位总线工作方式两行显示
	MOVX @DPTR,A
	MOV COM,#01H       ;清屏
	LCALL WR_COM
	MOV COM,#06H       ;设置输入方式
	LCALL WR_COM
	MOV COM,#0FH       ;设置显示方式
	LCALL WR_COM
	RET 

WR_COM:
	PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#CR_ADD
   COM1:MOVX A,@DPTR
	JB ACC.7,COM1
	MOV A,COM
	MOV DPTR,#CW_ADD
	MOVX @DPTR,A
	POP ACC
	POP DPL
	POP DPH
	RET

WR_DAT:
	PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#CR_ADD
   DAT1:MOVX A,@DPTR
	JB ACC.7,DAT1
	MOV A,DAT
	MOV DPTR,#DW_ADD
	MOVX @DPTR,A
	POP ACC
	POP DPL
	POP DPH
	RET

CGR:
	MOV COM,#40H;指定CGRAM起始地址
	LCALL WR_COM;将指令写入LCD
	MOV R2,#18H;图形数据长度为24个字节
	MOV DPTR,#TAB;存代码表
	MOV R3,#00H;使指针指到表中第一个码
    CG1:MOV A,R3;A为0
	MOVC A,@A+DPTR;读取表代码
	MOV DAT,A
	LCALL WR_DAT;调用写入数据指令
	INC R3;R3值加1
	DJNZ R2,CG1;判断是否将代码读取完
	RET
TAB:
	DB  08H,0FH,12H,0FH
	DB  0AH,1FH,02H,02H;年的代码
	DB  0FH,09H,0FH,09H
	DB  0FH,09H,0BH,11H;月的代码
	DB  00H,0FH,09H,0FH
	DB  09H,0FH,09H,00H;日的代码


SH_TIME:
	MOV A,HOUR;加载小时数据
	MOV R6,#0;设置位置
	LCALL CONV;调用显示转换显示子程序
	INC R6
	MOV A,#':'
	MOV B,R6
	LCALL SH_LCD2;调用第二行显示子程序
	MOV A,MIN;加载分钟数据
	INC R6;设置位置
	LCALL CONV;调用显示转换显示子程序
	INC R6
	MOV A,#':'
	MOV B,R6
	LCALL SH_LCD2;调用第二行显示子程序
	MOV A,SEC;加载秒钟数据
	INC R6;设置位置
	LCALL CONV;调用显示转换显示子程序
	RET
   CONV:MOV B,#10;设置被除数
	DIV AB;结果A存商数、B存余数
	ADD A,#30H;转换为字符
	PUSH B;B压入堆栈暂存
	MOV B,R6;设置LCD显示的位置
	LCALL SH_LCD2;调用第二行显示子程序
	POP B;出栈
	MOV A,B;B为个位数
	ADD A,#30H;转换为字符
	INC R6;LCD显示位置加1
	MOV B,R6;设置LCD显示的位置
	LCALL SH_LCD2;调用第二行显示子程序
	RET
SH_LCD2:PUSH ACC
	MOV A,B;设置显示地址
	ADD A,#0C0H;设置LCD的第二行地址
	MOV COM,A
	LCALL WR_COM;调用写命令子程序
	POP ACC
	MOV DAT,A
	LCALL WR_DAT;调用写数据子程序
	RET
	


DELAY:
	MOV R7,#100
	DJNZ R7,$
	RET

DISP:
	MOV R1,#0;查表地址初始值
   LOP1:MOV A,R1;将表地址初始值赋予A
	MOVC A,@A+DPTR;查表将字符串内容送入A
	MOV DAT,A;将字符串内容送入数据存储器
	INC R1;地址值加1
	LCALL WR_DAT;掉用写数据子程序
	DJNZ R0,LOP1;判断查表是否10次
	RET;子程序范返回

LINE1:DB '2009 04 02',00H;字符串
     
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -