📄 lcd2401.lst
字号:
A51 MACRO ASSEMBLER LCD2401 01/05/2007 14:53:27 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN LCD2401.OBJ
ASSEMBLER INVOKED BY: C:\Keil 7.06\C51\BIN\A51.EXE LCD2401.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;-------------------------------
2 ;文件名称:LCD2401.ASM
3 ;程序功能:秒表
4 ;-------------------------------
5 ; 定义计时单元地址
0030 6 HOUR EQU 30H ;存放小时变量
0031 7 MIN EQU 31H ;存放分钟变量
0032 8 SEC EQU 32H ;存放秒钟变量
0033 9 DEDA EQU 33H ;存放10ms计数值
10 ;―――――――――――――――
11 ; 按键端口状况值
0034 12 K1_N EQU 34H ;存放按键当前端口状况值
0035 13 K1_P EQU 35H ;存放按键上次端口状况值
0037 14 K1_C EQU 37H ;存放按键计数单元
0036 15 X EQU 36H ;LCD 地址变量
16 ;―――――――――――――――
17 ; 按键引脚定义
00B3 18 K1 EQU P3.3 ;按键1引脚定义
00B4 19 K2 EQU P3.4 ;按键2引脚定义
20 ; 喇叭引脚
00A4 21 SPK EQU P2.4 ;
22 ;―――――――――――――――
23 ;LCD 引脚定义
00B5 24 RS EQU P3.5 ;LCD RS引脚定义
00B6 25 RW EQU P3.6 ;LCD RW引脚定义
00B7 26 E EQU P3.7 ;LCD RS引脚定义
27 ;―――――――――――――――
0000 28 ORG 0000H ;程序由地址0开始执行
0000 800B 29 JMP MAIN
000B 30 ORG 0BH ;定时器0中断地址设置
000B 803E 31 JMP T0_INT
32 ;――――――――――――― 主程序 ――――――――――――――
000D 33 MAIN: ;开始
000D 758160 34 MOV SP,#60H ;堆栈指针指向60H
0010 C2B7 35 CLR E ;E=0,禁止读/写LCM
0012 11DF 36 ACALL SET_LCD ;调LCD控制子程序
0014 112C 37 ACALL INIT ;初始化变量
0016 753501 38 MOV K1_P,#01H ;按键上次端口设置1
0019 113E 39 ACALL INIT_TIMER ;初始化定时器
001B 3142 40 ACALL MEU ;调用工作菜单子程序
001D 31BC 41 LOOP:ACALL CONV ;时间计数处理
001F 1187 42 ACALL LOOP1 ;调用清零键子程序
0021 118F 43 ACALL KEY ;判断是否有键按下
0023 60F8 44 JZ LOOP ;无键按下转LOOP
0025 853435 45 MOV K1_P,K1_N ;交换数据
0028 119C 46 ACALL KEY0 ;调用按键功能子程序
002A 80F1 47 JMP LOOP ;跳LOOP处循环
48
49 ;―――――――――――――――――――――――――――――――
50 ; 初始变量清零子程序
002C 51 INIT: ;初始变量清零
002C E4 52 CLR A ;A清为零
002D F537 53 MOV K1_C,A ;K1_C 初始为0
002F F533 54 MOV DEDA,A ;DEDA初始为0
0031 F532 55 MOV SEC,A ;SEC初始为0
0033 F531 56 MOV MIN,A ;MIN初始为0
0035 F530 57 MOV HOUR,A ;HOUR初始为0
0037 F534 58 MOV K1_N,A ;K1_N初始为0
A51 MACRO ASSEMBLER LCD2401 01/05/2007 14:53:27 PAGE 2
0039 F535 59 MOV K1_P,A ;K1_P初始为0
003B C28C 60 CLR TR0 ;启动中断
003D 22 61 RET
62 ;―――――――――――――――――――――
63 ;定时器初始化设置子程序
003E 64 INIT_TIMER: ;定时器初始化
003E 758901 65 MOV TMOD,#00000001B ;定时器0模式1
0041 75A882 66 MOV IE, #10000010B ;开通中断
0044 758AF0 67 MOV TL0,#LOW(65536-10000);定时初值装入低位
0047 758CD8 68 MOV TH0,#HIGH(65536-10000);定时初值装入高位
004A 22 69 RET
70 ;―――――――――――――――――――――
71 ;中断服务程序
004B 72 T0_INT: ;定时器T0中断程序
004B C0E0 73 PUSH ACC ;入栈保护
004D 758AF0 74 MOV TL0,#LOW(65536-10000) ;重加载
0050 758CD8 75 MOV TH0,#HIGH(65536-10000)
0053 0533 76 INC DEDA
0055 E533 77 MOV A,DEDA ;10ms 计数值加1
0057 B4642A 78 CJNE A,#100,TT
005A 753300 79 MOV DEDA,#0
005D 0532 80 INC SEC ;秒加1
005F E532 81 MOV A,SEC
0061 B43C20 82 CJNE A,#60,TT
0064 0531 83 INC MIN ;分加1
0066 753200 84 MOV SEC,#0
0069 E531 85 MOV A,MIN
006B B43C16 86 CJNE A,#60,TT
006E 0530 87 INC HOUR ;时加1
0070 753100 88 MOV MIN,#0
0073 E530 89 MOV A,HOUR
0075 B4180C 90 CJNE A,#24,TT
0078 753300 91 MOV DEDA,#0
007B 753200 92 MOV SEC,#0 ;秒、分、时单元清0
007E 753100 93 MOV MIN,#0
0081 753000 94 MOV HOUR,#0
0084 D0E0 95 TT: POP ACC ;出栈
0086 32 96 RETI ; 中断程序返回
97
98 ;―――――――――――――――――――――
99 ;判断键是否按下子程序
0087 100 LOOP1:
0087 20B404 101 JB K2,LOOP2 ;判清零键是否按下
008A 5119 102 ACALL SPK_BZ
008C 010D 103 JMP MAIN ;跳转主程序处
008E 22 104 LOOP2: RET
105 ;-----------------------------
106 ; 判断K1键是否按下
008F 107 KEY:
008F E4 108 CLR A ;A清零
0090 F534 109 MOV K1_N,A ;A值送入K1_N
0092 A2B3 110 MOV C,K1 ;K1值送入C
0094 33 111 RLC A ;同进位标志左移一位
0095 4234 112 ORL K1_N,A ;两个位作逻辑OR运算
0097 E534 113 MOV A,K1_N ;K1_N值送入A
0099 6535 114 XRL A,K1_P ;有键按下,A 中内容不为零
009B 22 115 RET
116
117 ;―――――――――――――――――――――
118 ;功能键子程序
119 ;K1键第一次按功能子程序
009C 120 KEY0:
009C E535 121 MOV A, K1_P ;K1_P值送入A
009E 20E02F 122 JB ACC.0,KEY3 ;A的0位是1,转KEY3
00A1 0537 123 INC K1_C ;K1_C加1
00A3 E537 124 MOV A, K1_C ;K1_C值送入A
A51 MACRO ASSEMBLER LCD2401 01/05/2007 14:53:27 PAGE 3
00A5 B4010A 125 CJNE A,#01H,KEY1 ;K1键是否第一次按?
00A8 90015B 126 MOV DPTR,#MENU1 ;是,存入MENU1信息
00AB 7401 127 MOV A,#1 ;设置第一行显示
00AD 319F 128 CALL LCD_PRINT ;调用显示字符子程序
00AF D28C 129 SETB TR0 ;启动中断
00B1 22 130 RET
131 ;――――――――――――――
132 ;K1键第二次按功能子程序
00B2 133 KEY1:
00B2 E537 134 MOV A,K1_C ;K1_C值送入A
00B4 B4020A 135 CJNE A,#02H,KEY2 ;K1键是否第二次按?
00B7 90016C 136 MOV DPTR,#MENU2 ;是,存入MENU2信息
00BA 7401 137 MOV A,#1 ;设置第一行显示
00BC 319F 138 CALL LCD_PRINT ;调用显示字符子程序
00BE C28C 139 CLR TR0 ;停止中断
00C0 22 140 RET ;
141 ;――――――――――――――
142 ;K1键第三次按功能子程序
00C1 143 KEY2:
00C1 E537 144 MOV A, K1_C ;K1_C值送入A
00C3 B4030A 145 CJNE A, #03H,KEY3 ;K1键是否第三次按?
00C6 90017D 146 MOV DPTR,#MENU3 ;是,存入MENU3信息
00C9 7401 147 MOV A, #1 ;设置第一行显示
00CB 319F 148 CALL LCD_PRINT ;调用显示字符子程序
00CD D28C 149 SETB TR0 ;启动中断
00CF 22 150 RET
151 ;――――――――――――――
152 ;K1键第四按功能子程序
00D0 153 KEY3:
00D0 E537 154 MOV A,K1_C ;K1_C值送入A
00D2 B40409 155 CJNE A,#04H,KEY4 ;K1键是否第四次按?
00D5 90018E 156 MOV DPTR,#MENU4 ;是,存入MENU4信息
00D8 7401 157 MOV A,#1 ;设置第一行显示
00DA 319F 158 CALL LCD_PRINT ;调用显示字符子程序
00DC C28C 159 CLR TR0 ;启动中断
00DE 160 KEY4:
00DE 22 161 RET ;子程序返回
162
163 ;――――――――――――― LCD显示 ――――――――――――――
164 ; LCD控制子程序
00DF 165 SET_LCD: ;
00DF C2B7 166 CLR E
00E1 310A 167 ACALL INIT_LCD ;初始化 LCD
00E3 7D0A 168 MOV R5,#10
00E5 512C 169 ACALL DELAY
00E7 9000F6 170 MOV DPTR,#LMESS1 ;指针指到显示消息1
00EA 7401 171 MOV A,#1 ;显示在第一行
00EC 319F 172 ACALL LCD_PRINT ;调用显示字符子程序
00EE 900100 173 MOV DPTR,#LMESS2 ;指针指到显示消息2
00F1 7402 174 MOV A,#2 ;显示在第二行
00F3 319F 175 ACALL LCD_PRINT ;调用显示字符子程序
00F5 22 176 RET
177 ;―――――――――――――――
00F6 20202020 178 LMESS1: DB " ",0 ;LCD 第一行显示消息
00FA 20202020
00FE 2000
0100 54494D45 179 LMESS2: DB "TIME ",0 ;LCD 第二行显示消息
0104 20202020
0108 2000
180 ;―――――――――――――――
181
182 ;LCD初始化子程序
010A 183 INIT_LCD:
010A 7438 184 MOV A,#38H ;设置8位、2行、5x7点阵
010C 311D 185 ACALL WR_COMM ; 调用写指令子程序
010E 5137 186 ACALL DELAY1 ;调用延时子程序
A51 MACRO ASSEMBLER LCD2401 01/05/2007 14:53:27 PAGE 4
0110 740C 187 MOV A,#0CH ;开显示,光标不闪烁
0112 311D 188 ACALL WR_COMM ;调用写指令子程序 ;
0114 5137 189 ACALL DELAY1 ;调用延时子程序
0116 7401 190 MOV A,#01H ;清除 LCD 显示屏
0118 311D 191 ACALL WR_COMM ;调用写指令子程序 ;
011A 5137 192 ACALL DELAY1 ;调用延时子程序
011C 22 193 RET
194
195 ;―――――――――――――――――――――
196 ;写指令子程序
011D 197 WR_COMM:
011D F590 198 MOV P1,A
011F C2B5 199 CLR RS ;RS=0,选择指令寄存器
0121 C2B6 200 CLR RW ;RW=0,选择写模式
0123 D2B7 201 SETB E ;E=1,允许读/写LCM
0125 5137 202 ACALL DELAY1 ;调用延时子程序
0127 C2B7 203 CLR E ;E=0,禁止读/写LCM
0129 22 204 RET
205 ;――――――――――――――――――――
206
207 ;写数据子程序
012A 208 WR_DATA:
012A F590 209 MOV P1,A
012C D2B5 210 SETB RS ;RS=1,选择数据寄存器
012E C2B6 211 CLR RW ;RW=0,选择写模式
0130 D2B7 212 SETB E ;E=1,允许读/写LCM
0132 5140 213 ACALL DE ;调用延时子程序
0134 C2B7 214 CLR E ;E=0,禁止读/写LCM
0136 5140 215 ACALL DE ;调用延时子程序
0138 22 216 RET
217
218 ;―――――――――――――――――――――
219 ;清除该行 LCD 的字符
0139 7818 220 CLR_LINE: MOV R0,#24
013B 7420 221 CL1: MOV A,#' '
013D 312A 222 ACALL WR_DATA
013F D8FA 223 DJNZ R0,CL1
0141 22 224 RET
225
226 ;―――――――――――――――――――――
227 ;LCD 存入工作菜单
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -