📄 ex3-10.lst
字号:
A51 MACRO ASSEMBLER EX3_10 06/23/2007 17:37:30 PAGE 1
MACRO ASSEMBLER A51 V7.09
OBJECT MODULE PLACED IN ex3-10.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE ex3-10.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;--------------程序信息-----------------
2 ;文件名 : ex3-10.asm
3 ;版本 : 1.0
4 ;作者 :
5 ;修改时间 :
6
7 ;--------------程序说明------------------
8 ;CHAP 3.10 电子万年历实例
9
10 ;-----------常量和变量声明---------------
11
0090 12 KEYIN EQU P1; 预定义宏变量,键盘输入口
00B0 13 E EQU P3.0; LCD使能端
00B1 14 RW EQU P3.1; LCD读写端
00B3 15 RS EQU P3.3; LCD 数据命令选择端
00A0 16 LCDP EQU P2; LCD 数据端口
0021 17 SETF BIT 21H; SET标识位
0022 18 ALARMF BIT 22H; ALARM标识位
00A7 19 BF EQU LCDP.7; LCD忙标志位
0000 20 LINEF BIT 00H; 换行标志位
21
22 ;--------------预定义--------------------
23
0000 24 ORG 0000H
0000 020003 25 LJMP START
26
27 ;------------中断入口地址分配------------
28 ;ORG 0003H
29 ;LJMP INT0PRG
30 ;ORG 000BH
31 ;LJMP INT1PRG
32 ;ORG 0013H;
33 ;LJMP
34 ;ORG 0030H
35
0003 36 START:
0003 7400 37 MOV A,#00H; A,R1,R2寄存器清零
0005 F8 38 MOV R0,A;
0006 F9 39 MOV R1,A;
0007 C221 40 CLR SETF; 标识位清除
0009 C222 41 CLR ALARMF;
000B 1200A3 42 INIT: LCALL LCDINIT; LCD初始化
000E 12012F 43 LCALL RTCINIT; 实时时钟初始化
44
45 ;--------------初始化子程序--------------
0011 856081 46 MOV SP,60H;
47 ;--------------主程序--------------------
0014 48 MAIN:
0014 120132 49 LCALL KEYBOARD; 扫描键盘,获取键值
0017 E8 50 MOV A,R0;
0018 B40C53 51 CJNE A,#0CH,MAINEND; 判断是否SET键按下
001B 1201BB 52 LCALL LCDSETDISP; 显示SET的预先显示字符
001E A900 53 MOV R1,00H; 键入字符计数
0020 AA40 54 MOV R2,40H; 单片机内部存储地址
0022 120132 55 SETPRG:LCALL KEYBOARD; 扫描键盘
0025 D221 56 SETB SETF;
0027 E8 57 MOV A,R0; 读出键值
0028 F540 58 MOV 40H,A;
A51 MACRO ASSEMBLER EX3_10 06/23/2007 17:37:30 PAGE 2
002A 900201 59 MOV DPTR,#LCDPOSDB; LCD内部DDRAM地址
002D E9 60 MOV A,R1;
002E 93 61 MOVC A,@A+DPTR; 获取当前键入值显示地址
002F F5A0 62 MOV LCDP,A; 写地址命令
0031 1200CF 63 LCALL WINSTR;
0034 90020F 64 MOV DPTR,#NUM; 根据键值读取相应显示字符编码
0037 93 65 MOVC A,@A+DPTR;
0038 F5A0 66 MOV LCDP,A; 写入显示数字
003A 1200DA 67 LCALL WDATA;
003D 09 68 INC R1; 计数器增一
003E 0A 69 INC R2;
003F E9 70 MOV A,R1;
0040 B90EDF 71 CJNE R1,#0EH,SETPRG; 判断输入是否完备
72
0043 B40D28 73 CJNE A,#0DH,MAINEND; 判断是否ALARM键按下
0046 120131 74 LCALL LCDALARMDISP; ALARM键按下的处理程序与SET键基本一致,不再解释
0049 A900 75 MOV R1,00H;
004B AA50 76 MOV R2,50H;
004D 120132 77 ALARMPRG:LCALL KEYBOARD; 扫描键盘
0050 D222 78 SETB ALARMF;
0052 E8 79 MOV A,R0;
0053 F550 80 MOV 50H,A;
0055 900209 81 MOV DPTR,#ALARMPOSDB;
0058 E9 82 MOV A,R1;
0059 93 83 MOVC A,@A+DPTR;
005A F5A0 84 MOV LCDP,A;
005C 1200CF 85 LCALL WINSTR;
005F 90020F 86 MOV DPTR,#NUM;
0062 93 87 MOVC A,@A+DPTR;
0063 F5A0 88 MOV LCDP,A;
0065 1200DA 89 LCALL WDATA;
0068 09 90 INC R1;
0069 0A 91 INC R2;
006A E9 92 MOV A,R1;
006B B906DF 93 CJNE R1,#06H,ALARMPRG;
006E 94 MAINEND:
006E 120130 95 LCALL RTCREAD;
0071 120077 96 LCALL DISPLAY;
97
98
0074 020014 99 LJMP MAIN
100
101
102 ;----------------子程序------------------
103
104 ;---------------------------------
105 ; 万年历补充和更改子程序部分
106 ;---------------------------------
0077 107 DISPLAY: ;显示更新子程序,RTCREAD 将秒,分,时,送30H, 31H, 32H
108 ;星期,日,月,年送33H, 34H, 35H, 36H
0077 E532 109 MOV A,32H; 转化RTC读出数据为可显示的分位数据
0079 D4 110 DA A; 十六进制转化为BCD编码
007A FC 111 MOV R4,A;
007B 540F 112 ANL A,#0FH; 获取时钟"时"单位的个位
007D F54A 113 MOV 4AH,A; 将个位存入更新函数个位刷新读取地址
007F EC 114 MOV A,R4;
0080 C4 115 SWAP A;
0081 540F 116 ANL A,#0FH; 获取时钟"时"单位的十位
0083 F549 117 MOV 49H,A;
118 ;同样从RTCREAD获取的时间信息中,依次转换存入相应单
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -