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

发布者:blq0681最新更新时间:2015-07-15 来源: 51hei关键字:PIC单片机  16进制数  十进制数 手机看文章 扫描二维码
随时随地手机看文章
#INCLUDE"P16F877.inc"
  
   W_TEMP  EQU 20H ; 实际上20H、A0H、120H和1A0H
   STATUS_TEMP EQU 21H ;在体0中建立保护单元 
   PCLATH_TEMP EQU 22H ;在体0中建立保护单元

   ORG  000H
   GOTO A1
   ORG  004H;定时中断入口地址 
   GOTO ZD01;
   ORG  0CH
A1  
   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 B'00000001';位码
   MOVWF 41H;
   MOVLW 5AH;
   MOVWF FSR ;间接寻址
   BSF  STATUS,RP0;选择体1
   BCF  STATUS,RP1;
   MOVLW 00H;1:2TMRO比例
   MOVWF OPTION_REG;分频1/2
   BCF  STATUS,RP0;体0
   BCF  STATUS,RP1;
   MOVLW 0FFH;
   MOVFW TMR0;初值
   BCF  INTCON,T0IF;清定时中断标志
   BSF  INTCON,T0IE;开定时中断
   BSF  INTCON,GIE;开总中断
  
 
  
A2   CALL CL0;将16进制数调整为5位10进制数
   NOP;
   NOP;
   MOVFW  50H
   MOVWF  5AH
   MOVFW  51H
   MOVWF  5BH
   
   MOVFW  52H
   MOVWF  5CH
   MOVFW  53H
   MOVWF  5DH
 

   GOTO  A2
CL0  ; MOVLW  0H ;要显示16进制数低位
  ; MOVWF  50H;
  ; MOVLW  00H;
  ; MOVWF  51H;要显示16进制数高位
   CALL  CL1
   
   MOVLW  B'00001111'
   ANDWF  54H,0
   MOVWF  50H
   MOVLW  B'11110000'
   ANDWF  54H,1
   SWAPF  54H,0
   MOVWF  51H
     
   MOVFW  52H
   MOVWF  54H
   MOVLW  B'00001111'
   ANDWF  53H,0
   MOVWF  52H
   MOVLW  B'11110000'
   ANDWF  53H,1
   SWAPF  53H,1
   RETURN
  
    
CL1  
   MOVLW  0;
   MOVWF  52H;万位
   MOVWF  53H;百千位
   MOVWF  54H;个十位
   MOVWF  55H;进位标志
   MOVLW  10H;
   MOVWF  56H;循环次数
   CLRF  57H;
CL2   BCF   STATUS,C;清C
   RLF   51H,1;循环左移
   RLF   50H,1;循环左移
   BTFSC  STATUS,C;判断C位是否为高
   BSF   55H,0;是置1
   MOVFW  54H;
   ADDWF  55H,0;PIC没有ADDC指令只能判断C来加1
   ADDWF  54H,0;与自身相加
   BTFSC  STATUS,C;判断是否有进位
   BSF   57H,7;有则置标志
   BTFSC  STATUS,DC;判断是否有进位
   BSF   57H,3;有则置标志
   CALL  DA1;调用十进制调整子程序
   MOVWF  54H;存回54H
   CLRF  55H;清进位标志
   BTFSC  STATUS,C;判断C位是否为高
   BSF   55H,0;是置1
   MOVFW  53H;
   ADDWF  55H,0;PIC没有ADDC指令只能判断C来加1
   ADDWF  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;自身加6H
CL5   
   CLRF  57H;清标志
   DECFSZ  56H,1;
   GOTO  CL2;
  
   RETURN;
 
 [page]
 
;;;**************************************************************
;;;    十进制数调整
;;;**************************************************************   
DA1   MOVWF  60H;将W里的数保存到60H里
   MOVLW  B'00001111';
   ANDWF  60H,0;将60H的数与00001111去除高4位
   MOVWF  62H;将去除高位后的数保存到62H
   MOVLW  0AH;
   SUBWF  62H,0;去除高位的数减0AH
   BTFSS  STATUS,DC;判断是否比0AH大
   GOTO  DA2 ;否则跳转
   ADDLW  B'10000';比0AH大则进位
   MOVWF  62H;高4位加1
  
DA2   MOVLW  B'11110000';
   ANDWF  60H,1;将60H的数与11110000去除低4位
   MOVLW  0A0H;
   SUBWF  60H,0;高4位的数减0A0H
   BTFSS  STATUS,C;判断是否比0A0H大
   GOTO  DA3;否
   ADDWF  62H,1;是则将差加上低位
   BSF   STATUS,C;是则置位
   GOTO  DA4;
