英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流
标题:
门外汉学PIC的日记 转
[打印本页]
作者:
min
时间:
2012-8-22 10:38
标题:
门外汉学PIC的日记 转
学习使用的资料,《PIC单片机实用教程-基础篇》,《MPLAB IDE用户指南》,《MPASM用户指南》,《PICmicro中档单片机参考手册》
学习使用的硬件,ICD1的DEMO板,ICD2,ICD3,QL200,还有877的最小系统板
第一课,跑马灯~~~~
前期准备是学习如何安装MPLAB IDE,如何连接你的ICD,如何使用IDE和ICD。
代码自己写,一边想一边写,记不住的指令看表,用久了就记住了。
;**********************************************************
; 程序概述
;项目名称:跑马灯
;目标MCU型号:PIC16F877A
;功能描述:
;硬件连接:端口C连接发光二极管
;源文件名:
;;**********************************************************
;----------------------------------------------------------
;程序配置区
;----------------------------------------------------------
list p=16f877a ; 设置MUC类型
#include <p16f877a.inc> ; 引用MCU文件
; 配置MCU
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;----------------------------------------------------------
;符号名定义及变量定义,见PIC16F877寄存器结构
;----------------------------------------------------------
STATUS EQU 03H ;定义状态寄存器
PORTC EQU 07H ;定义端口C数据寄存器
TRISC EQU 87H ;定义端口C方向控制寄存器
;----------------------------------------------------------
;复位及中断矢量
;----------------------------------------------------------
ORG 0000H ;复位矢量
GOTO MAIN ;跳转至主程序
ORG 0004H ;中断矢量
;----------------------------------------------------------
;中断程序区
;----------------------------------------------------------
;----------------------------------------------------------
;主程序区
;----------------------------------------------------------
MAIN
NOP ;ICD运行所需的一条NOP
BSF STATUS,5 ;选择寄存器体1
MOVLW 00H ;将00000000置入累加器W
MOVWF TRISC ;将端口C置于输出状态
BCF STATUS,5 ;选择寄存器体0
INT ;行号,重新赋值给累加器W
MOVLW 01H ;将00000001置入累加器W
DISPLAY ;行号
MOVWF PORTC ;将累加器W中的值赋予端口C
CALL DELAY ;延时子程序
RLF PORTC,0 ;将端口C的值左移一位并置入W寄存器
BTFSS STATUS,0;判断C端口左移时是否进位
GOTO DISPLAY ;未进位则继续显示并左移
GOTO INT ;进位则重新赋予累加器W的值
;----------------------------------------------------------
DELAY ;行号
MOVLW 0FFH ;把立即数0FFH置于累加器W
MOVWF 20H ;将W的值置于地址20H作为外层计数
LP0 ;行号,用于外层循环
MOVLW 0FFH ;把立即数0FFH置于累加器W
MOVWF 21H ;将W的值置于地址21H作为内层计数
LP1 ;行号,用于内层循环
DECFSZ 21H,1 ;内层计数判断,若不为0则递减
GOTO LP1 ;若内层计数不为0则继续减
DECFSZ 20H,1 ;若内层计数为0则判断外层计数,若不为0则递减
GOTO LP0 ;若外内层计数不为0则继续进入内层循环
RETURN ;若外层计数为0则返回主程序
;----------------------------------------------------------
END ;程序结束,写给MPASM看的,否则它找你麻烦
;---------------------------------------------------------
更改了流水灯的走向。
;**********************************************************
; 程序概述
;项目名称:
;目标MCU型号:PIC16F877A
;功能描述:
;硬件连接:端口C连接发光二极管
;源文件名:
;**********************************************************
;----------------------------------------------------------
;程序配置区
;----------------------------------------------------------
list p=16f877a ; 设置MUC类型
#include <p16f877a.inc> ; 引用MCU文件
; 配置MCU
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;----------------------------------------------------------
;符号名定义及变量定义,见PIC16F877寄存器结构
;----------------------------------------------------------
STATUS EQU 03H ;定义状态寄存器
PORTC EQU 07H ;定义端口C数据寄存器
TRISC EQU 87H ;定义端口C方向控制寄存器
;----------------------------------------------------------
;复位及中断矢量
;----------------------------------------------------------
ORG 0000H ;复位矢量
GOTO MAIN ;跳转至主程序
ORG 0004H ;中断矢量
;----------------------------------------------------------
;中断程序区
;----------------------------------------------------------
;----------------------------------------------------------
;主程序区
;----------------------------------------------------------
MAIN
NOP ;ICD运行所需的一条NOP
BSF STATUS,5 ;选择寄存器体1
MOVLW 00H ;将00000000置入累加器W
MOVWF TRISC ;将端口C置于输出状态
BCF STATUS,5 ;选择寄存器体0
INT1 ;行号,重新赋值给累加器W
MOVLW 01H ;将00000001置入累加器W
DISPLAY1 ;行号
MOVWF PORTC ;将累加器W中的值赋予端口C
CALL DELAY ;延时子程序
RLF PORTC,0 ;将端口C的值左移一位并置入W寄存器
BTFSS STATUS,0;判断C端口左移时是否进位
GOTO DISPLAY1;未进位则继续显示并左移
INT2
MOVLW 80H ;进位则将10000000置入累加器W,开始向右显示
DISPLAY2 ;行号
MOVWF PORTC ;将累加器W中的值赋予端口C
CALL DELAY ;延时子程序
RRF PORTC,0 ;将端口C的值右移一位并置入W寄存器
BTFSS STATUS,0;判断C端口右移时是否进位
GOTO DISPLAY2;未进位则继续显示并右移
GOTO INT1 ;进位则跳转到左移显示的初始位置,开始向左显示
;----------------------------------------------------------
DELAY ;行号
MOVLW 0FFH ;把立即数0FFH置于累加器W
MOVWF 20H ;将W的值置于地址20H作为外层计数
LP0 ;行号,用于外层循环
MOVLW 0FFH ;把立即数0FFH置于累加器W
MOVWF 21H ;将W的值置于地址21H作为内层计数
LP1 ;行号,用于内层循环
DECFSZ 21H,1 ;内层计数判断,若不为0则递减
GOTO LP1 ;若内层计数不为0则继续减
DECFSZ 20H,1 ;若内层计数为0则判断外层计数,若不为0则递减
GOTO LP0 ;若外内层计数不为0则继续进入内层循环
RETURN ;若外层计数为0则返回主程序
;----------------------------------------------------------
END ;程序结束,写给MPASM看的,否则它找你麻烦
;----------------------------------------------------------
-
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2