📄 clock_lcd1.lst
字号:
A51 MACRO ASSEMBLER CLOCK_LCD1 08/17/2006 16:39:47 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN clock_lcd1.OBJ
ASSEMBLER INVOKED BY: D:\Keil\C51\BIN\A51.EXE clock_lcd1.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;/********************************************************************
2 ; * 主 页 : HTTP://WWW.QLMCU.COM
3 ; *
4 ; * 程序功能 : 液晶显示的秒表
5 ; *
6 ; * 应用软件 : KEIL C
7 ; *
8 ; * 版 本 : KEIL 7.06
9 ; *
10 ; * 硬 件 : WS803、WS804、WS806、WS2511、WS2566、WS9600、WS9700
11 ; *
12 ; * 整理时间 : 2006-03-11
13 ; *
14 ; * 程序整理 : pingdan11
15 ; *
16 ; * 注:为了有更多实用的实验程序供大家学习,部分程序参考网上的资源,
17 ; * 在此谢谢这些无私奉献的朋友!!!
18 ; *
19 ; ********************************************************************/
20
21
22
23
24
25
26
27
000C 28 TLOW EQU 0CH ;定时器初值
00DC 29 THIGH EQU 0DCH
30
0030 31 HOUR EQU 30H
0031 32 MIN EQU 31H
0032 33 SEC EQU 32H
0033 34 SEC0 EQU 33H ;10ms计数值
0034 35 KEY_S EQU 34H ;为键当前的端口状况
0035 36 KEY_V EQU 35H ;为键上次的端口状况
0036 37 X EQU 36H ;LCD 地址变量
0037 38 KEY_C EQU 37H ;键计数单元
39
00A0 40 K1 EQU P2.0
00A1 41 K2 EQU P2.1
00A2 42 K3 EQU P2.2
00A3 43 K4 EQU P2.3
44
00B2 45 BEEP EQU P3.2
00A5 46 RS EQU P2.5 ;LCD控制端口定义
00A6 47 RW EQU P2.6
00A7 48 EN EQU P2.7
49
50 ;----------------------------------------------------
0000 51 ORG 0000H
0000 800B 52 JMP START
000B 53 ORG 0BH
000B 01CD 54 JMP T0_INT
55 ;----------------------------------------------------
000D 758160 56 START: MOV SP,#60H
0010 C2A7 57 CLR EN
0012 3159 58 CALL SET_LCD
A51 MACRO ASSEMBLER CLOCK_LCD1 08/17/2006 16:39:47 PAGE 2
0014 11AC 59 CALL INIT ;初始化变量
0016 753501 60 MOV KEY_V,#01H
0019 11C0 61 CALL INIT_TIMER ;初始化定时器
001B 5179 62 CALL MENU
001D 3124 63 LOOP: CALL CONV ;时间计数处理
001F 1132 64 CALL LOOP1
0021 117D 65 CALL SKEY ;判是否有键按下
0023 60F8 66 JZ LOOP ;无键按下转LOOP
0025 3124 67 CALL CONV
0027 117D 68 CALL SKEY
0029 60F2 69 JZ LOOP
002B 853435 70 MOV KEY_V,KEY_S ;交换数据
002E 113A 71 CALL P_KEY
0030 80EB 72 JMP LOOP
73 ;-----------------------------------------------------
0032 20A304 74 LOOP1: JB K4,LOOP2 ;判清零键是否按下
0035 5111 75 CALL BZ
0037 80D4 76 JMP START
0039 22 77 LOOP2: RET
78 ;-----------------------------------------------------
003A 79 P_KEY: ;
003A E535 80 MOV A,KEY_V
003C 20E02F 81 JB ACC.0,P_KEY3
003F 0537 82 INC KEY_C
0041 E537 83 MOV A,KEY_C ;K3键是否第一次按下?
0043 B4010A 84 CJNE A,#01H,P_KEY1
0046 900235 85 MOV DPTR,#MADJ ;显示执行信息
0049 7401 86 MOV A,#1 ;
004B 318E 87 CALL LCD_PRINT
004D D28C 88 SETB TR0 ;启动中断
004F 22 89 RET
0050 90 P_KEY1: ;K3键是否第二次按下?
0050 E537 91 MOV A,KEY_C
0052 B4020A 92 CJNE A,#02H,P_KEY2
0055 900246 93 MOV DPTR,#MADJ1 ;显示执行信息
0058 7401 94 MOV A,#1
005A 318E 95 CALL LCD_PRINT
005C C28C 96 CLR TR0 ;停止中断
005E 22 97 RET
005F 98 P_KEY2: ;K3键是否第三次按下?
005F E537 99 MOV A,KEY_C
0061 B4030A 100 CJNE A,#03H,P_KEY3
0064 900257 101 MOV DPTR,#MADJ2 ;显示执行信息
0067 7401 102 MOV A,#1
0069 318E 103 CALL LCD_PRINT
006B D28C 104 SETB TR0 ;启动中断
006D 22 105 RET
006E 106 P_KEY3: ;K3键是否第四次按下?
006E E537 107 MOV A,KEY_C
0070 B40409 108 CJNE A,#04H,P_KEY4
0073 900268 109 MOV DPTR,#MADJ3 ;显示执行信息
0076 7401 110 MOV A,#1
0078 318E 111 CALL LCD_PRINT
007A C28C 112 CLR TR0 ;启动中断
007C 22 113 P_KEY4: RET
114 ;-------------------------------------------------------
007D E4 115 SKEY: CLR A ;判是否有键按下子程序
007E F534 116 MOV KEY_S,A
0080 A2A2 117 MOV C,K3
0082 33 118 RLC A
0083 4234 119 ORL KEY_S,A
0085 E534 120 MOV A,KEY_S
0087 6535 121 XRL A,KEY_V ;有键按下,A 中内容不为零
0089 22 122 RET
123 ;--------------------------------------------------------
008A 20202020 124 LMESS1: DB " ",0 ;LCD 第一行显示消息
A51 MACRO ASSEMBLER CLOCK_LCD1 08/17/2006 16:39:47 PAGE 3
008E 20202020
0092 20202020
0096 20202020
009A 00
009B 54494D45 125 LMESS2: DB "TIME ",0 ;LCD 第二行显示消息
009F 20202020
00A3 20202020
00A7 20202020
00AB 00
126 ;--------------------------------------------------------
00AC E4 127 INIT: CLR A
00AD F537 128 MOV KEY_C,A ;初始化控制变量
00AF F533 129 MOV SEC0,A
00B1 F532 130 MOV SEC,A
00B3 F531 131 MOV MIN,A
00B5 F530 132 MOV HOUR,A
00B7 F534 133 MOV KEY_S,A
00B9 F535 134 MOV KEY_V,A
00BB D2B2 135 SETB BEEP
00BD C28C 136 CLR TR0
00BF 22 137 RET
138 ;------------------------------------------------------------
00C0 139 INIT_TIMER: ;初始化定时器接口
00C0 758901 140 MOV TMOD,#01H ;设置定时器0 工作模式为模式1
00C3 75A882 141 MOV IE, #82H ;启用定时器0 中断产生
00C6 758A0C 142 MOV TL0,#TLOW
00C9 758CDC 143 MOV TH0,#THIGH
00CC 22 144 RET
145 ;-------------------------------------------------------------
00CD 146 T0_INT:
00CD C0E0 147 PUSH ACC ;定时器0计时中断程序
00CF 758A0C 148 MOV TL0,#TLOW
00D2 758CDC 149 MOV TH0,#THIGH
00D5 0533 150 INC SEC0
00D7 E533 151 MOV A,SEC0 ;10ms 计数值加1
00D9 B4642A 152 CJNE A,#100,TT
00DC 753300 153 MOV SEC0,#0
00DF 0532 154 INC SEC ;秒加1
00E1 E532 155 MOV A,SEC
00E3 B43C20 156 CJNE A,#60,TT
00E6 0531 157 INC MIN ;分加1
00E8 753200 158 MOV SEC,#0
00EB E531 159 MOV A,MIN
00ED B43C16 160 CJNE A,#60,TT
00F0 0530 161 INC HOUR ;时加1
00F2 753100 162 MOV MIN,#0
00F5 E530 163 MOV A,HOUR
00F7 B4180C 164 CJNE A,#24,TT
00FA 753300 165 MOV SEC0,#0
00FD 753200 166 MOV SEC,#0 ;秒、分、时单元清0
0100 753100 167 MOV MIN,#0
0103 753000 168 MOV HOUR,#0
0106 D0E0 169 TT: POP ACC
0108 32 170 RETI
171 ;-------------------------------------------------------
172 ; 在第二行显示数字
173 ;-------------------------------------------------------
0109 174 SHOW_DIG2: ;在 LCD 的第二行显示数字
0109 75F00A 175 MOV B,#10 ;设置被除数
010C 84 176 DIV AB ;结果A存商数,B存余数
010D 2430 177 ADD A,#30H ;A为十位数,转换为字符
010F C0F0 178 PUSH B ;B放入堆栈暂存
0111 8536F0 179 MOV B,X ;设置 LCD 显示的位置
0114 31F0 180 CALL LCDP2 ;由 LCD 显示出来
0116 D0F0 181 POP B ;
0118 E5F0 182 MOV A,B ;B为个位数
A51 MACRO ASSEMBLER CLOCK_LCD1 08/17/2006 16:39:47 PAGE 4
011A 2430 183 ADD A,#30H ;转换为字符
011C 0536 184 INC X ;LCD 显示位置加1
011E 8536F0 185 MOV B,X ;设置 LCD 显示的位置
0121 31F0 186 CALL LCDP2 ;由 LCD 显示出来
0123 22 187 RET
188 ;-------------------------------------------
189 ;转换为 ASCII 码并显示
190 ;-------------------------------------------
0124 191 CONV:
0124 E530 192 MOV A,HOUR ;加载小时数据
0126 753605 193 MOV X,#5 ;设置位置
0129 3109 194 CALL SHOW_DIG2 ;显示数据
012B 0536 195 INC X ;
012D 743A 196 MOV A,#':' ;
012F 8536F0 197 MOV B,X ;
0132 31F0 198 CALL LCDP2 ;
0134 E531 199 MOV A,MIN ;加载分钟数据
0136 0536 200 INC X ;设置位置
0138 3109 201 CALL SHOW_DIG2 ;显示数据
013A 0536 202 INC X ;
013C 743A 203 MOV A,#':' ;
013E 8536F0 204 MOV B,X ;
0141 31F0 205 CALL LCDP2 ;
0143 E532 206 MOV A,SEC ;加载秒数数据
0145 0536 207 INC X ;设置位置
0147 3109 208 CALL SHOW_DIG2 ;显示数据
0149 0536 209 INC X ;
014B 743A 210 MOV A,#':' ;
014D 8536F0 211 MOV B,X ;
0150 31F0 212 CALL LCDP2 ;
0152 E533 213 MOV A,SEC0 ;加载秒数数据
0154 0536 214 INC X ;设置位置
0156 3109 215 CALL SHOW_DIG2
0158 22 216 RET
217 ;---------------------------------------------------------
218 ; LCD CONTROL
219 ;---------------------------------------------------------
0159 220 SET_LCD: ;对 LCD 做初始化设置及测试
0159 C2A7 221 CLR EN
015B 31CC 222 CALL INIT_LCD ;初始化 LCD
015D 7D0A 223 MOV R5,#10
015F 31FD 224 CALL DELAY
0161 90008A 225 MOV DPTR,#LMESS1 ;指针指到显示消息1
0164 7401 226 MOV A,#1 ;显示在第一行
0166 318E 227 CALL LCD_PRINT
0168 90009B 228 MOV DPTR,#LMESS2 ;指针指到显示消息2
016B 7402 229 MOV A,#2 ;显示在第二行
016D 318E 230 CALL LCD_PRINT
016F 22 231 RET
232 ;----------------------------------------------------------
0170 233 INIT_LCD1: ;LCD 控制指令初始化
0170 7438 234 MOV A,#38H ;双列显示,字形5*7点阵
0172 31E4 235 CALL WCOM ;
0174 5108 236 call delay1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -