pic单片机汇编程序实例,PIC单片机编程
PIC单片机A/D转换汇编程序 16F877的 实验课用
#INCLUDEP16F877a.INC ;包含芯片头文件
__CONFIG _DEBUG_OFF_CP_ALL_WRT_HALF_CPD_ON_LVP_OFF_BODEN_OFF_PWRTE_ON_WDT_OFF_HS_OSC
;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
;*********************寄存器定义*********************
TEMP EQU 20H ;临时寄存器
BAI EQU 21H ;转换结果的百位
SHI EQU 22H ;转换结果的十位
GE EQU 23H ;转换结果的个位
;****************************************************
ORG 00H ;复位入口地址
NOP ;ICD需要的空指令
GOTO MAIN ;跳转到主程序入口
ORG 04H ;中断入口地址
RETFIE ;放置一条中断返回指令,防止以外中断发生
;***********************查表程序*********************
;入口参数:W
;出口参数:W
TABLE
ADDWF PCL,1 ;指令寄存器加上偏移地址
RETLW 0C0H ;0的编码(公阳极数码管)
RETLW 0F9H ;1的编码
RETLW 0A4H ;2的编码
RETLW 0B0H ;3的编码
RETLW 99H ;4的编码
RETLW 92H ;5的编码
RETLW 082H ;6
RETLW 0F8H ;7
RETLW 080H ;8
RETLW 090H ;9
;***********************主程序***********************
MAIN
MOVLW 30H
MOVWF FSR ;转换结果存放起始地址
LOOP
BSF STATUS,RP0 ;选择体1
MOVLW 7H ;A口高3位为输出,低3位输入
MOVWF TRISA
CLRF TRISD ;D口设为输出
MOVLW 8EH
MOVWF ADCON1 ;结果右对齐,只选择RA0做ADC口,其余做普通数字口
BCF STATUS,RP0 ;回体0
MOVLW 41H
MOVWF ADCON0 ;选择时钟源为fosc/8,允许ADC工作
CALL DELAY ;调用延时程序,保证足够的采样时间
BSF ADCON0,GO ;启动ADC转换
WAIT
BTFSS PIR1,ADIF ;转换是否完成
GOTO WAIT ;等待转换的完成
BSF STATUS,RP0
MOVFW ADRESL ;读取转换的结果
BCF STATUS,RP0
MOVWF INDF ;保存到临时寄存器里
INCF FSR,1
BTFSS FSR,2 ;连续转换4次,求平均值
GOTO LOOP
CALL CHANGE ;调用结果转换程序
CALL DISPLAY ;调用显示程序
GOTO MAIN ;循环工作
;************************转换程序*********************
;入口参数:30H---33H
;出口参数:BAI,SHI,GE
CHANGE
CLRF 2AH
CLRF BAI
CLRF SHI
CLRF GE ;先清除结果寄存器
MOVFW 31H ;以下8条指令求4次转换结果的平均值
ADDWF 30H,1
BTFSC STATUS,C
INCF 2AH
MOVFW 32H
ADDWF 30H,1
BTFSC STATUS,C
INCF 2AH,1
MOVFW 33H
ADDWF 30H,1
BTFSC STATUS,C
INCF 2AH,1
RRF 2AH,1
RRF 30H,1
RRF 2AH,0
RRF 30H,0
MOVWF TEMP
MOVLW 64H ;减100,结果保留在W中
SUBWF TEMP,0
BTFSS STATUS,C ;判断是否大于100
GOTO SHI_VAL ;否,转求十位结果
MOVWF TEMP ;是,差送回TEMP中
INCF BAI,1 ;百位加1
GOTO $-6 ;返回继续求百位的值
SHI_VAL
MOVLW 0AH ;减10,结果保留在W中
SUBWF TEMP,0
BTFSS STATUS,C ;判断是否大于10
GOTO GE_VAL ;否,转去判断个位结果
MOVWF TEMP ;是,差送回TEMP中
INCF SHI,1 ;十位值加1
GOTO $-6 ;转会继续求十位的值
GE_VAL
MOVFW TEMP
MOVWF GE ;个位的值
RETURN
;**************************显示程序********************
;入口参数:BAI,SHI,GE
;出口参数:无
DISPLAY
MOVFW BAI ;显示百位
CALL TABLE
MOVWF PORTD
BCF PORTA,5
CALL DELAY
CALL DELAY
BSF PORTA,5
MOVFW SHI ;显示十位
CALL TABLE
MOVWF PORTD
BCF PORTA,4
CALL DELAY
CALL DELAY
BSF PORTA,4
MOVFW GE ;显示个位
CALL TABLE
MOVWF PORTD
BCF PORTA,3
CALL DELAY
CALL DELAY
BSF PORTA,3
RETURN
;***************************延时程序***********************
;入口参数:无
;出口参数:无
DELAY
MOVLW 5FH
MOVWF TEMP
DECFSZ TEMP,1
GOTO $-1
RETURN
;*********************************************************
END ;程序结束
求大神帮助:PIC16F873单片机用汇编语言编一个产生方波的程序,最好有注释。
这是采用延时的方式,从PB0输出一个脉冲的汇编程序。程序的每一句都有注释,希望对你有所帮助
#INCLUDEP16F873A.INC
MAIN:
BANKSEL TRISB ;选择TRISB寄存器所在BANK
CLRF TRISB ;TRISB清零,PORTB为输出
BANKSEL PORTB ;选择PORTB寄存器所在端口
MOVLW 0XFF ;W寄存器载入立即数0XFF
MOVWF PORTB ;PORTB = W
LOOP:
CALL DELAY ;调用DELAY函数
MOVLW 0X01 ;W寄存器载入立即数0X01
XORWF PORTB ,F ;W寄存器和PORTB做异或操作,结果存回PORTB端口.(PB0取反,其余端口不变)
GOTO LOOP ;跳转到LOOP标号执行
DELAY:
MOVLW 0XFF ;W寄存器载入立即数0XFF
MOVWF 0X70 ;地址0X70的RAM = W,0X70-0X7F为通用RAM,不用选择BANK
D1:
DECFSZ0 X70,F ;0X70减1,结果存回0X70.不为零则顺序执行,为零则跳过下一条指令
GOTO D1 ;跳转到D1标号处执行
RETURN ;子程序返回
END