DA3   MOVFW  60H;
   ADDWF  62H,1;否则将高4位加上低4位
   MOVFW  62H;
   ANDLW  B'11110000';
   SUBLW  0A0H ;加后判断是否大于或等于0A0H
   BCF   STATUS,C;
   BTFSS  STATUS,Z;
   GOTO  DA4;否则退出
   MOVLW  B'00001111';是
   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半字交换后送W
   CLRF  STATUS;选择体0为当前体备份
   MOVWF  STATUS_TEMP;将原来的STATUS送体0上的
   MOVF  PCLATH,0;PCLATH送W 
   MOVWF  PCLATH_TEMP;W送备份寄存器中
   CLRF  PCLATH ;设置为0页
 
   BCF  INTCON,T0IF
   BSF  STATUS,RP0;体1
   BCF  STATUS,RP1;
   MOVLW 0;
   MOVWF TRISB;RB口设为输出口
   MOVWF TRISD;RD口设为输出口
   BCF  STATUS,RP0;体0
   BCF  STATUS,RP1;
   MOVLW 0FFH;
   MOVWF PORTB;RB口输出高电平
   MOVLW 0
   MOVWF PORTD;RD口输出低电平起清屏作用
   
   MOVFW INDF;间接寻址显示数据  
   CALL Q1;查数据表
   MOVWF PORTB;显示断码输出到RB口
   INCF FSR,1;间接寻址地址加1
   MOVFW 41H ;位码
   MOVWF PORTD;位码输出到RD口
   RLF  41H,0;处理C
   RLF  41H,1;左移位码
   DECFSZ 40H,1;判断是否显示完4位
   GOTO ZD02;否则继续显示
   MOVLW 4;显示位数
   MOVWF 40H;
   MOVLW B'00000001';位码
   MOVWF 41H;
   MOVLW 5AH;
   MOVWF FSR ;间接寻址
ZD02  
   MOVLW 0FFH;
   MOVFW TMR0;重装初值
     ; 恢复现场
   CLRF STATUS;恢复到体0
   MOVF    PCLATH_TEMP,0;开始恢复数据 
   MOVWF PCLATH;恢复PCLATH
   SWAPF STATUS_TEMP,0
   MOVWF STATUS;恢复STATUS
   SWAPF W_TEMP,1;半字交换后放回
   SWAPF W_TEMP,0;再半字交换后送W
ZD03  
   RETFIE ;中断返回
M001  MOVLW 4
   MOVWF 30H
M002  MOVLW 248
   MOVWF 31H
M003  MOVLW 250
   MOVWF 32H
   DECFSZ 32H
   GOTO $-1
   DECFSZ 31H
   GOTO M003
   DECFSZ 30H
   GOTO M002
   RETURN
  
   
 
;********************************************
;    数据表
;********************************************      
Q1   ADDWF   PCL,1  
      RETLW     00C0H        ;0
      RETLW     00F9H        ;1
      RETLW     00A4H        ;2
      RETLW     00B0H        ;3
      RETLW     0099H        ;4
      RETLW     0092H        ;5
      RETLW     0082H        ;6
      RETLW     00F8H        ;7
      RETLW     0080H        ;8
      RETLW     0090H        ;9
      RETLW     0088H        ;A
      RETLW     0083H        ;B
      RETLW     00C6H        ;C
      RETLW     00A1H        ;D
      RETLW     0086H        ;E
      RETLW     008EH        ;F
   END 
关键字:PIC单片机  16进制数  十进制数 引用地址:PIC单片机将2个16进制数转换为5位十进制数并显示

上一篇:PIC单片机65535*65535子程序
下一篇:基于PIC单片机的NRF2401发送程序

推荐阅读最新更新时间:2024-03-16 14:25

