万年历
1、题目要求:
1、实现目标:用液晶屏显示时间、日期、星期和温度,时间、日期可调,且可以设置闹钟。
2、所用功能:1602液晶屏,独立按键,矩阵键盘,DS18B20温度传感器,1302时钟器,蜂鸣器,定时、中断。
2、程序框图:
主程序框图
计算阳历程序图
3、程序:
;==================变量和管脚的定义===================
LCD_RW EQU P2.5
LCD_RS EQU P2.6
LCD_EN EQU P2.7 ; LCD液晶显示控制端接口
RS BIT P2.0
RW BIT P2.1
E BIT P2.2
LCD EQU P0
JIDIANQI EQU P2.3
BEER EQU P2.4
H_BIT EQU 20H
M_BIT EQU 21H
S_BIT EQU 22H
HH EQU 23H
MM EQU 24H
SS EQU 25H
HH_BIT EQU 26H
MM_BIT EQU 27H
SS_BIT EQU 28H
BUF EQU 30H ; 30H-33H保存解码结果
FLAG1 BIT F0 ;DS18B20存在标志位
DQ BIT P3.4 ;DS18B20占用的总线
TEMPER_L EQU 29H
TEMPER_H EQU 28H
ROM1 EQU 2AH
ROM2 EQU 2BH
ROM3 EQU 2CH
ROM4 EQU 2DH
ROM5 EQU 2EH
ROM6 EQU 2FH
ROM7 EQU 30H
ROM8 EQU 31H
A_BIT EQU 35H
B_BIT EQU 36H
LG EQU 45H
LG1 EQU 46H ; LCD1602液晶显示位
ORG 0000H
LJMP INTI
ORG 000BH
;===================================================
; 初始化
;===================================================
ORG 1000H
INTI:
MOV LG, #35H
MOV LG1, #34H ; LCD1602液晶显示初值
MOV TMOD, #11H ; 定时器方式1和0
MOV TH0, #4CH
MOV TL0, #B0H ; 定时器0初值,控制中断时间
MOV TH1, #D8H ;设定时1初值
MOV TL1, #F0H
MOV TCON, #50H
MAIN:
LCALL LCD_INIT
LCALL LCDSET1 ; LCD1602液晶显示初始化
SETB ET0 ; 打开定时器中断
SETB EA ; 打开总中断
SETB TR0 ; 开定时器
SETB TR1 ; 开定时器
MOV SP, #60H
MOV P1, #00H
MOV R5, #00H
MOV H_BIT, #00H
MOV M_BIT, #00H
MOV S_BIT, #00H
MOV HH_BIT, #00H
MOV MM_BIT, #00H
MOV SS_BIT, #00H
MOV HH, #00H
MOV MM, #00H
MOV SS, #00H
MOV TMOD, #01H
MOV TH0, #3CH
MOV TL0, #0B0H
MOV LCD, #01H
LCALL LCDWC
LCALL INIT_18B20 ;复位程序
LCALL GET_TEMPER ;读转换后的温度
AJMP CHANGE
MOV SP, #70H ;堆栈指针设到70H的地方
MOV R7, #10
ACALL DELAY_MS
MOV DPTR, #MSG1
CALL DISPLAY_LINE1;在第一行显示
MOV DPTR, #MSG2
CALL DISPLAY_LINE2;在第二行显示
HERE:
LCALL KEY
JMP HERE ; 按键标志,不断循环
KEY:
ORL P1, #11111111B ; 拉高独立按键
MOV A, P1
CPL A
ANL A, #0CFH
JZ KEY0 ; 若为0,跳到KEY0
LJMP KEY1
KEY0:
LJMP KEY2
KEY1:
JB P1.2, KEY2
CLR EA ; 开中断
MOV A, #02H ; 清除屏幕
ACALL LCD_CMD ; 进行LCD忙检测
MOV A, #80H
LCALL LCD_CMD
MOV A, #53H
LCALL LCD_WDATA ; 查表,得到显示数
MOV A, #81H
LCALL LCD_CMD
MOV A, #51H
LCALL LCD_WDATA
MOV A, #82H
LCALL LCD_CMD
MOV A, #52H
LCALL LCD_WDATA
MOV A, #85H
LCALL LCD_CMD
MOV A, #46H
LCALL LCD_WDATA
MOV A, #86H
LCALL LCD_CMD
MOV A, #30H
LCALL LCD_WDATA
MOV A, #87H
LCALL LCD_CMD
MOV A, #37H
LCALL LCD_WDATA
MOV A, #89H
LCALL LCD_CMD
MOV A, #41H
LCALL LCD_WDATA
MOV A, #8AH
LCALL LCD_CMD
MOV A, #32H
LCALL LCD_WDATA
MOV A, #8BH
LCALL LCD_CMD
MOV A, #34H
LCALL LCD_WDATA
MOV A, #8CH
LCALL LCD_CMD
MOV A, #30H
LCALL LCD_WDATA
SETB EA ; 开中断
LJMP KEY7
D1MS:
MOV R5, #10
D1:
MOV R6, #250
DJNZ R6, $
DJNZ R5, D1
RET
;===================================================
; 延时10MS
; 占用资源:R5, R6
;===================================================
D10MS:
MOV R5, #3
D2:
MOV R6, #200
DJNZ R6, $
DJNZ R5, D2
RET
;===================================================
; 检测LCD控制器忙状态
; 读数据
; RS=L,RW=H,E=H,输出:D0-D7=数据
;===================================================
CHECKBUSY:
PUSH ACC
MOV P0, #0FFH
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
BUSYLOOP:
NOP
JB P0.7, BUSYLOOP
CLR LCD_EN
POP ACC
RET
;===================================================
; 写显示数据到LCD
; RS=H,RW=L,D0-D7=数据,E=高脉冲
;===================================================
LCD_WDATA:
ACALL CHECKBUSY
; 高4字节
SETB LCD_RS
CLR LCD_RW
CLR LCD_EN
MOV P0, A
NOP
NOP
NOP
NOP
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
; 低4字节
SETB LCD_RS
CLR LCD_RW
CLR LCD_EN
NOP
NOP
NOP
NOP
ANL A, #0FH
SWAP A
MOV P0, A
NOP
NOP
NOP
NOP
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;===================================================
; 写指令数据到LCD
; RS=L,RW=L,D0-D7=指令码,E=高脉冲
;===================================================
LCD_CMD:
ACALL CHECKBUSY
LCD_CMD_NC:
; 高4字节
CLR LCD_RS
CLR LCD_RW
CLR LCD_EN
NOP
NOP
MOV P0, A
NOP
NOP
NOP
NOP
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
; 低4字节
ANL A, #0FH
SWAP A
MOV P0, A
NOP
NOP
NOP
NOP
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;===================================================
; 写8位指令数据到LCD
; RS=L,RW=L,D0-D7=指令码,E=高脉冲
;===================================================
LCD_CMD_8BIT:
ACALL CHECKBUSY
LCD_CMD_8BIT_NC:
CLR LCD_RS
CLR LCD_RW
CLR LCD_EN
NOP
NOP
MOV P0, A
NOP
NOP
NOP
NOP
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
;===================================================
; LCD初始化设定子程序
;===================================================
LCD_INIT:
ACALL D1MS ; 延时15MS
ACALL D1MS ; 等待LCD电源稳定
ACALL D1MS
MOV A, #38H ; 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_8BIT_NC ; 不进行LCD忙检测
ACALL D1MS
MOV A, #38H ; 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_8BIT_NC ; 不进行LCD忙检测
ACALL D1MS
MOV A, #28H ; 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_8BIT_NC ; 不进行LCD忙检测
ACALL D1MS
; 转4位界面
MOV A, #28H ; 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD ; 不进行LCD忙检测
ACALL D1MS
MOV A, #0cH ; 显示关
ACALL LCD_CMD ; 进行LCD忙检测
ACALL D1MS
MOV A, #02H ; 清除屏幕
ACALL LCD_CMD ; 进行LCD忙检测
ACALL D1MS
MOV A, #01H ; 移动光标
ACALL LCD_CMD ; 进行LCD忙检测
ACALL D1MS
RET
;===================================================
; 显示位置与移动光标设定
;===================================================
LCDSET1:
MOV A, #01H ; 清除屏幕
ACALL LCD_CMD
ACALL D1MS
MOV A, #06H ; 移动光标(光标加1)
ACALL LCD_CMD
ACALL D1MS
MOV A, #87H ; 显示第一行左边第一位位置
ACALL LCD_CMD
ACALL D1MS
RET
;===================================================
LOOP:
LCALL EY
LCALL KEY
LCALL EYY
LJMP LOOP
;***************************时钟显示***************************************
;===================子程序=================
EY:
LCALL LOOP1
LCALL LCDSET
MOV DPTR,#TAB1
MOV A,H_BIT
LCALL DISP
MOV A,HH_BIT
LCALL DISP
MOV A,#58
MOV LCD,A
LCALL WRR
MOV A,M_BIT
LCALL DISP
MOV A,MM_BIT
LCALL DISP
MOV A,#58
MOV LCD,A
LCALL WRR
MOV A,S_BIT
LCALL DISP
MOV A,SS_BIT
LCALL DISP
RET
;=======BCD码转换子程序===============
LOOP1:
MOV A,SS
MOV B,#10
DIV AB
MOV S_BIT,A
MOV SS_BIT,B
MOV A,MM
MOV B,#10
DIV AB
MOV M_BIT,A
MOV MM_BIT,B
MOV A,HH
MOV B,#10
DIV AB
MOV H_BIT,A
MOV HH_BIT,B
RET
;==========中断子程序=================
TIME0:
PUSH ACC
PUSH PSW
MOV TH0,#3CH
MOV TL0,#0B0H
INC R5
CJNE R5,#20,LOOP2
MOV R5,#00H
INC SS
MOV A,SS
CJNE A,#60,LOOP2
MOV SS,#00H
INC MM
MOV A,MM
CJNE A,#60,LOOP2
MOV MM,#00H
INC HH
MOV A,HH
CJNE A,#24,LOOP2
MOV HH,#00H
LOOP2:
POP PSW
POP ACC
RETI
;=====按键检测子程序====================
KEY:
clr ea
JNB P3.2,SS_KEY
KEY1:
setb ea
RET
;========秒钟调整子程序================
SS_KEY:
LCALL EY1
LCALL DIS1
JNB P3.2,SS_KEY
SSA:
LCALL EY1
JNB P3.3,S_ADDKEY
JNB P3.4,S_DECKEY
LCALL DIS1
JNB P3.2,MM_KEY
JNB P3.5,KEY3
LJMP SSA
KEY3:
LJMP KEY1
;=========秒加1==========================
S_ADDKEY:
lcall ey1
LCALL DIS1
JNB P3.3,S_ADDKEY
INC SS
MOV A,SS
CJNE A,#60,SS_KEY1
MOV SS,#00H
SS_KEY1:
LJMP SSA
;=========秒减1=========================
S_DECKEY:
lcall ey1
LCALL DIS1
JNB P3.4,S_DECKEY
MOV A,SS
CJNE A,#00,SS_KEY2
MOV SS,#60
SS_KEY2:
DEC SS
LJMP SS_KEY1
;=========分钟调整子程序===============
MM_KEY:
LCALL EY2
LCALL DIS1
JNB P3.2,MM_KEY
MMA:
LCALL EY2
JNB P3.3,M_ADDKEY
JNB P3.4,M_DECKEY
LCALL DIS1
JNB P3.2,HH_KEY
JNB P3.5,KEY4
LJMP MMA
KEY4:
LJMP KEY1
;============分加1====================
M_ADDKEY:
lcall ey2
LCALL DIS1
JNB P3.3,M_ADDKEY
INC MM
MOV A,MM
CJNE A,#60,MM_KEY1
MOV MM,#00H
MM_KEY1:
LJMP MMA
;===========分减1====================
M_DECKEY:
lcall ey2
LCALL DIS1
JNB P3.4,M_DECKEY
MOV A,MM
CJNE A,#00,MM_KEY2
MOV MM,#60
MM_KEY2:
DEC MM
LJMP MM_KEY1
;=======时钟调整子程序==============
HH_KEY:
LCALL EY3
LCALL DIS1
JNB P3.2,HH_KEY
HHA:
LCALL EY3
JNB P3.3,H_ADDKEY
JNB P3.4,H_DECKEY
LCALL DIS1
JNB P3.2,SSB
JNB P3.5,KEY5
LJMP HHA
KEY5:
LJMP KEY1
;==========时加1==================
H_ADDKEY:
lcall ey3
LCALL DIS1
JNB P3.3,H_ADDKEY
INC HH
MOV A,HH
CJNE A,#24,HH_KEY1
MOV HH,#00H
HH_KEY1:
LJMP HHA
;==========时减1=================
H_DECKEY:
lcall ey3
LCALL DIS1
JNB P3.4,H_DECKEY
MOV A,HH
CJNE A,#00,HH_KEY2
MOV HH,#24
HH_KEY2:
DEC HH
LJMP HH_KEY1
SSB:
LJMP SS_KEY
DISP:
MOVC A,@A+DPTR
MOV LCD,A
LCALL WRR
RET
;========================
LCDSET:
MOV LCD,#38H
LCALL LCDWC
MOV LCD,#06H
LCALL LCDWC
MOV LCD,#0CH
LCALL LCDWC
MOV LCD,#0C4H
LCALL LCDWC
RET
;============================
LCDWC:
CLR RS
CLR RW
CLR E
LCALL LCDBF
SETB E
RET
;===========================
WRR:
SETB RS
CLR RW
CLR E
LCALL LCDBF
SETB E
RET
;================================
LCDBF:
MOV LCD,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB LCD.7,LCDBF
RET
;================================
EYY:
MOV LCD,#80H
LCALL LCDWC
MOV DPTR,#TAB2
MOV R2,#16
MOV R1,#00H
EYY1:
MOV A,R1
LCALL DISP
INC R1
DJNZ R2,EYY1
RET
;==========================
EY1:
MOV LCD,#0C4H
LCALL LCDWC
MOV R4,#02
EY11:
LCALL HIND
DJNZ R4,EY11
LCALL LOOP1
MOV A,S_BIT
LCALL DISP
MOV A,SS_BIT
LCALL DISP
RET
;==========================
EY2:
MOV LCD,#0C4H
LCALL LCDWC
LCALL HIND
LCALL LOOP1
MOV A,M_BIT
LCALL DISP
MOV A,MM_BIT
LCALL DISP
LCALL HIND
RET
;=======================
EY3:
MOV LCD,#0C4H
LCALL LCDWC
LCALL LOOP1
MOV A,H_BIT
LCALL DISP
MOV A,HH_BIT
LCALL DISP
MOV R4,#02
EY33:
LCALL HIND
DJNZ R4,EY33
RET
;==============================
HIND:
MOV R3,#3
HIND1:
MOV A,#' '
MOV LCD,A
LCALL WRR
DJNZ R3,HIND1
RET
;==========延时程序=============
DIS1:
MOV R6,#20
DJNZ R6,$
RET
;=======段码表=====================
TAB1:
DB 30H,31h,32H,33H,34H,35H,36H,37H,38H,39H
TAB2: DB "TIM"
;********************************************************************
; 读取数据表并将数据写入子程序
;********************************************************************
WRITE1:
MOVC A,@A+DPTR ;查表
LCALL WR_DATA
RET
;********************************************************************
; 写数据子程序
;********************************************************************
WR_DATA:
MOV P0,A
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL BUSY ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
RET
;********************************************************************
; 写命令子程序
;********************************************************************
WR_CODE:
CLR RS ;写入控制命令的子程序
CLR RW
CLR E
LCALL BUSY
SETB E
RET
;********************************************************************
; 判断忙碌子程序
;********************************************************************
BUSY:
MOV P0,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P0.7,BUSY ;如果P1.7为高电平表示忙就循环等待
RET
;****************** HEX转BCD碼 ****************************
hex_BCD:
mov a,hex
add a,#00h
da a
ret
;***************BCD碼转dec*********************************
bcd_dec:
mov a,bcd
mov b,#16
div ab ;a中放置十位,b中放置个位
swap a
add a,b
ret
;***************** 温度显示 ****************************************
common:
mov scon,#50h ;串口方式1,允许接收
mov 87h,#00h ;PCON设置(将SMOD置0,使波特率不加倍)
setb tr1 ;启动计时
;********************************************************************
;**********DS18B20复位程序*****************
INIT_18B20: ;SETB DQ ;DS18B20占用的总线
;NOP
CLR P1.0 ;二极管指示用于观察调试
CLR DQ ;DS18B20占用的总线
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ;延时
SETB DQ
MOV R0,#25H
TSR2: ;JNB DQ ,TSR3 ;延时
DJNZ R0,TSR2
TSR3: SETB FLAG1 ;置标志位,表明DS18B20存在
;AJMP TSR5
;TSR4: CLR FLAG1
;LJMP TSR7
TSR5: MOV R0,#06BH ;yf延时
TSR6: DJNZ R0,TSR6
;TSR7: SETB DQ ;表明不存在
SETB P1.0 ;二极管指示用于观察调试
RET
;********************设定DS18B20暂存器设定值**************
RE_CONFIG:
JB FLAG1,RE_CONFIG1
RET
RE_CONFIG1: MOV A,#0CCH ;放跳过ROM命令
LCALL WRITE_18B20
MOV A,#4EH
LCALL WRITE_18B20 ;写暂存器命令
MOV A,#00H ;报警上限中写入00H
LCALL WRITE_18B20
MOV A,#00H ;报警下限中写入00H
LCALL WRITE_18B20
MOV A,#1FH ;选择九位温度分辨率
LCALL WRITE_18B20
RET
;*****************读转换后的温度值****************
GET_TEMPER:
SETB DQ
LCALL INIT_18B20 ;yf复位
JB FLAG1,TSS2 ;yf若FLAG1位为1则跳转
RET ;若不存在则返回
TSS2: MOV A,#033H ;读ROM
LCALL WRITE_18B20
MOV A,#44H ;发出温度转换命令
LCALL WRITE_18B20
LCALL DISPLAY ;延时
LCALL INIT_18B20
MOV A,#0CCH ;跳过ROM
LCALL WRITE_18B20
MOV A,#0BEH ;发出读温度换命令
LCALL WRITE_18B20
LCALL READ2_18B20 ;读两个字节的温度
RET
;***************写DS18B20命令程序************
WRITE_18B20:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6 ;yf延时
DJNZ R3,$
RRC A ;yf带进位右移
MOV DQ,C ;yf象总线写一位数
MOV R3,#23 ;yf延时
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1 ;yf判断8位是否发完
SETB DQ
RET
;***********读18B20程序,读出两个字节的温度*********
READ2_18B20:CLR P1.1 ;二极管指示用于观察调试yf
MOV R4,#2 ;给2字节数,低位存在29 H,高位存在28H
MOV R1,#29H ;yf给地址初值
RE00: MOV R2,#8 ;yf给R2给一字节循环数
RE01: CLR C
SETB C
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7 ;yf延时
DJNZ R3,$
MOV C,DQ ;yf将读得的数传给C
MOV R3,#23 ;yf延时
DJNZ R3,$
RRC A ;yf右移一位,移位8次后A中的值即为所采得的数值
DJNZ R2,RE01 ;yf一字节数采集够
MOV @R1,A ;yf将累加器值存入间接地址
mov sbuf,a ;将29H单元采集的数据传到串口用于调试yf
jnb ti,$
clr ti
DEC R1 ;yf地址减1
DJNZ R4,RE00 ;yf第一字节采集完后采集第二字节
SETB P1.1 ;二极管指示用于观察调试yf
RET
;************读出的温度进行数据转换**************
CHANGE: MOV A,29H
MOV C,28H.0 ;将28H中的最低位移入C
RRC A
MOV C,28H.1
RRC A
MOV C,28H.2
RRC A
MOV C,28H.3
RRC A
MOV 29H,A
LCALL DISPLAY ;调用数码管显示子程序
LJMP MAIN
;*******************DISPLAY******
DISPLAY: mov a,29H ;将29H中的十六进制数转换成10进制
mov b,#10 ;待转换的数/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#TAB ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示1000次
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.5 ;开个位显示
acall d1ms ;显示1ms
setb p2.5
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.4 ;开十位显示
acall d1ms ;显示1ms
setb p2.4
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
ret
;============================================
;测量低电平时间,50US采样一次,R7加1一次,比如低电平时间为9000US,测得R7的结果为180(0B4H)
;OUTPUT: R7
GET_LOW:
MOV R7,#00H
GET_LOW_NEXT:
MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,
DJNZ R6,$ ;这条指令执行需要2个机器周期
JB IRR,GET_LOW_RTN ;接收头为高电平,结束测量
INC R7
MOV A,R7
JNZ GET_LOW_NEXT ;看R7是否有溢出
GET_LOW_RTN:
RET
;============================================
;测量高电平时间,50US采样一次,R7加1一次,比如高电平时间为4500US,测得R7的结果为90
;OUTPUT: R7
GET_HIGH:
MOV R7,#00H
GET_HIGH_NEXT:
MOV R6,#20 ;在晶振为11.0592M时,延50US需要46个机器周期,
DJNZ R6,$ ;这条指令执行需要2个机器周期
JNB IRR,GET_HIGH_RTN ;接收头为低电平,结束测量
INC R7
MOV A,R7
GET_HIGH_RTN:
RET
;============================================
;============================================
DELAY_MS:
MOV R6,#250
DELAY_MS_NEXT:
NOP
NOP
DJNZ R6,DELAY_MS_NEXT
DJNZ R7,DELAY_MS
RET
;============================================
;INPUT: R7
DELAY:
DJNZ R7,$
RET
;============================================
;向LCD写一个命令字节
;INPUT: ACC
SEND_COMMAND_BYTE:
CLR RS
CLR RW
MOV P0,A
SETB E
NOP
NOP
NOP
NOP
NOP
NOP
CLR E
MOV R7,#100
ACALL DELAY
RET
;===============================================
;向LCD写一个数据字节
;INPUT: ACC
SEND_DATA_BYTE:
SETB RS
CLR RW
MOV P0,A
SETB E
NOP
NOP
NOP
NOP
NOP
NOP
CLR E
MOV R7,#100
ACALL DELAY
RET
;===================================================
;初始化LCD
INIT_LCD:
MOV A,#30H
ACALL SEND_COMMAND_BYTE
ACALL SEND_COMMAND_BYTE
ACALL SEND_COMMAND_BYTE
MOV A,#38H ;设置工作方式
ACALL SEND_COMMAND_BYTE
MOV A,#0CH ;显示状态设置
ACALL SEND_COMMAND_BYTE
MOV A,#01H ;清屏
ACALL SEND_COMMAND_BYTE
MOV A,#06H ;输入方式设置
ACALL SEND_COMMAND_BYTE
RET
;===================================================
;在第一行显示
;INPUT: DPTR指向要显示的
DISPLAY_LINE1:
MOV A,#080H
DISPLAY_LINE1_A:
ACALL SEND_COMMAND_BYTE ;设置DDRAM地址
MOV R6,#20
DISPLAY_LINE1_NEXT:
CLR A
MOVC A,@A+DPTR
ACALL SEND_DATA_BYTE
INC DPTR
DJNZ R6,DISPLAY_LINE1_NEXT
MOV R7,#100
ACALL DELAY
RET
;===================================================
;在第二行显示
;INPUT: DPTR指向要显示的内容
DISPLAY_LINE2:
MOV A,#0C0H
AJMP DISPLAY_LINE1_A
;===================================================
END
4、程序说明:
此程序是一个比较简单和基本的程序,没有太多功能,可以实现:用液晶屏显示时间、日期、星期和温度,时间、日期可调,且可以设置闹钟。
难点:对汇编程序不是太熟悉,因为设计模块稍微有点多,调用的时候总是弄混,而且,各个地址和寄存器用的比较混乱。