PIC16F877A简单计算器设计报告 汇编语言 四位无符号整数加减乘除
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程名称:单片机原理与接口技术课程设计设计题目:简单计算器
院系:机电工程学院
班级:2010级电气工程及其自动化专业姓名:
学号:
指导教师:史丽萍,闫广明,张波,
张扬,王冠然
设计时间:2013年12月
一、设计方案描述与论证
我们所设计的是一个简单计算器,它具有四位数以内的整数加减乘除运算。
可以在输入错误的时候退格,也可以初始化。
在初始化的状态下可以进行关机以减少耗能。
显示使用的数码管扫描显示的方法来显示数字,所以我们每一次运算前我们都需要将个位、十位、百位和千位相结合。
我们使用的是4×4的键盘,检测的时候是进行键盘扫描来完成确定哪一个键被摁下,然后是否释放。
键盘被摁下后,先判断是什么键。
如果是数字键,则进行数的输入,首先先把百位的数值赋给千位,十位赋给百位,个位赋给十位,然后把摁下键的对应数赋给个位。
如果是算法键,则将对应的算法寄存地址赋上相应算法的值,并且在下一次输入数字时把十位、百位和千位清零以完成下一次的赋值,而这一次的值将转换为一个数储存在相应的地址中。
当按下的是退格键,则将十位赋值给个位,百位赋值给十位,千位赋值给百位然后千位清零。
当按下的是等号键的时候,将前一次储存的数取出与这一次的数进行相应的运算然后将得到的二进制数拆分为个位、十位、百位和千位然后扫描显示就可以。
复位键是使用的中断,当个位、十位、百位和千位都不为零的时候按下将会初始化计算器的所有数据,如果个位、十位、百位和千位均为零这进入休眠状态等待下一次中断的唤醒。
二、硬件设计部分
我们使用的是PIC16F877A单片机,使用四位的八段数码管,4×4的键盘和一个独立的中断键。
八段数码管我们使用的是共基极的接法,所以当给出低电平的时候导通,给出高电平的时候关断。
我们以RD端口来控制段选,分别以RB0控制a、RB1控制b、RB2控制c、RB3控制d、RB4控制e、RB5控制f、RB6控制g和RB7控制dp。
以RD1、RD2、RD3和RD4端口分别控制位选的千位、百位、十位和个位。
键盘我们使用RC端口扫描的方法来实现4×4的键盘。
其中RC0、RC1、RC2和RC3端口分别设置为输出,RC4、RC5、RC6和RC7端口设置为输入。
两组端口分别接入键盘的行和列。
RC4、RC5、RC6和RC7端口再通过10K的电阻接VCC以实现为高电平。
键盘扫描的时候,首先RC0、RC1、RC2和RC3端口均输入为低电平0,判断RC4、RC5、RC6和RC7端口是否全为高电平1,如果是则无按键被按下。
如果不全为高电平1则证明有按键被按下。
这时需要依次将RC0、RC1、RC2和RC3端口置低电平0,检测RC4、RC5、RC6和RC7端口何时有一个变为低电平0,这时可以对应出哪一个按键被按下。
中断键是单独接出的,外接电容增加其稳定性,减少被摁下是的抖动。
三、软件设计部分
主程序流程图键盘扫描子程序流程图
第0、1、2、3、4、5、6、第7号键
8、9、A号键子程序
第C、D、E、F键子程序按键释放子程序流程图加法子程序流程图减法子程序流程图
乘法子程序流程图除法子程序流程图
十进制转换二进制程序流程图二进制转换十进制程序流程图
睡眠子程序流程图中断子程序流程图
源程序:
;********************************************************************** ; * ; Filename: xxx.asm * ; Date: * ; File Version: *
; * ; Author: * ; Company: * ; * ; * ;********************************************************************** ; * ; Files required: *
; * ; *
; *
;**********************************************************************
; *
; Notes: *
; *
; *
; *
; *
;**********************************************************************
list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_ON & _CPD_OFF
;***** V ARIABLE DEFINITIONS
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
GE EQU 0x40
SHI EQU 0x41
BAI EQU 0x42
QIAN EQU 0x43
S1H EQU 0x44
S1L EQU 0x45
S2H EQU 0x46
S2L EQU 0x47
R1H EQU 0x48
R1L EQU 0x49
M1H EQU 0x4A
M1L EQU 0x4B
M2H EQU 0x4C
M2L EQU 0x4D
M3H EQU 0x4E
M3L EQU 0x4F
R2H EQU 0x50
R2L EQU 0x51
SHUH EQU 0x52
SHUL EQU 0x53
SHURUSHU EQU 0x54
SHU1H EQU 0x55
SHU1L EQU 0x56
P1H EQU 0x57
P1L EQU 0x58
FUHAO EQU 0x59
D1H EQU 0x5A
D1L EQU 0x5B
D2H EQU 0x5C
D2L EQU 0x5D
D3H EQU 0x5E
D3L EQU 0x5F
JIESHU EQU 0x60
COUNT EQU
0x61
.
ZHONG EQU 0x62
DUI1 EQU 0x63
DUI2 EQU 0x64
JIANGE EQU 0x65
;**********************************************************************
ORG 0x000 ; processor reset vector
clrf
PCLATH
; ensure page bits are cleared goto MAIN ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STA TUS,w ; move status register into W register
movwf status_temp ; save off contents of STA TUS register
; isr code can go here or be located as a call subroutine elsewhere
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
BTFSS PORTB,0
GOTO N1
MOVLW 00H
SUBWF GE
BTFSS STA TUS,Z
GOTO CLEARA
MOVLW 00H
SUBWF SHI
BTFSS STA TUS,Z
GOTO CLEARA
MOVLW 00H
SUBWF BAI
BTFSS STA TUS,Z
GOTO CLEARA
MOVLW 00H
SUBWF QIAN
BTFSS STA TUS,Z
GOTO CLEARA
INCF ZHONG
GOTO N1
CLEARA CALL CLEAR
CLRF FUHAO
CLRF ZHONG
CLRF JIESHU
N1 BCF INTCON,INTF
movf status_temp,w ; retrieve copy of STATUS register
movwf STA TUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
CHABIAO ADDWF PCL,F
RETLW 0xC0
RETLW 0xF9
RETLW 0xA4
RETLW 0xB0
RETLW 0x99
RETLW 0x92
RETLW 0x82
RETLW 0xF8
RETLW 0x80
RETLW 0x90
MAIN
; remaining code goes here
BSF STA TUS,RP0
CLRF TRISD
BSF TRISB,0
BCF TRISE,0
BCF TRISB,1
BCF TRISB,2
BCF TRISB,3
BCF TRISB,4
BCF TRISC,0
BCF TRISC,1
BCF TRISC,2
BCF TRISC,3
BSF TRISC,4
BSF TRISC,5
BSF TRISC,6
BSF TRISC,7
BCF STA TUS,RP0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
BSF PORTB,4
CLRF PORTC
BSF INTCON,INTE
BSF INTCON,GIE
BCF INTCON,INTF
CLRF ZHONG
LOOPN MOVLW 00H
MOVWF GE
MOVLW 00H
MOVWF SHI
MOVLW 00H
MOVWF BAI
MOVLW 00H
MOVWF QIAN
MOVLW 0xFF
MOVWF JIESHU
CLRF S1L
CLRF S1H
CLRF SHU1L
CLRF SHU1H
CLRF S2L
CLRF S2H
CLRF R1L
CLRF R1H
CLRF R2L
CLRF R2H
CLRF SHUH
CLRF SHUL
CLRF JIESHU
LOOP BTFSC ZHONG,0
GOTO GUAN
MOVF GE,W
CALL CHABIAO
MOVWF PORTD
BCF PORTB,4
CALL DELAY
BSF PORTB,4
MOVF SHI,W
CALL CHABIAO
MOVWF PORTD
BCF PORTB,3
CALL DELAY
BSF PORTB,3
MOVF BAI,W
CALL CHABIAO
MOVWF PORTD
BCF PORTB,2
CALL DELAY
BSF PORTB,2
MOVF QIAN,W
CALL CHABIAO
MOVWF PORTD
BCF PORTB,1
CALL DELAY
BSF PORTB,1
JIANPAN MOVLW 00H
MOVWF PORTC
MOVLW 0F0H
ANDWF PORTC,W
SUBLW 0F0H
BTFSC STATUS,Z
GOTO LOOP
CALL DELAY10
CALL DELAY10
MOVLW 00H
MOVWF PORTC
MOVLW 0F0H
ANDWF PORTC,W
SUBLW 0F0H
GOTO LOOP MOVLW 0FEH MOVWF PORTC BTFSS PORTC,4 GOTO JIAN0 BTFSS PORTC,5 GOTO JIAN1 BTFSS PORTC,6 GOTO JIAN2 BTFSS PORTC,7 GOTO JIAN3 MOVLW 0FDH MOVWF PORTC BTFSS PORTC,4 GOTO JIAN4 BTFSS PORTC,5 GOTO JIAN5 BTFSS PORTC,6 GOTO JIAN6 BTFSS PORTC,7 GOTO JIAN7 MOVLW 0FBH MOVWF PORTC BTFSS PORTC,4 GOTO JIAN8 BTFSS PORTC,5 GOTO JIAN9 BTFSS PORTC,6 GOTO JIANA BTFSS PORTC,7 GOTO JIANB MOVLW 0F7H MOVWF PORTC
GOTO JIANC
BTFSS PORTC,5
GOTO JIAND
BTFSS PORTC,6
GOTO JIANE
BTFSS PORTC,7
GOTO JIANF
GOTO LOOP
JINWEI MOVF BAI,W
MOVWF QIAN
MOVF SHI,W
MOVWF BAI
MOVF GE,W
MOVWF SHI
MOVF SHURUSHU,W
MOVWF GE
GOTO LOOP
JIAN0 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 01H
MOVWF SHURUSHU
GOTO JINWEI
JIAN1 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 02H
MOVWF SHURUSHU
GOTO JINWEI
JIAN2 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 03H
MOVWF SHURUSHU
GOTO JINWEI
JIAN3 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 00H
MOVWF SHURUSHU
GOTO JINWEI
JIAN4 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 04H
MOVWF SHURUSHU
GOTO JINWEI
JIAN5 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 05H
MOVWF SHURUSHU
GOTO JINWEI
JIAN6 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 06H
MOVWF SHURUSHU
GOTO JINWEI
JIAN7 CALL SFANG
CALL SHITOER
MOVF R1L,W
MOVWF S2L
MOVF R1H,W
MOVWF S2H
MOVF SHU1L,W
MOVWF S1L
MOVF SHU1H,W
MOVWF S1H
BTFSC FUHAO,0
CALL ADDXY
BTFSC FUHAO,1
CALL SUBXY
BTFSC FUHAO,2
CALL MPXY
BTFSC FUHAO,3
CALL DIVXY
CALL ERTOSHI BSF JIESHU,0
GOTO LOOP
JIAN8 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 07H
MOVWF SHURUSHU
GOTO JINWEI
JIAN9 CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 08H
MOVWF SHURUSHU
GOTO JINWEI
JIANA CALL SFANG
BTFSC JIESHU,0
GOTO CLEAR
MOVLW 09H
MOVWF SHURUSHU
GOTO JINWEI
JIANB CALL SFANG MOVF SHI,W
MOVWF GE
MOVF BAI,W
MOVWF SHI
MOVF QIAN,W
MOVWF BAI
CLRF QIAN
GOTO LOOP
JIANC CALL SFANG
CLRF FUHAO
BSF FUHAO,0
CALL SHITOER
MOVF R1L,W
MOVWF SHU1L
MOVF R1H,W
MOVWF SHU1H BSF JIESHU,0
GOTO LOOP JIAND CALL SFANG
CLRF FUHAO
BSF FUHAO,1
CALL SHITOER
MOVF R1L,W
MOVWF SHU1L
MOVF R1H,W
MOVWF SHU1H BSF JIESHU,0
GOTO LOOP
JIANE CALL SFANG
CLRF FUHAO
BSF FUHAO,2
CALL SHITOER
MOVF R1L,W
MOVWF SHU1L
MOVF R1H,W
MOVWF SHU1H BSF JIESHU,0
GOTO LOOP
JIANF CALL SFANG
CLRF FUHAO
BSF FUHAO,3
CALL SHITOER
MOVF R1L,W
MOVWF SHU1L
MOVF R1H,W
MOVWF SHU1H BSF JIESHU,0
GOTO LOOP
SFANG MOVLW 00H
MOVWF PORTC
MOVLW 0F0H
ANDWF PORTC,W
SUBLW 0F0h
BTFSS STA TUS,Z
GOTO SFANG
CALL DELAY10
CALL DELAY10
CALL DELAY10
MOVLW 00H
MOVWF PORTC
MOVLW 0F0H
ANDWF PORTC,W
SUBLW 0F0H
BTFSS STA TUS,Z
GOTO SFANG
RETURN
CLEAR BCF JIESHU,0
CLRF GE
CLRF SHI
CLRF BAI
CLRF QIAN
RETURN
DELAY DECFSZ 30H,F
GOTO DELAY
RETURN
DELAY1 DECFSZ 30H,F
GOTO DELAY
DECFSZ 31H,F
GOTO DELAY
RETURN
ADDXY MOVF S1L,W
ADDWF S2L
BTFSC STATUS,C
INCF S2H
MOVF S1H,W
ADDWF S2H
MOVF S2H,W
MOVWF R1H
MOVF S2L,W
MOVWF R1L
RETURN
SUBXY COMF S2L
INCF S2L
BTFSC STATUS,Z
DECF S2H
COMF S2H
CALL ADDXY
RETURN
MPXY MOVF S1L,W
MOVWF M1L
MOVF S1H,W
MOVWF M1H
MOVF S2L,W
MOVWF M2L
MOVF S2H,W
MOVF S1L,W
MOVWF M3L
MOVF S1H,W
MOVWF M3H
CLRF R1H
CLRF R2H
L2 MOVLW 00H
SUBWF M2L
BTFSS STA TUS,Z
GOTO L1
MOVLW 00H
SUBWF M2H
BTFSC STA TUS,Z
GOTO L3
L1 MOVF M1L,W
MOVWF S1L
MOVF M3L,W
MOVWF S2L
MOVF M1H,W
MOVWF S1H
MOVF M3H,W
MOVWF S2H
CALL ADDXY
MOVF R1L,W
MOVWF M1L
MOVF R1H,W
MOVWF M1H
MOVWF S1L
MOVF M2H,W
MOVWF S1H
CLRF S2H
MOVLW 01H
MOVWF S2L
CALL SUBXY
MOVF R1L,W
MOVWF M2L
MOVF R1H,W
MOVWF M2H
MOVF M1L,W
MOVWF R1L
MOVF M1H,W
MOVWF R1H
GOTO L2
L3 MOVF R1L,W
MOVWF S1L
MOVF R1H,W
MOVWF S1H
MOVF M3L,W
MOVWF S2L
MOVF M3H,W
MOVWF S2H
CAll S UBXY
RETURN
DIVXY MOVF S1L,W
MOVWF D1L
MOVF S1H,W
MOVF S2L,W
MOVWF D2L
MOVF S2H,W
MOVWF D2H
CLRF D3L
CLRF D3H
D1 MOVF D2H,W
SUBWF D1H,W
BTFSS STA TUS,C
GOTO D2
BTFSS STA TUS,Z
GOTO D3
MOVF D2L,W
SUBWF D1L,W
BTFSS STA TUS,C
GOTO D2
D3 MOVF D1L,W
MOVWF S1L
MOVF D1H,W
MOVWF S1H
MOVF D2L,W
MOVWF S2L
MOVF D2H,W
MOVWF S2H
CALL SUBXY
MOVF R1L,W
MOVWF D1L
MOVF R1H,W
MOVWF D1H
MOVF D3H,W
MOVF D3L,W
MOVWF S1L
CLRF S2H
MOVLW 01H
MOVWF S2L
CALL ADDXY
MOVF R1H,W
MOVWF D3H
MOVF R1L,W
MOVWF D3L
GOTO D1
D2 MOVF D3L,W
MOVWF R1L
MOVF D3H,W
MOVWF R1H
MOVF D1L,W
MOVWF R2L
MOVF D1H,W
MOVWF R2H
RETURN
DELAY10 MOVLW 0DH
MOVWF 20H LOOP1 MOVLW 0FFH
MOVWF 21H LOOP2 DECFSZ 21H
GOTO LOOP2
DECFSZ 20H
GOTO LOOP1
RETURN
SHITOER MOVLW 03H
MOVWF S2H
MOVLW 0xE8
MOVWF S2L
MOVF QIAN,W
MOVWF S1L
CLRF S1H
CALL MPXY
MOVF R1H,W
MOVWF SHUH
MOVF R1L,W
MOVWF SHUL
MOVLW 64H
MOVWF S2L
CLRF S2H
CLRF S1H
MOVF BAI,W
MOVWF S1L
CALL MPXY
MOVF SHUH,W
MOVWF S1H
MOVF SHUL,W
MOVWF S1L
MOVF R1H,W
MOVWF S2H
MOVF R1L,W
MOVWF S2L
CALL ADDXY
MOVF R1H,W
MOVWF SHUH
MOVWF SHUL
MOVLW 0AH
MOVWF S2L
CLRF S2H
MOVF SHI,W
MOVWF S1L
CLRF S1H
CALL MPXY
MOVF SHUH,W
MOVWF S1H
MOVF SHUL,W
MOVWF S1L
MOVF R1H,W
MOVWF S2H
MOVF R1L,W
MOVWF S2L
CALL ADDXY
MOVF R1H,W
MOVWF S1H
MOVF R1L,W
MOVWF S1L
CLRF S2H
MOVF GE,W
MOVWF S2L
CALL ADDXY
RETURN ERTOSHI MOVF R1H,W
MOVF R1L,W MOVWF S1L MOVLW 27H MOVWF S2H MOVLW 10H MOVWF S2L CALL DIVXY
MOVLW 03H MOVWF S2H MOVLW 0xE8 MOVWF S2L MOVF R2L,W MOVWF S1L MOVF R2H,W MOVWF S1H CALL DIVXY MOVF R1L,W MOVWF QIAN
MOVLW 64H MOVWF S2L CLRF S2H MOVF R2L,W MOVWF S1L MOVF R2H,W MOVWF S1H CALL DIVXY MOVF R1L,W MOVWF BAI
MOVWF S2L
CLRF S2H
MOVF R2L,W
MOVWF S1L
MOVF R2H,W
MOVWF S1H
CALL DIVXY
MOVF R1L,W
MOVWF SHI
MOVF R2L,W
MOVWF GE
RETURN
DUI1D MOVLW 0AH
MOVWF S2L
CLRF S2H
MOVF DUI1,W
MOVWF S1L
CLRF S1H
CALL DIVXY
MOVF R1L,W
MOVWF QIAN
MOVF R2L,W
MOVWF BAI
RETURN
DUI2D MOVLW 0AH
MOVWF S2L
CLRF S2H
MOVF DUI2,W
MOVWF S1L
CLRF S1H
CALL DIVXY
MOVF R1L,W
MOVWF SHI
MOVF R2L,W
MOVWF GE
RETURN
GUAN SLEEP
NOP
GOTO LOOPN
END ; directive 'end of program'
四、评价
这个设计的所有运算都是基于加减法的,然后是得出乘除法,最后的个位、十位、百位和千位的整合转换为一个双精度的二进制数和将一个双精度的二进制数拆分为个位、十位、百位和千位都是基于乘除法的。
所以当加减法子程序出现问题,计算器将不能工作。
而且除法计算的结果是有余数的,不能进行余数的除法。
这样计算器除法只能计算能被整除的算式,而不能计算不能被整除的算式,因为只会显示被整除部分,而余数无法显示。
还有一个最大的问题就是还不能计算负数和小数位,这将是要改进的部分。
经过编写这个简单计算器的过程,我对程序编写的条理性更加的明确,都是将需要达到的目标分开成一步一步的小程序段,来实现一个大程序所需要实现的其中一小步,然后所有这些小程序整合起来就是一个大的程序。
而且不能一次把一个大的程序写出来,因为如果其中那一段出现错误后将很难发现而且会感到十分的沮丧,这次就是,最后还是需要我一部分一部分拆开检测才发现了错误的所在。
但是耗费了大量的时间。
编写程序的时候需要个清晰的思路,这样你才能知道你这个程序需要怎么样的一步一步,你下一步需要编写什么样的一个程序段。
五、参考文献
1.PIC单片机原理及应用——李荣正
2.PIC单片机实用教程——李学海
3.PIC系列单片机应用设计与实例——窦振中
4.PIC16F87X单片机实用软件与接口技术——刘和平。