英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4855|回复: 4

门外汉学PIC的日记 转

[复制链接]
发表于 2012-8-22 10:38:17 | 显示全部楼层 |阅读模式
学习使用的资料,《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看的,否则它找你麻烦
;----------------------------------------------------------

-

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-3-29 14:36 , Processed in 0.062986 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表