微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC单片机将2个16进制数转换为5位十进制数并显示

PIC单片机将2个16进制数转换为5位十进制数并显示

时间:11-29 来源:互联网 点击:
#INCLUDE"P16F877.inc"
W_TEMP  EQU 20H ; 实际上20H、A0H、120H和1A0HSTATUS_TEMP EQU 21H ;在体0中建立保护单元 PCLATH_TEMP EQU 22H ;在体0中建立保护单元ORG  000HGOTO A1ORG  004H;定时中断入口地址 GOTO ZD01;ORG  0CHA1  MOVLW 1;位1显示数MOVWF 5AH; MOVLW 2;位2显示数MOVWF 5BH;MOVLW 3;位3显示数MOVWF 5CH;MOVLW 4;位4显示数MOVWF 5DH;MOVLW 4;显示位数MOVWF 40H;MOVLW B00000001;位码MOVWF 41H;MOVLW 5AH;MOVWF FSR ;间接寻址BSF  STATUS,RP0;选择体1BCF  STATUS,RP1;MOVLW 00H;1:2TMRO比例MOVWF OPTION_REG;分频1/2BCF  STATUS,RP0;体0BCF  STATUS,RP1;MOVLW 0FFH;MOVFW TMR0;初值BCF  INTCON,T0IF;清定时中断标志BSF  INTCON,T0IE;开定时中断BSF  INTCON,GIE;开总中断A2   CALL CL0;将16进制数调整为5位10进制数NOP;NOP;MOVFW  50HMOVWF  5AHMOVFW  51HMOVWF  5BHMOVFW  52HMOVWF  5CHMOVFW  53HMOVWF  5DHGOTO  A2CL0  ; MOVLW  0H ;要显示16进制数低位; MOVWF  50H;; MOVLW  00H;; MOVWF  51H;要显示16进制数高位CALL  CL1MOVLW  B00001111ANDWF  54H,0MOVWF  50HMOVLW  B11110000ANDWF  54H,1SWAPF  54H,0MOVWF  51HMOVFW  52HMOVWF  54HMOVLW  B00001111ANDWF  53H,0MOVWF  52HMOVLW  B11110000ANDWF  53H,1SWAPF  53H,1RETURNCL1  MOVLW  0;MOVWF  52H;万位MOVWF  53H;百千位MOVWF  54H;个十位MOVWF  55H;进位标志MOVLW  10H;MOVWF  56H;循环次数CLRF  57H;CL2   BCF   STATUS,C;清CRLF   51H,1;循环左移RLF   50H,1;循环左移BTFSC  STATUS,C;判断C位是否为高BSF   55H,0;是置1MOVFW  54H;ADDWF  55H,0;PIC没有ADDC指令只能判断C来加1ADDWF  54H,0;与自身相加BTFSC  STATUS,C;判断是否有进位BSF   57H,7;有则置标志BTFSC  STATUS,DC;判断是否有进位BSF   57H,3;有则置标志CALL  DA1;调用十进制调整子程序MOVWF  54H;存回54HCLRF  55H;清进位标志BTFSC  STATUS,C;判断C位是否为高BSF   55H,0;是置1MOVFW  53H;ADDWF  55H,0;PIC没有ADDC指令只能判断C来加1ADDWF  53H,0;与自身相加BTFSC  STATUS,C;BSF   57H,6;BTFSC  STATUS,DC;判断是否有进位BSF   57H,2;有则置标志CALL  DA1;MOVWF  53H;CLRF  55H ;BTFSC  STATUS,C;BSF   55H,0;MOVFW  52H;ADDWF  55H,0;ADDWF  52H,0;BTFSC  STATUS,C;BSF   57H,5;BTFSC  STATUS,C;判断是否有进位BSF   57H,1;有则置标志CALL  DA1;MOVWF  52H;CLRF  55H;BTFSS  57H,7;判断标志是否有进位GOTO  CL03;否INCF  53H,1;是进位MOVLW  60H;ADDWF  54H,1;自身加60H CL03  BTFSS  57H,3;判断标志是否有进位GOTO  CL3;否MOVLW  6H;ADDWF  54H,1;自身加6H CL3   BTFSS  57H,6;判断标志是否有进位GOTO  CL04;INCF  52H,1;是进位MOVLW  60H;ADDWF  53H,1;自身加60H CL04  BTFSS  57H,2;判断标志是否有进位GOTO  CL4;否MOVLW  6H;ADDWF  53H,1;自身加6H  CL4   BTFSS  57H,5;判断标志是否有进位GOTO  CL05;INCF  51H,1;是进位MOVLW  60H;ADDWF  52H,1;自身加60H CL05  BTFSS  57H,1;判断标志是否有进位GOTO  CL5;否MOVLW  6H;ADDWF  52H,1;自身加6HCL5   CLRF  57H;清标志DECFSZ  56H,1;GOTO  CL2;RETURN;;;;**************************************************************;;;    十进制数调整;;;**************************************************************   DA1   MOVWF  60H;将W里的数保存到60H里MOVLW  B00001111;ANDWF  60H,0;将60H的数与00001111去除高4位MOVWF  62H;将去除高位后的数保存到62HMOVLW  0AH;SUBWF  62H,0;去除高位的数减0AHBTFSS  STATUS,DC;判断是否比0AH大GOTO  DA2 ;否则跳转ADDLW  B10000;比0AH大则进位MOVWF  62H;高4位加1DA2   MOVLW  B11110000;ANDWF  60H,1;将60H的数与11110000去除低4位MOVLW  0A0H;SUBWF  60H,0;高4位的数减0A0HBTFSS  STATUS,C;判断是否比0A0H大GOTO  DA3;否ADDWF  62H,1;是则将差加上低位BSF   STATUS,C;是则置位GOTO  DA4;DA3   MOVFW  60H;ADDWF  62H,1;否则将高4位加上低4位MOVFW  62H;ANDLW  B11110000;SUBLW  0A0H ;加后判断是否大于或等于0A0HBCF   STATUS,C;BTFSS  STATUS,Z;GOTO  DA4;否则退出MOVLW  B00001111;是ANDWF  62H,1;则去掉高4位并进位BSF   STATUS,C;置进位标志 DA4   MOVFW  62H;RETURN;;**************************************************************;     定时中断数码管显示程序;**************************************************************ZD01  BTFSS INTCON,T0IF;判断是否产生定时中断GOTO ZD03;否跳出是继续执行MOVWF  W_TEMP;W备份到W_TEMP中SWAPF  STATUS,0;STATUS半字交换后送WCLRF  STATUS;选择体0为当前体备份MOVWF  STATUS_TEMP;将原来的STATUS送体0上的MOVF  PCLATH,0;PCLATH送W MOVWF  PCLATH_TEMP;W送备份寄存器中CLRF  PCLATH ;设置为0页BCF  INTCON,T0IFBSF  STATUS,RP0;体1BCF  STATUS,RP1;MOVLW 0;MOVWF TRISB;RB口设为输出口MOVWF TRISD;RD口设为输出口BCF  STATUS,RP0;体0BCF  STATUS,RP1;MOVLW 0FFH;MOVWF PORTB;RB口输出高电平MOVLW 0MOVWF PORTD;RD口输出低电平起清屏作用MOVFW INDF;间接寻址显示数据  CALL Q1;查数据表MOVWF PORTB;显示断码输出到RB口INCF FSR,1;间接寻址地址加1MOVFW 41H ;位码MOVWF PORTD;位码输出到RD口RLF  41H,0;处理CRLF  41H,1;左移位码DECFSZ 40H,1;判断是否显示完4位GOTO ZD02;否则继续显示MOVLW 4;显示位数MOVWF 40H;MOVLW B00000001;位码MOVWF 41H;MOVLW 5AH;MOVWF FSR ;间接寻址ZD02  MOVLW 0FFH;MOVFW TMR0;重装初值; 恢复现场CLRF STATUS;恢复到体0MOVF    PCLATH_TEMP,0;开始恢复数据 MOVWF PCLATH;恢复PCLATHSWAPF STATUS_TEMP,0MOVWF STATUS;恢复STATUSSWAPF W_TEMP,1;半字交换后放回SWAPF W_TEMP,0;再半字交换后送WZD03  RETFIE ;中断返回M001  MOVLW 4MOVWF 30HM002  MOVLW 248MOVWF 31HM003  MOVLW 250MOVWF 32HDECFSZ 32HGOTO $-1DECFSZ 31HGOTO M003DECFSZ 30HGOTO M002RETURN;********************************************;    数据表;********************************************      Q1   ADDWF   PCL,1  RETLW     00C0H        ;0RETLW     00F9H        ;1RETLW     00A4H        ;2RETLW     00B0H        ;3RETLW     0099H        ;4RETLW     0092H        ;5RETLW     0082H        ;6RETLW     00F8H        ;7RETLW     0080H        ;8RETLW     0090H        ;9RETLW     0088H        ;ARETLW     0083H        ;BRETLW     00C6H        ;CRETLW     00A1H        ;DRETLW     0086H        ;ERETLW     008EH        ;FEND 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top