PIC单片机的4×4行列式键盘工作原理
PIC单片机的4×4行列式键盘工作原理: (1)单片机系统键盘原理   行列式键盘的接法比独立式键盘的接法复杂,编程实现上也会比较复杂。但是,在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多,其原理图如图1所示。   图1 4×4行列式键盘的原理图   实际的工程中,可能会使用PIC16C5X这种通用的可编程的键盘、显示接口器件,使用PIC16C5X单片器件就能够完成键盘输入和显示控制两种功能。   行列式键盘的工作方式是先用列线发送扫描字,然后读取行线的状态,查看是否有按键按下。键盘部分提供一种扫描的工作方式,可以和具有64个按键的矩阵键盘相连接,能对键盘不断扫描、自动消抖、自动识别按
[工业控制]
<font color='red'>PIC单片机</font>的4×4行列式键盘工作原理
PIC单片机入门必看基础知识
PIC单片机的特点及与51系列单片机的区别: 这里仅以使用广泛的中低档PIC16/PIC12/10系列为例说明。 PIC系列单片机采用哈佛总线结构,程序空间总线和数据总线分开,地址长度也不一样,也同样不在一个连续的空间,程序为单字结构,一句程序占用一个程序字长,这与51不一样,51系列则采用冯.诺依曼结构,程序空间和数据空间共用一组8BIT的总线,程序空间和数据空间共用一个连续的地址空间;程序为多字节结构,根据不同指令及数据每句程序有不同的长度,这种结构有可能在程序跑飞的时候让系统把数据当做指令执行。 PIC系列单片机使用精简指令集,总共不超过35条指令,采用预取指令的做法使绝大多数指令只要一个指令时钟周期,51则采用
[单片机]
PIC单片机编程漫谈
PIC的编程是比较简单的,但是对于初学者来说还是有些概念不太容易理解,从而影响编程。例如,PIC单片机初学者在编写程序时就比较容易在BANK设置和PC操作上出错。 1、 BANK设置错误: 先来看一段程序: include PORTDB EQU 20H …… START movlw b‘11110000’ movwf PORTDB clrf TRISD MAIN bcf STATUS,C rlf PORTDB,1 btfsc STATUS,C bsf PORTDB,0 movf PORTDB,W movwf PORTD call DELAY goto MAIN …… 上面的是一个将D口的发
[单片机]
PIC单片机在proteus+MPLAB组合下的LED单灯闪烁实验
先放电路图,注意晶振两侧电容的选择,注意LED与电压之间电阻阻值的大小。 程序为:注意一定要包含pic.h文件,一定要先确定_XTAL_FREQ的大小才能使用__delay_ms这个宏,注意LED=~LED的妙用。 /* 功能:令LED按一定时间间隔闪烁 */ #include pic.h #define _XTAL_FREQ 4000000UL //振荡器频率 #define LED RC5 //因为led灯连在了RC5引脚上 void main() { TRISC = 0x00;//设置所有的PORTC为输出 PORTC = 0xff;//将PORTC的输出都设置为1 while(1) {
[单片机]
<font color='red'>PIC单片机</font>在proteus+MPLAB组合下的LED单灯闪烁实验
stm32与pic单片机比较_哪个好
  STM32单片机   由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名…其强大的功能主要表现在:   stm32单片机特性   1、内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.2
[单片机]
stm32与<font color='red'>pic单片机</font>比较_哪个好
基于PIC单片机的电能表时钟误差分析仪的研究
1引 言 随着社会的发展,用电量增大,为提高用电效率,改善用电量不均衡的现象,国内各省市的电力部门己开始全面推出了复费率电能表,计量单位对复费率电能表检定的任务越来越繁重[1-2]。时钟的准确性是分时计量最重要的一部分。目前的计量单位对复费率电能表时钟检定的方法已经逐渐不能满足需要。为了解决目前复费率电能表时钟检定存在的问题,本文设计了一种基于PIC单片机的复费率电能表时钟误差分析仪的系统。该系统是一种便携式时钟误差检定装置,集计时检定,数据处理,数据传送等功能于一体,具有快捷、准确、有效的特点。 l频率测量原理 系统测量频率采用的是多周期同步测量方法,这种方法是在直接测频的基础上发展测量方法,在目前的测频系统中得到越来越广泛的
[单片机]
基于<font color='red'>PIC单片机</font>的电能表时钟误差分析仪的研究
PIC单片机编程入门之超简单的点灯程序
IO口控制 方向寄存器 TRISA~TRISAE 比如 TRISB=0x00; // 1为输入, 0为输出 , 这样就把portB端口全部设为输出 数据寄存器 PORTA~PORTE 比如 PORTB=0x01; // 1为置高,0为置低 , 这样就把portB1口置高,其它portB口置低 例: 点灯程序 #include __CONFIG (0x3B31);// pic单片机需要进行寄存器配置,详见手册 void main() { TRISD=0xfe; // 把RD1端口设为输出 PORTD=0x01; // 把RD1端口置高 //RD1=1; PORTD 和 RD一样的 whil
[单片机]
PIC单片机AD转化器编程方法
要使用好ADC模块首先要对ADC模块进行初始化设置,这些设置需要包括以下内容: 1、设置ADC模块端口和数据格式 通过设置控制寄存器ADCON1设置引脚功能为输入信道,参考电压接入方式,通过数字IO引脚和设置转换结果的存放格式。 2、设置ADC模块工作方式 通过控制寄存器ADCON0选中某一条模拟输入信道,设置AD转换时钟源以及开启AD转换功能。 3、如果需要中断功能,应该设置AD中断使能位 清除ADC模块中断标志位ADIF,设置ADC模块中断使能位ADIE=1,设置中断使能位PEIE=1和全局中断使能位GIE=1. 4、等待所需要的采样时间 采样时间大约是10~20us,影响采样时间的主要因素之一是模拟信号源内阻,信
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved