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
PIC单片机16进制数十进制 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)