没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
-=-=-=-=-=-=-=-=-=-=-=-= SOURCE CODE =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;;
;; 显示程序符号定义
;;
COM EQU 45H
DAT EQU 46H
CW_ADD EQU 5FFCH
CR_ADD EQU 5FFDH
DW_ADD EQU 5FFEH
DR_ADD EQU 5FFFH
; 子程序说明:
; 寄存器工作组使用
; WAITKEY, 00
; KEYPRESSED, MAKENUM, RES2RAW 等子程序, 01
; FLOATING LIB, 10
; CALCULATE 使用 01, 当调用浮点程序库时 10
; 显示子程序,11
; ======================================================================
; 工作区使用注意:
; -=-= 1. 位寻址区 =-=-=-
; 20H-21H 两个字用作位状态(位地址 00H-0FH)
; 23H-27H ; NOT USE! ESP. 23H
; 28H-2FH 为显示区域与记录输入数字所用,RAWIN
PNTB BIT 10H ; 小数点位指示(位地址, POINT BIT)
POSB BIT 11H ; 位置位,POSB=1 表示创建 BCD 低位,POSB=0 表示创建 BCD 高位
DPB BIT 12H ; 大于 1 的浮点数 MAKENUM 时,指示小数点是否已经加入
; 04H-08H, ARBITRARY USE
BYTE2 BIT 14H ; SEE BYTE2USAGE (CTRL+F, FIND IT.)
; STAT 保存整个计算器的运行状态!
; BIT ASSIGNMENT:
; .7: ERROR
; .6: FLOAT
; .5 & .4: OPERATOR
; VALUE MEANING:
; 00: ADD
; 01: SUB
; 10: MUL
; 11: DIV
; .3: OPERATOR PRESSED
; .2: CONSTRUCTING NUM2
; .1: CONSTRUCTING NUM1
; .0: EQUAL SIGN PRESSED
STAT EQU 20H
DCOUNT EQU 21H ; 数字位数计数(DIGIT COUNT),只是 RAWIN 中有效字节
INPUT EQU 2AH ; 键盘输入暂存
RAWPTR EQU 2BH ; 显示缓冲区指针
NUMPTR EQU 2CH ; 当前组建数字的指针
TEMP1 EQU 2DH ; 临时存储,一般用于临时保存 R0, R1
TEMP2 EQU 2EH ; 以切换寄存器组, UNUNSED... 07.25.NIGHT
; -=-= 2. IRAM =-=-
; 30H-33H 为第一个操作数
; 34H-37H 为第二个操作数
; 38H-3FH 为显示区域
; 48H-4FH 为临时存储区域
; 结果则存储在第一个操作数位置
NUM1 EQU 30H
NUM2 EQU 34H
RAWIN EQU 38H
TEMP EQU 48H
; -=-=-= 3. REGISTERS =-=-=-
; 键盘扫描使用寄存器组 0,浮点程序使用寄存器组 2
; 其余数字组合部分用寄存器组 1
; 测试程序使用寄存器组 3
; ASCII TABLE
; '.' -> 2EH
; '+' -> 2BH
; '-' -> 2DH
; '*' -> 2AH
; '/' -> 2FH
; '=' -> 3DH
;////////////////////////////////////////////////////////////////////
;///
;/// T H E [ M A I N ] P R O G R A M
;/// ZEROX@2005.7.14
;////////////////////////////////////////////////////////////////////
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
; 全局初始化
MOV SP, #60H ; 堆栈
MOV IE, #00H ; 禁止所有中断
; 寄存器组 00
CLR RS1
CLR RS0
; 工作区 IRAM(20H-5FH)默认全为 0
INIT20TO5F:
MOV R0, #20H ; START AT 20H
MOV R7, #40H ; 64 BYTES TO ZERO
LOOP20TO5F:
MOV @R0, #00H
INC R0
DJNZ R7, LOOP20TO5F
; ---------------------------------
SETB STAT.0 ; 初始状态为等号状态
MOV R7, #00H
MOV SCON, #00H ; 串行工作方式 0
; -------------------------------------
;; DISPLAY INIT
; -------------------------------------
LCALL LCDINIT
MOV COM,#06H
LCALL PR1
MOV COM,#0C0H
LCALL PR1
MAIN_LOOP:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 键 盘 输 入
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 获取键盘输入,使用寄存器组 00
CLR RS1
CLR RS0
; 获取输入
MOV A, #0F0H
WAITKEY:
NOP
CJNE A, #0F0H, WAITKEY_OK
LCALL KEY
SJMP WAITKEY
WAITKEY_OK:
MOV A, R7
MOV INPUT, A ; 保存键盘输入到 INPUT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 按键响应(内部处理)
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 处理键盘输入,使用寄存器组 01
CLR RS1
SETB RS0
LCALL KEYPRESSED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 显 示
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LCALL DISPLAY
SJMP MAIN_LOOP
; ========================================================
; ==
; == S U B R O U T I N E S
; ==
; ========================================================
KEYPRESSED:
; 键盘输入保存在 A 中,同时也保存在 INPUT 中
ANL A, #0F0H ; 屏闭低 4 位字节
JNZ NONDIGIT ; 高位非零,不是数字
; =========================================
; 按键为数字
; 否则按下的是数字,添加到显示缓冲区
MOV A, INPUT ; 取回数字,高位已经是 0
; 如果之前处于“等号”状态,则此为 NUM1
JB STAT.0, NEWNUM1
; 如果之前处于运算符状态,则此为 NUM2
JB STAT.3, NEWNUM2
; 如果处于第一个数字状态
JB STAT.1, INNUM1
; 如果处于第二个数字状态
JB STAT.2, INNUM2
; 否则出错!!
SETB STAT.7 ; ERROR BIT
RET ; KEYPRESSED 直接结束
; --------------------------
NEWNUM1:
ANL STAT, #0F0H ; 操作状态清零(低 4 位)
SETB STAT.1 ; 计算器状态改为 NUM1
; 同时清除浮点运算状态
CLR STAT.6 ; STAT.6 -> FLOATING POINT
SJMP NEWNUM
NEWNUM2:
ANL STAT, #0F0H ; 操作状态清零(低 4 位)
SETB STAT.2 ; 计算器状态改为 NUM2
SJMP NEWNUM
NEWNUM:
; 准备开始一个新的操作数,首先清除显示缓冲区
MOV RAWPTR, #RAWIN ; 指向开始
; 清除小数点标志位
CLR PNTB
MOV DCOUNT, #00H ; 数字个数清零
; 判断数字是否为 0,0 则忽略
JZ IGNORE0
; 非零数字,保存
MOV RAWIN, A ; 此时 RAWPTR 单元的值,也就是地址
; 就是 RAWIN
INC RAWPTR
; 数字位数增 1
INC DCOUNT
IGNORE0:
RET
; --------------------------
INNUM1:
INNUM2:
MOV R2, DCOUNT
CJNE R2, #08H, INNUM_OK
; 数字个数已经达到最大值,忽略本次输入
RET
INNUM_OK:
MOV R0, RAWPTR ; 使用 R0 间接寻址
MOV @R0, A
INC RAWPTR
INC DCOUNT
RET
; =========================================
剩余46页未读,继续阅读
资源评论
passionSnail
- 粉丝: 460
- 资源: 7712
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功