📄 pic16f877.txt
字号:
ACCALO EQU 0X20
ACCAHI EQU ACCALO+1
EXPA EQU ACCALO+2
ACCBLO EQU ACCALO+3
ACCBHI EQU ACCALO+4
EXPB EQU ACCALO+5
ACCCLO EQU ACCALO+6
ACCCHI EQU ACCALO+7
ACCDLO EQU ACCALO+8
ACCDHI EQU ACCALO+9
TEMP EQU ACCDHI+1
SIGN EQU ACCDHI+2
SQRTLO EQU ACCALO
SQRTHI EQU ACCAHI
NUMLO EQU ACCDHI+4
NUMHI EQU ACCDHI+5
COUNT EQU ACCDHI+6 ;此方法定义的数据块为连续层断,只要
;将第一行改变,就可以将数据整块搬动到
;新的地方,为调试带来方便,是比较推
;崇的一种寄存器定义方法
LUPCNT EQU .10
;
ORG 0X00
GOTO MAIN
ORG 0X10
;
INIT MOVLW LUPCNT
MOVWF COUNT
MOVF NUMHI,0
MOVWF SQRTHI
MOVF NUMLO,0
MOVWF SQRTLO
BCF STATUS,C
RRF SQRTHI,1
RRF SQRTLO,1
RETLW 0
;16×16位定点数右移子程序
DIV2 BCF STATUS,C
RRF ACCBHI,0
MOVWF SQRTHI
RRF ACCBLO,0
MOVWF SQRTLO
RETLW 0
;16×16位定点数开方子程序
SQRT CALL INIT
SLOOP MOVF NUMLO,0
MOVWF ACCBLO
MOVF NUMHI,0
MOVWF ACCBHI
CALL D_DIVS
CALL D_ADD
CALL DIV2
DECFSZ COUNT,1
GOTO SLOOP
RETURN
;16×16位定点整数除法子程序
D_DIVS CALL SETUP
&n
7楼: 参与讨论
作者: 小村之恋 于 2003-12-30 204300 发布:
--------------------------------------------------------------------------------
浮点数开方程序 小数点显示位置确定子程序
2.7 浮点数开方程序
如果被开方数是浮点数格式,代入的迭代初值也是浮点数格式,并且用浮点除法(浮点数的除以2操作可以由阶码减1得到)和浮点加法进行迭代运算,就是浮点数开方的基本思路。
以下为浮点数开方的程序清单(其中包含校验程序部分)。该程序中包含浮点数加法程序和浮点数除法程序,这些程序与前面章节列出的程序完全相同,不再列出。
LIST P=16F877
INCLUDE p16F877.inc
;
;此子程序是16尾数,8位阶码开方程序
;入口条件浮点数存放在ACCBHI和ACCBLO EXPB单元中.
;出口条件结果放在ACCBHI和ACCBLO EXPB单元中.
;迭代次数由LUPCNT的地址值决定
;用CALL SQRTF指令调用,
;内含浮点除程序,浮点加减程序
;
ACCALO EQU 20H
ACCAHI EQU ACCALO +1
EXPA EQU ACCALO +2
ACCBLO EQU ACCALO +3
ACCBHI EQU ACCALO +4
EXPB EQU ACCALO +5
ACCCLO EQU ACCALO +6
ACCCHI EQU ACCALO +7
ACCDLO EQU ACCALO +8
ACCDHI EQU ACCALO +9
TEMP EQU ACCALO +0A
TEMP1 EQU ACCALO +0B
TIMES EQU ACCALO +0C
SIGN EQU ACCALO +0D
COUNT EQU ACCALO +0E
C_MUL EQU ACCALO +0F
C_DIV EQU ACCALO +10
FPOL EQU ACCALO +11 ;符号放置位
NUMLO EQU FPOL+1
NUMHI EQU FPOL+2
NUMM EQU FPOL+4
LUPCNT EQU .10
CONSTANT C=0
CONSTANT Z=2
CONSTANT MODEL16=1
CONSTANT FALSE=0
;
ORG 0X0000
NOP
GOTO MAIN
ORG 0X0010
;
INIT1 DECF EXPB ;假设迭代根的初始值为其原值的一半
MOVF ACCBHI,W
MOVWF ACCAHI
MOVF ACCBLO,W
MOVWF ACCALO
MOVF EXPB,W
MOVWF EXPA
RETLW 0
SQRTF MOVLW LUPCNT
MOVWF COUNT
MOVF ACCBHI,W
MOVWF NUMHI
MOVF ACCBLO,W
MOVWF NUMLO
MOVF EXPB,W
MOVWF NUMM ;存储被开方的数
BTFSC ACCBHI,7
GOTO TIQIAN ;如果被开方数是个负数,则返回一极小数
CALL INIT1
SLOOP1 MOVF NUMLO,0
MOVWF ACCBLO
8楼: 参与讨论
作者: 小村之恋 于 2003-12-30 204700 发布:
--------------------------------------------------------------------------------
输入,输出 端口
3.1.2 简单应用实例
该例用于令与PORTD口相连的8个发光二极管前4个点亮,后4个熄灭。在调试程序前,应使与PORTD口相连的8位拔码开关拔向相应的位置。
例3.1 PORTD输出
LIST P=16F877
INCLUDE “P16F877.INC”
ORG 0X00
GOTO MIAN
ORG 0X10
MAIN NOP
BANKSEL TRISD ;选择BANK1
MOVLW 0X00
MOVWF TRISD ;TRISD 寄存器被赋值,PORTD每一位都为输出
BANKSEL PORTD ;选择BANK0, PORTD在存储0区
AGAIN MOVLW 0X0F
MOVWF PORTD ;向PORTD送数据,点亮LED(由实验模板的设计决
;定相应位置低时LED点亮)。
GOTO AGAIN ;反复向PORTD口送数
END
3.2 利用MSSP模块的SPI方式实现与LED数码显示接口
3.2.1 MSSP模块SPI方式的功能简介
例3.2 SPI初始化程序
SPIINT BANKSEL TRISC ;选定TRISC所在的存储体
BCF TRISC,3 ;设置SCK引脚为输出方式
BCF TRISC,5 ;设置SDO引脚为输出方式
MOVLW 0XC0
MOVWF SSPSTAT ;设置SSPSTAT寄存器,在串行时钟SCK的下降沿发送
;数据(后面设定SSPCON寄存器时CKP=1,选择上升
;沿还是下降沿发送数据,需要与外部接受芯片的时序相配 ;合)
BANKSEL SSPCON ;选择SSPCON所在的存储体
MOVLW 0X30
MOVWF SSPCON ;设置SSPCON寄存器,同步串行口使能,CKP=1
;且选择相应的时钟频率。
RETURN
3.2.3 程序清单
下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。
LIST P=16F877
INCLUDE P16F877.INC
;该程序用于在实验板上显示数字1、2、3、4、5、6、7、8
;所用的寄存器
XIANR EQU 0X20
ORG 0X00
GOTO MAIN
ORG 0X10
;以下为码值转换表
CONVERT ADDWF PCL,1
RETLW 0XC0 ;0,显示段码与具体的硬件连接有关
RETLW 0XF9 ;1
RETLW 0XA4 ;2
RETLW 0XB0 ;3
RETLW 0X99 ;4
RETLW 0X92 ;5
RETLW 0X82 ;6
RETLW 0XD8 ;7
RETLW 0X80 ;8
RETLW 0X90 ;9
RETLW
9楼: 参与讨论
作者: 小村之恋 于 2003-12-30 204800 发布:
--------------------------------------------------------------------------------
第4章 模拟量输入与输出
4.1 AD转换的应用
例4.1 AD转换初始化程序
ADINT MOVLW 0X51
MOVWF ADCON0 ;选择AD转换通道为RA2,且打开AD在工
;作状态,并使AD转换时钟为8tosc
BANKSEL ADCON1 ;选种BANK1体
MOVLW 0X80
MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高6位
;为“0”,且把RA2口设置成模拟量输入口
CLRF PIE1 ;禁止其它中断
BSF PIE1,ADIE ;AD转化中断允许
BSF TRISA,2 ;设置RA2口为输入方式
BSF INTCON,PEIE ;外围中断允许
BSF INTCON,GIE ;总中断允许
BCF STATUS,RP0 ;返回BANK0
RETURN
4.1.2程序清单
有关显示的部分请读者参考有关章节。
LIST P=16F877
INCLUDE P16F877.INC
;
;程序实现AD转换功能,AD采用中断方式。该程序通过单片机的RA2模拟通道
;送入一直流电压,当送入的直流电压大于2.5V时,8个LED闪动;当直流电压恢复到2.5V以下
;时,LED停止闪动。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结果
;用间接寻址的方式存取
;所用的寄存器
TIMES EQU 0X20
DEY EQU TIMES+1
ACCALO EQU TIMES+2
ACCAHI EQU TIMES+3
ACCBLO EQU TIMES+4
ACCBHI EQU TIMES+5
FLAG EQU TIMES+6
DEYH EQU TIMES+7
DEYL EQU TIMES+9
BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出)
ORG 0X0000
GOTO MAIN
ORG 0X0004
GOTO INTSERVE ;转向中断服务子程序
ORG 0X15
;双字节加、减法子程序
D_ sub ;详细程序语句请参考第2章
;初始化子程序
INITIAL MOVLW 0X51
MOVWF ADCON0 ;选择AD通道为RA2,且打开AD转换器
;在工作状态,且使AD转换时钟为8tosc
BANKSEL ADCON1
MOVLW 0X80 ;转换结果右移,ADRESH寄存器的高6
;位为“0”,且把RA2口置为模拟量输入方式
;(注意后面要把RA5改成数据IO方式,以
;输出显示琐存信号)
MOVWF ADCON1
CLRF &
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -