您现在所在的是:

单片机论坛

回帖:1个,阅读:883 [上一页] [1] [下一页]
997
xy771015
文章数:14
年度积分:50
历史总积分:997
注册时间:2006/7/11
发站内信
发表于:2006/11/21 10:07:00
#0楼
;-------------------------------------------
;文件名“2_1.ASM”
;功能:对PIC16F877的C端口八位输入进行扫描,
;然后将其输入通过D口的八位输出来显示。
;------------------------------------------
STATUS EQU 03H ;定义状态寄存器地址
PORTC EQU 07H ;定义端口C的数据寄存器地址
PORTD EQU 08H ;定义端口D的数据寄存器地址
TRISC EQU 87H ;定义端口C的方向寄存器
TRISD EQU 88H ;定义端口D的方向寄存器
RP1 EQU 06H ;定义状态寄存器中的页选位RP1
RP0 EQU 05H ;定义状态寄存器中的页选位RP0
Z EQU 02H ;定义状态寄存器中的0标志位Z

DATA1 EQU 20H ;定义外循环变量
DATA2 EQU 21H ;定义内循环变量
TEMP EQU 22H ;定义临时变量存储端口D的输入
COUNT1 EQU 07FH ;定义存储外循环次数的变量
COUNT2 EQU 0FFH ;定义存储内循环次数的变量
;-------------------------------------------------
ORG 00H ;初始定位
GOTO MAIN ;
MAIN
;-----------------初始化--------------------------
BCF STATUS,RP1 ;转到BANK1
BSF STATUS,RP0 ;
MOVLW 00H ;将端口D的方向控制字先送到W
MOVWF TRISD ;然后再转送到端口D的方向寄存器
MOVLW 0FFH ;将端口C的方向控制字先送到W
MOVWF TRISC ;然后再转送到端口C的方向寄存器

BCF STATUS,RP0 ;转到BANK0

;---------------第一次查询端口D的状态-------------
CHECK1
MOVF TRISD,0 ;将端口D的状态先送到W
MOVWF TEMP ;再将端口D的状态暂存到TEMP
CALL DELAY ;调用延时程序DELAY1,延时100ms

CHECK2
MOVF TRISD,0 ;将端口D的状态先送到W

SUBWF TEMP,0 ;将端口D的状态与第一次读取的值相减
BTFSS STATUS,Z ;测试状态寄存器的Z,如果是0,则两次的值不相等
GOTO WAIT ;转到等待100ms,在进行下一次测试;
GOTO OUTPUT ;如果是1,则两次的值相等,转到输出部分

WAIT
CALL DELAY ;延时100ms
GOTO CHECK1 ;转到CHECK1进行下一次扫描

OUTPUT
MOVF TEMP,0 ;将扫描到的端口D的数据存到W中
MOVWF PORTC ;将端口D的数据输出到端口C
GOTO CHECK1 ;转到CHECK1进行下一次扫描

;***************************延时子程序****************************************
DELAY
MOVLW COUNT1 ;设置外部循环的次数
MOVWF DATA1 ;
LOOP1
MOVLW COUNT2 ;设置内部循环的次数
MOVWF DATA2 ;
LOOP2
DECFSZ DATA2,1 ;内部循环变量自减1,为0则跳转
GOTO LOOP2 ;
DECFSZ DATA1,1 ;外部循环变量自减1,为0则跳转
GOTO LOOP1 ;
RETURN ;延时子程序返回
; ***************************延时子程序结束*************************************

END ;源程序结束
1121
屏凡
文章数:78
年度积分:50
历史总积分:1121
注册时间:2006/4/21
发站内信
发表于:2006/11/24 8:53:00
#1楼
什么问题??

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003