min 发表于 2012-8-22 10:38:17

门外汉学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 ;延时子程序
RLFPORTC,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 ;延时子程序
RLFPORTC,0 ;将端口C的值左移一位并置入W寄存器
BTFSS STATUS,0;判断C端口左移时是否进位
GOTO DISPLAY1;未进位则继续显示并左移
INT2
MOVLW 80H;进位则将10000000置入累加器W,开始向右显示
DISPLAY2   ;行号
MOVWF PORTC ;将累加器W中的值赋予端口C
CALL DELAY ;延时子程序
RRFPORTC,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看的,否则它找你麻烦
;----------------------------------------------------------
-
页: [1]
查看完整版本: 门外汉学PIC的日记 转