求助:PIC单片机程序流程图(汇编语言编程,点亮LED灯同时实现通过滚轮的拨动快慢来控制数码管的扫描速度
主要有:
MOV P1,#0AAH
ACALL延迟
MOV P1,#55H
ACALL延迟
SJMP主要
延迟:MOV R7,#0FFH / DE:MOV R6
DJNZ R6,#0FFH,
DJNZ R7,
RET
最后,这是你想要的效果,不妨试试哦!
PIC单片机汇编语言的中断程序 ,求人分析一下怎么运行的
很简单的。
在main主程序里面
LOOP GOTO LOOP
这条程序,会不停的执行,到了TMR0溢出的时候就会执行中断程序
ORG 0004H为中断程序的地址
pic单片机怎么用户汇编语言实现位取反?
1、pic单片机的汇编语言中,目前还没有直接能对位取反的指令,只有对寄存器取反的指令,比如:
COMF F,d ;
这条语句中“F”是寄存器的名称,当“d=1”时,结果存入“F”,当“d=0”时,结果存入“W”。这个“W”书面解释是工作寄存器。可理解为过渡寄存器或临时寄存器,做中转数据用。
2、在汇编语言中要实现位取反,可通过位状态检测判断来对位进行“置1”或“清零”,详见以下程序。
目的:将寄存器 PROTB,3 取反
;*******************************************************************
BTFSS PORTB,3 ; 检测PORTB,3位,为1跳转QINGLING。
GOTO ZHIYI ; 为0跳转到ZHIYI。
QINGLING ; 清零程序段,这是网络标号,可理解为一段程序的名称。
BCF PORTB,3 ; 判断之前PORTB,3位为1,这句作用是将 PORTB,3 清零 。
GOTO WORK ; 跳转到 WORK 程序段继续运行。
ZHIYI ; 置1程序段, 这是网络标号,可理解为一段程序的名称。
BSF PORTB,3 ; 判断之前PORTB,3位为0,这句作用是将 PORTB,3 置1。
GOTO WORK ; 跳转到 WORK 程序段继续运行。
WORK
... ...
;********************************************************************
;注意注意,编程时,指令必须用TAB键空出一格,网络标号必须顶格
;*******************************************************************
求PIC单片机汇编示例程序
想知道哪种,给你粘贴,下面是一些计算子程序
;******************************************************************
;一、十六位二进制转换为BCD数子程序
;******************************************************************
MOVLW 10H ;
MOVWF CNT ;
BCF STATUS,C ;
CLRF R2 ;
CLRF R1 ;
CLRF R0 ;
LOOP RLF AL ;
RLF AH ;
RLF R0 ;
RLF R1 ;
RLF R2 ;
DECFSZ CNT ;
GOTO ADJDEC ;
RETURN
ADJDEC MOVLW R0 ;
MOVWF FSR ;
CALL ADJBCD ;
MOVLW R1 ;
MOVWF FSR ;
CALL ADJBCD ;
MOVLW R2 ;
MOVWF FSR ;
CALL ADJBCD ;
GOTO LOOP ;
ADJBCD MOVLW 3H ;
ADDWF INDF,W ;
MOVWF TMP ;
BTFSC TMP,3 ;
MOVWF INDF ;
MOVLW 30H ;
ADDWF INDF,W ;
MOVWF TMP ;
BTFSC TMP,7 ;
MOVWF INDF ;
RETURN
;***************************************************************************
;乘法宏
;两个八位无符号数乘法,乘积为十六位。部分积右移相加算法:乘数带进位右移一位,
;检查进位是否为一,若是一,部分积寄存器加被乘数,否则不加;然后部分积寄存器
;带进位右移一位;重复上述过程直至循环次数为八结束。
;***************************************************************************
;宏的引用格式:MUL A,B
;完成操作: (A)*(B)---(A,B)
;影响状态位:C、Z和DC
;8*8位乘法宏MUL,结果的高字节部分存入(A),低字节存入(B)
;***************************************************************************
MUL MACRO A,B ;
LOCAL MLOOP ;
;****************************************************************************
;如只用乘法子程序,就下段。
;****************************************************************************
CLRF TMPA ;
CLRF TMPB ;
MOVLW 8 ;
MOVWF CNT ;
MOVF A,W ;
BCF STATUS,C ;
MLOOP RRF B ;
BTFSC STATUS,C ;
ADDWF TMPA ;
RRF TMPA ;
RRF TMPB ;
DECFSZ CNT ;
GOTO MLOOP ;
MOVF TMPA,W ;
MOVWF A ;
MOVF TMPB,W ;
MOVWF B ;
;*****************************************************************************
ENDM
;*****************************************************************************
;除法宏DIV
;除法是乘法的逆运算。与十进制长除法类似,从被除数的最高有效位开始,把被除数左移
;一位至余数上,如果余数不够减去除数,则商寄存器左移,移入位为零,反之移入位为一
;余数减去被除数,把被除数的下一位移至除数上。重复上述过程直至处理完所有位。
;******************************************************************************
;宏的引用格式:DIV A,B
;完成操作: (A)为商部分,(B)为余数部分
;影响状态位:C、Z和DC
;8/8位除法宏DIV,结果(A)为商部分,(B)为余数部分
;***************************************************************************
DIV MACRO A,B ;
LOCAL MLOOP ;
;****************************************************************************
;如只用除法子程序,就下段。
;****************************************************************************
MOVF A,W ;
MOVWF TMPA ;
MOVF B,W ;
MOVWF TMPB ;
MOVLW 8 ;
MVOWF CNT ;
CLRF A ;
CLRF B ;
DLOOP BCF STATUS,C ;
RLF TMPA ;
RLF B ;
MOVF TMPB,W ;
SUBWF B,W ;
BTFSC STATUS,C ;
MOVWF B ;
RLF A ;
DECFSZ CNT ;
GOTO DLOOP ;
;****************************************************************************
ENDM ;
;****************************************************************************
;间接寻址
CLRF R0 ;清除R0寄存器里的内容
MOVLW R0 ;
MOVWF FSR ;将R0寄存器的地址送入间接寻址指针FSR
MOVF INDF,0 ;
MOWF TEMP ;将间接寻址指针FSR所指地址R0寄存器里的内容送入TEMP
MOVLW 88H ;
MOVWF INDF ;将88H送入间接寻址指针FSR所指地址R0寄存器里
;*******************************************************************************
;将两位BCD数送入显示
;显示十位BCD数
DISPLAY SWAPF TEMP,W ;将TEMP寄存器里的内容的高低字节交换并送入W
ANDLW 0FH ;将0FH与W寄存器里的内容相与并送入W
CALL CODE_TAB ;查表取段码
MOVWF PORTD ;送入PORTD端口
MOVLW 1H ;
MOVWF PORTC ;选通PORTC,1
CALL DELAY ;调用延时
;显示个位BCD数
MOVF TEMP,W ;
ANDLW 0FH ;
CALL CODE_TAB ;
MOVWF PORTD ;
MOVLW 2H ;
MOVWF PORTC ;
CALL DELAY ;
;*********************************************************************************************
;16位二进制除以8位二进制
;*******************************************************************************************
DIV16
MOVF A,0
MOVWF DIV_H
MOVF BX,0
MOVWF DIV_L ;被除数高低字节分别送进各寄存器
MOVLW 9H
MOVWF DIVB ;将除数送进寄存器
MOVLW 10H
MOVWF CNT ;按被除数位数设定移位次数
CLRF AL
CLRF AH
CLRF BX
DLOOP
BCF STATUS,C
RLF DIV_L
RLF DIV_H
RLF BX
MOVF DIVB,W
SUBWF BX,W
BTFSC STATUS,C
MOVWF BX
RLF AL
RLF AH
DECFSZ CNT
GOTO DLOOP
RETURN
;****************************************************************************************************
;8位乘以16位二进制乘法运算程序
;****************************************************************************************************
MUL8
CLRF TMPA ;清除积的高位寄存器
CLRF TMPB ;清除积的中位寄存器
CLRF TMPC ;清除积的低位寄存器
MOVLW 10H ;因为8位二进制乘以16位二进制,乘数为16位,移位乘数,所以移位次数为16次
MOVWF CNT ;
MOVF BX,W ;将8位被乘数送进W
BCF STATUS,C;
MLOOP RRF TEMP_H ;
RRF TEMP_L ;带C循环右移16位乘数
BTFSC STATUS,C ;
ADDWF TMPA ;
RRF TMPA ;
RRF TMPB
RRF TMPC
DECFSZ CNT ;
GOTO MLOOP ;
MOVF TMPA,W ;
MOVWF AA ;
MOVF TMPB,W ;
MOVWF A
MOVF TMPC,W ;将乘积送进各寄存器。
MOVWF BX
RETURN