课程设计报告课程名称:单片机原理与接口技术课程设计设计题目:简单计算器院系:机电工程学院班级: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 DEFINITIONSw_temp EQU 0x71 ; variable used for context savingstatus_temp EQU 0x72 ; variable used for context savingGE EQU 0x40SHI EQU 0x41BAI EQU 0x42QIAN EQU 0x43S1H EQU 0x44S1L EQU 0x45S2H EQU 0x46S2L EQU 0x47R1H EQU 0x48R1L EQU 0x49M1H EQU 0x4AM1L EQU 0x4BM2H EQU 0x4CM2L EQU 0x4DM3H EQU 0x4EM3L EQU 0x4FR2H EQU 0x50R2L EQU 0x51SHUH EQU 0x52SHUL EQU 0x53SHURUSHU EQU 0x54SHU1H EQU 0x55SHU1L EQU 0x56P1H EQU 0x57P1L EQU 0x58FUHAO EQU 0x59D1H EQU 0x5AD1L EQU 0x5BD2H EQU 0x5CD2L EQU 0x5DD3H EQU 0x5ED3L EQU 0x5FJIESHU EQU 0x60COUNT EQU0x61.ZHONG EQU 0x62DUI1 EQU 0x63DUI2 EQU 0x64JIANGE EQU 0x65;**********************************************************************ORG 0x000 ; processor reset vectorclrfPCLATH; ensure page bits are cleared goto MAIN ; go to beginning of programORG 0x004 ; interrupt vector locationmovwf w_temp ; save off current W register contentsmovf STA TUS,w ; move status register into W registermovwf status_temp ; save off contents of STA TUS register; isr code can go here or be located as a call subroutine elsewhereCALL DELAYCALL DELAYCALL DELAYCALL DELAYBTFSS PORTB,0GOTO N1MOVLW 00HSUBWF GEBTFSS STA TUS,ZGOTO CLEARAMOVLW 00HSUBWF SHIBTFSS STA TUS,ZGOTO CLEARAMOVLW 00HSUBWF BAIBTFSS STA TUS,ZGOTO CLEARAMOVLW 00HSUBWF QIANBTFSS STA TUS,ZGOTO CLEARAINCF ZHONGGOTO N1CLEARA CALL CLEARCLRF FUHAOCLRF ZHONGCLRF JIESHUN1 BCF INTCON,INTFmovf status_temp,w ; retrieve copy of STATUS registermovwf STA TUS ; restore pre-isr STATUS register contentsswapf w_temp,fswapf w_temp,w ; restore pre-isr W register contentsretfie ; return from interruptCHABIAO ADDWF PCL,FRETLW 0xC0RETLW 0xF9RETLW 0xA4RETLW 0xB0RETLW 0x99RETLW 0x92RETLW 0x82RETLW 0xF8RETLW 0x80RETLW 0x90MAIN; remaining code goes hereBSF STA TUS,RP0CLRF TRISDBSF TRISB,0BCF TRISE,0BCF TRISB,1BCF TRISB,2BCF TRISB,3BCF TRISB,4BCF TRISC,0BCF TRISC,1BCF TRISC,2BCF TRISC,3BSF TRISC,4BSF TRISC,5BSF TRISC,6BSF TRISC,7BCF STA TUS,RP0BSF PORTB,1BSF PORTB,2BSF PORTB,3BSF PORTB,4CLRF PORTCBSF INTCON,INTEBSF INTCON,GIEBCF INTCON,INTFCLRF ZHONGLOOPN MOVLW 00HMOVWF GEMOVLW 00HMOVWF SHIMOVLW 00HMOVWF BAIMOVLW 00HMOVWF QIANMOVLW 0xFFMOVWF JIESHUCLRF S1LCLRF S1HCLRF SHU1LCLRF SHU1HCLRF S2LCLRF S2HCLRF R1LCLRF R1HCLRF R2LCLRF R2HCLRF SHUHCLRF SHULCLRF JIESHULOOP BTFSC ZHONG,0GOTO GUANMOVF GE,WCALL CHABIAOMOVWF PORTDBCF PORTB,4CALL DELAYBSF PORTB,4MOVF SHI,WCALL CHABIAOMOVWF PORTDBCF PORTB,3CALL DELAYBSF PORTB,3MOVF BAI,WCALL CHABIAOMOVWF PORTDBCF PORTB,2CALL DELAYBSF PORTB,2MOVF QIAN,WCALL CHABIAOMOVWF PORTDBCF PORTB,1CALL DELAYBSF PORTB,1JIANPAN MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0HBTFSC STATUS,ZGOTO LOOPCALL DELAY10CALL DELAY10MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0HGOTO 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 PORTCGOTO JIANCBTFSS PORTC,5GOTO JIANDBTFSS PORTC,6GOTO JIANEBTFSS PORTC,7GOTO JIANFGOTO LOOPJINWEI MOVF BAI,WMOVWF QIANMOVF SHI,WMOVWF BAIMOVF GE,WMOVWF SHIMOVF SHURUSHU,WMOVWF GEGOTO LOOPJIAN0 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 01HMOVWF SHURUSHUGOTO JINWEIJIAN1 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 02HMOVWF SHURUSHUGOTO JINWEIJIAN2 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 03HMOVWF SHURUSHUGOTO JINWEIJIAN3 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 00HMOVWF SHURUSHUGOTO JINWEIJIAN4 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 04HMOVWF SHURUSHUGOTO JINWEIJIAN5 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 05HMOVWF SHURUSHUGOTO JINWEIJIAN6 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 06HMOVWF SHURUSHUGOTO JINWEIJIAN7 CALL SFANGCALL SHITOERMOVF R1L,WMOVWF S2LMOVF R1H,WMOVWF S2HMOVF SHU1L,WMOVWF S1LMOVF SHU1H,WMOVWF S1HBTFSC FUHAO,0CALL ADDXYBTFSC FUHAO,1CALL SUBXYBTFSC FUHAO,2CALL MPXYBTFSC FUHAO,3CALL DIVXYCALL ERTOSHI BSF JIESHU,0GOTO LOOPJIAN8 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 07HMOVWF SHURUSHUGOTO JINWEIJIAN9 CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 08HMOVWF SHURUSHUGOTO JINWEIJIANA CALL SFANGBTFSC JIESHU,0GOTO CLEARMOVLW 09HMOVWF SHURUSHUGOTO JINWEIJIANB CALL SFANG MOVF SHI,WMOVWF GEMOVF BAI,WMOVWF SHIMOVF QIAN,WMOVWF BAICLRF QIANGOTO LOOPJIANC CALL SFANGCLRF FUHAOBSF FUHAO,0CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOP JIAND CALL SFANGCLRF FUHAOBSF FUHAO,1CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOPJIANE CALL SFANGCLRF FUHAOBSF FUHAO,2CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOPJIANF CALL SFANGCLRF FUHAOBSF FUHAO,3CALL SHITOERMOVF R1L,WMOVWF SHU1LMOVF R1H,WMOVWF SHU1H BSF JIESHU,0GOTO LOOPSFANG MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0hBTFSS STA TUS,ZGOTO SFANGCALL DELAY10CALL DELAY10CALL DELAY10MOVLW 00HMOVWF PORTCMOVLW 0F0HANDWF PORTC,WSUBLW 0F0HBTFSS STA TUS,ZGOTO SFANGRETURNCLEAR BCF JIESHU,0CLRF GECLRF SHICLRF BAICLRF QIANRETURNDELAY DECFSZ 30H,FGOTO DELAYRETURNDELAY1 DECFSZ 30H,FGOTO DELAYDECFSZ 31H,FGOTO DELAYRETURNADDXY MOVF S1L,WADDWF S2LBTFSC STATUS,CINCF S2HMOVF S1H,WADDWF S2HMOVF S2H,WMOVWF R1HMOVF S2L,WMOVWF R1LRETURNSUBXY COMF S2LINCF S2LBTFSC STATUS,ZDECF S2HCOMF S2HCALL ADDXYRETURNMPXY MOVF S1L,WMOVWF M1LMOVF S1H,WMOVWF M1HMOVF S2L,WMOVWF M2LMOVF S2H,WMOVF S1L,WMOVWF M3LMOVF S1H,WMOVWF M3HCLRF R1HCLRF R2HL2 MOVLW 00HSUBWF M2LBTFSS STA TUS,ZGOTO L1MOVLW 00HSUBWF M2HBTFSC STA TUS,ZGOTO L3L1 MOVF M1L,WMOVWF S1LMOVF M3L,WMOVWF S2LMOVF M1H,WMOVWF S1HMOVF M3H,WMOVWF S2HCALL ADDXYMOVF R1L,WMOVWF M1LMOVF R1H,WMOVWF M1HMOVWF S1LMOVF M2H,WMOVWF S1HCLRF S2HMOVLW 01HMOVWF S2LCALL SUBXYMOVF R1L,WMOVWF M2LMOVF R1H,WMOVWF M2HMOVF M1L,WMOVWF R1LMOVF M1H,WMOVWF R1HGOTO L2L3 MOVF R1L,WMOVWF S1LMOVF R1H,WMOVWF S1HMOVF M3L,WMOVWF S2LMOVF M3H,WMOVWF S2HCAll S UBXYRETURNDIVXY MOVF S1L,WMOVWF D1LMOVF S1H,WMOVF S2L,WMOVWF D2LMOVF S2H,WMOVWF D2HCLRF D3LCLRF D3HD1 MOVF D2H,WSUBWF D1H,WBTFSS STA TUS,CGOTO D2BTFSS STA TUS,ZGOTO D3MOVF D2L,WSUBWF D1L,WBTFSS STA TUS,CGOTO D2D3 MOVF D1L,WMOVWF S1LMOVF D1H,WMOVWF S1HMOVF D2L,WMOVWF S2LMOVF D2H,WMOVWF S2HCALL SUBXYMOVF R1L,WMOVWF D1LMOVF R1H,WMOVWF D1HMOVF D3H,WMOVF D3L,WMOVWF S1LCLRF S2HMOVLW 01HMOVWF S2LCALL ADDXYMOVF R1H,WMOVWF D3HMOVF R1L,WMOVWF D3LGOTO D1D2 MOVF D3L,WMOVWF R1LMOVF D3H,WMOVWF R1HMOVF D1L,WMOVWF R2LMOVF D1H,WMOVWF R2HRETURNDELAY10 MOVLW 0DHMOVWF 20H LOOP1 MOVLW 0FFHMOVWF 21H LOOP2 DECFSZ 21HGOTO LOOP2DECFSZ 20HGOTO LOOP1RETURNSHITOER MOVLW 03HMOVWF S2HMOVLW 0xE8MOVWF S2LMOVF QIAN,WMOVWF S1LCLRF S1HCALL MPXYMOVF R1H,WMOVWF SHUHMOVF R1L,WMOVWF SHULMOVLW 64HMOVWF S2LCLRF S2HCLRF S1HMOVF BAI,WMOVWF S1LCALL MPXYMOVF SHUH,WMOVWF S1HMOVF SHUL,WMOVWF S1LMOVF R1H,WMOVWF S2HMOVF R1L,WMOVWF S2LCALL ADDXYMOVF R1H,WMOVWF SHUHMOVWF SHULMOVLW 0AHMOVWF S2LCLRF S2HMOVF SHI,WMOVWF S1LCLRF S1HCALL MPXYMOVF SHUH,WMOVWF S1HMOVF SHUL,WMOVWF S1LMOVF R1H,WMOVWF S2HMOVF R1L,WMOVWF S2LCALL ADDXYMOVF R1H,WMOVWF S1HMOVF R1L,WMOVWF S1LCLRF S2HMOVF GE,WMOVWF S2LCALL ADDXYRETURN ERTOSHI MOVF R1H,WMOVF R1L,W MOVWF S1L MOVLW 27H MOVWF S2H MOVLW 10H MOVWF S2L CALL DIVXYMOVLW 03H MOVWF S2H MOVLW 0xE8 MOVWF S2L MOVF R2L,W MOVWF S1L MOVF R2H,W MOVWF S1H CALL DIVXY MOVF R1L,W MOVWF QIANMOVLW 64H MOVWF S2L CLRF S2H MOVF R2L,W MOVWF S1L MOVF R2H,W MOVWF S1H CALL DIVXY MOVF R1L,W MOVWF BAIMOVWF S2LCLRF S2HMOVF R2L,WMOVWF S1LMOVF R2H,WMOVWF S1HCALL DIVXYMOVF R1L,WMOVWF SHIMOVF R2L,WMOVWF GERETURNDUI1D MOVLW 0AHMOVWF S2LCLRF S2HMOVF DUI1,WMOVWF S1LCLRF S1HCALL DIVXYMOVF R1L,WMOVWF QIANMOVF R2L,WMOVWF BAIRETURNDUI2D MOVLW 0AHMOVWF S2LCLRF S2HMOVF DUI2,WMOVWF S1LCLRF S1HCALL DIVXYMOVF R1L,WMOVWF SHIMOVF R2L,WMOVWF GERETURNGUAN SLEEPNOPGOTO LOOPNEND ; directive 'end of program'四、评价这个设计的所有运算都是基于加减法的,然后是得出乘除法,最后的个位、十位、百位和千位的整合转换为一个双精度的二进制数和将一个双精度的二进制数拆分为个位、十位、百位和千位都是基于乘除法的。