pic单片机控制LED8位流水灯探讨
扫描二维码
随时随地手机看文章
1.最简单的点亮LED程序(C)
//实验目的:点亮RC0口的LED
//硬件设置:拨码开关S11的第8位置ON,其他各位关闭。
#include
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
#include
#include
void main() //主程序
{
while(1) //死循环,让RC0一直亮
{
TRISC=0xfe; //RC0输出,其他输入
PORTC=0x01; //RCO输出高电平,点亮LED
}
}
2.LED8位流水灯《霹雳灯》左移到第七位,再从第七位右移到第一位,再循环。(汇编)
;MCD1实战一,LED8位流水灯《霹雳灯》左移到第七位,再从第七位右移到第一位,再循环。
;该实战的目的作为学习和应用MCD1在线调试工具套件,进行项目的软件和硬件
;联合调试的范例程序,也就是当做一个用户程序实例,而演示板暂时充当用户电
;路的角色。这样就构成了一个软件、硬件齐全的自制项目模拟环境。
;本程序实现的功能是,把端口RC的8条引脚全部设置为输出模式,依次从引脚RC0
;到RC7送出高电平,然后再依次从引脚RC7到RC0送出高电平,并且周而复始,从而
;使得与该端口C相连的8只发光二极管LED循环依次点亮,其效果类似于一个简单的霹雳灯。
;该程序可用于PIC16F87X(A)所有系列
;PIC单片机学习网http://www.pic16.com
;************************************************
;《霹雳灯》程序。文件名为“mcd-led1.ASM”
;**************************************************
__CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭
;****************************************************
status equ 3h ;定义状态寄存器地址
portc equ 7h ;定义端口C的数据寄存器地址
trisc equ 87h ;定义端口C的方向控制寄存器地址
flag equ 25h ;定义一个控制左移/右移的标志寄存器
;***********************************************************
org 0000h ;定义程序存放区域的起始地址
nop ;放置一条ICD必须的空操用指令
bsf status,5 ;设置文件寄存器的体1
movlw 00h ;对端口C的方向控制码00H先送W
movwf trisc ;再由W转移到方向控制寄存器
bcf status,5 ;恢复到文件寄存器体0
movlw 01h ;将00000001B先送W
movwf portc ;再由W转移到数据寄存器
bsf flag,0 ;将左右移标志位置1,首先进行左移LED
bcf status,0 ;将标志位C先清0
loop btfss status,0 ;测试进位/借位位,是1则修改标志
goto loop1 ;是0则不修改标志
comf flag,1 ;FLAG的BIT0作为标志位,把它取反
loop1 btfss flag,0 ;判断标志位,是1则跳到循环左移
goto loop2 ;是0则跳到循环右移
rlf portc,0 ;循环左移端口C数据寄存器,结果送W
movwf portc ;将结果再送回端口C的数据寄存器
goto loop3 ;跳过下面两条指令
loop2 rrf portc,0 ;循环右移端口C数据寄存器,结果送回W
movwf portc ;将结果再送回端口C的数据寄存器 ;
loop3 call delay ;调用廷时子程序
goto loop ;返回
;-------------------------廷时子程序----------------------------
delay ;子程序名,也是子程序入口地址
movlw 0ffh ;将外层循环参数值FFH经过W
movwf 20h ;送入用作外循环变量的20H单元
lp0 movlw 0ffh ;将内层循环参数值FFH经过W
movwf 21h ;送入用作内循环变量的21H单元
lp1 decfsz 21h,1 ;变量21H内容递减,若为0跳跃
goto lp1 ;跳转到LP1处
decfsz 20h,1 ;变量20H内容递减,若为0跳跃
goto lp0 ;跳跃到LP0处
return ;返回主程序
end ;源程序结束
;****************************************************************
; 进入该实战演练的工序流程如下:
; 1.软硬件的安装:按照本说明书前面讲的”MPLAB-ICD的安装和使用”一节内介绍的方法操作即可.
; 2.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”
; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的
; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.
; 3.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB
; 并进入MPLAB的桌面.
; 4.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将
; 用记事本创建的源文件加入到该项目中.
; 5.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目
; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).
; 6.ICD参数设置:通过菜单命令Project>Edit Project或者Option>Development Mode,将开发模式设置为
; ”MPLAB ICD Debugger”,点击OK按钮,打开ICD的工作窗口,在调试阶段,可以按照说明书图2-10设置各项,但需注意
; OSCILLATOR应设置为XT方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目
; 标单片机烧写机器码程序时,会将调试临控程序同时写入单片机的指定程序存储器区域,然后才允许用ICD方式调试。
; 7.电路设置:将演示板的S1全部拔到ON,S4全部拔到OFF,S13的第5、第6、第7全部拔到OFF ,LCD不要插在演示板上,
; 以使端口C只与8只发光二极管接通;将用于选择频率的插针跳线插到”XT OSC”位置上.
; 8.向目标单片机烧写目标程序:用户在点击功能按钮”Program”向目标单片机烧写机器码程序时,会等待一段时间,
; 并且在条状的状态信息栏中,出现提示信息。有一点需要引起注意,就是PIC16F87X单片机的FLASH程序存储器的擦写
; 周期是有限的,大约为1000次,应尽量节省它的使用寿命。
; 9.运行和调试用户程序和用户电路:在各项参数设置好后,将ICD的工作窗口最小化,利用前面讲的”运行及调试”中介
; 绍的几种方法进行调试.当用自动单步方式调试时,建议临时禁止廷时子程序发挥作用,具体的方法是,可在CALL DELAY指
; 令前添加一个分号,并且重新汇编一次.为了学习目的,在调试过程中可以人为地加入一些软件漏洞(BUG)或硬件故障,来模
; 仿单片机端口引脚的片内或片外故障.
; 10.定型烧写目标单片机;经过多次重复上述步骤的反复修改和调试,使得程序和电路在联机状态完全正常,这时可以进行
; 定型烧写,即将ICD窗口中的”Enable Debug Mode”(使能调试模式)选项消除,不再将调试临控程序写入单片机中.
; 11.独立运行验收:上一步中的烧写过程完成后,即可将ICD模块和ICD仿真头(或演示板)之间的6芯电缆断开,让单片机在
; 演示板独立运行,观察实际效果.
;
;
3.
LED8位流水灯《霹雳灯》左移到第七位,再从第七位右移到第一位,再循环。(汇编,另一种循环方法,通过改变C端口各位的输入输出方向来点亮流水灯。)
;LED流水灯的另一种实现方法
;使用资源
;1、PORTC口,8个流水灯LED
;功能说明
;1、该程序首先把C口输出全0,然后通过改变输入输出方向来电亮流水灯。
;2、先从最低位电亮,点亮到最高位后,又从最高位开始点亮到最低位,如此循环。
;3、通过改变DELAY延时时间的长短可改变流水等点亮的速度。
;硬件连接
;1、DEMO实验板作以下设置 s1拔到ON。
;2、S4,S5全部拔到OFF LCD不要插在演示板上
;本实例原提供者:pic16论坛会员:学期班 ,在此鸣谢学前班同志共享本实例.
;由深圳市乾龙盛电子科技有限公司技术部钟闺田(工程师)(论坛网名:zhongruntian)验正并加于整理、注释.
;网站:PIC单片机学习网http://www.pic16.com 讨论论坛:http://pic16.com/bbs/
;版权所有,转载请注明出处,并不能去掉或改变文件中的说明文字。
;程序文件名“LED.ASM“
;源程序如下:
;LIST P=16F877A R=DEC
;OST 4MHZ
;DATE 2006.04.27
;***********************************
;__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SPECIAL REGISTER
STATUS EQU 83H
RC EQU 07H
TRISC EQU 87H
AB0 EQU 20H
AB1 EQU 21H
AB2 EQU 22H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;STATUS BIT
C EQU 0
DC EQU 1
Z EQU 2
RP0 EQU 5
RP1 EQU 6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PROGRAM ST
ORG 0000H ;复位地址
NOP ;放置一条MCD所需的空指令
ST
CLRF RC ;所有C口输出为低,关闭所有显示
BSF STATUS,5 ;选体1
LOOP MOVLW B'11111110' ;先点亮RC0
MOVWF TRISC
BCF STATUS,5 ;回到体0
MOVLW B'11111111' ;所有输出为1,只要相应的位被设置为输出,即可点亮
MOVWF RC
CALL DELAY ;延时一段时间,保证LED的亮度
BSF STATUS,5
BSF STATUS,C
LOOP1 RLF TRISC,F ;点亮的位左移一位
CALL DELAY ;延时
BTFSC STATUS,C ;判断是否点亮到了RC7 **********是btfsc,而非btfss*******************************
GOTO LOOP1 ;否,继续左移0
MOVLW B'01111111' ;是,点亮RC7位
MOVWF TRISC
CALL DELAY
BSF STATUS,0
LOOP2 RRF TRISC ,F ;点亮的位右移一位
CALL DELAY
BTFSC STATUS,C ;是否点亮到最低位 **********是btfsc,而非btfss*******************************
GOTO LOOP2 ;否,继续右移
GOTO LOOP ;是,重新开始新一轮循环
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY 0.12S
DELAY
MOVLW 0FFH
MOVWF AB0
DELAY1 MOVLW 0DH
MOVWF AB1
DELAY2
MOVLW 0BH
MOVWF AB2
DELAY3
DECFSZ AB2,F
GOTO DELAY3
DECFSZ AB1,F
GOTO DELAY2
DECFSZ AB0,F
GOTO DELAY1
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END ;源程序结束
; 进入该实战演练的工序流程如下:
; 1.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”
; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的
; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.
; 2.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB
; 并进入MPLAB的桌面.
; 3.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将
; 用记事本创建的源文件加入到该项目中.
; 4.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目
; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).
4. LED8位流水灯《霹雳灯》左移到第七位,再从第七位右移到第一位,再循环。(汇编,第三种实现方式,利用左移的性质)
;改为一直循环左移
;************************************************
;**************************************************
__CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭
;****************************************************
status equ 3h ;定义状态寄存器地址
portc equ 7h ;定义端口C的数据寄存器地址
trisc equ 87h ;定义端口C的方向控制寄存器地址
flag equ 25h ;定义一个控制左移/右移的标志寄存器
;***********************************************************
org 0000h ;定义程序存放区域的起始地址
nop ;放置一条ICD必须的空操用指令
bsf status,5 ;设置文件寄存器的体1
movlw 00h ;对端口C的方向控制码00H先送W
movwf trisc ;再由W转移到方向控制寄存器
bcf status,5 ;恢复到文件寄存器体0
movlw 01h ;将00000001B先送W
movwf portc ;再由W转移到数据寄存器
call delay ;
bsf flag,0 ;将左右移标志位置1,首先进行左移LED
bcf status,0 ;将标志位C先清0
loop
rlf portc,0 ;循环左移端口C数据寄存器,结果送W
movwf portc ;将结果再送回端口C的数据寄存器
call delay ;
goto loop ;跳过下面两条指令
;-------------------------廷时子程序----------------------------
delay ;子程序名,也是子程序入口地址
movlw 0ffh ;将外层循环参数值FFH经过W
movwf 20h ;送入用作外循环变量的20H单元
lp0 movlw 0ffh ;将内层循环参数值FFH经过W
movwf 21h ;送入用作内循环变量的21H单元
lp1 decfsz 21h,1 ;变量21H内容递减,若为0跳跃
goto lp1 ;跳转到LP1处
decfsz 20h,1 ;变量20H内容递减,若为0跳跃
goto lp0 ;跳跃到LP0处
return ;返回主程序
end ;源程序结束
;****************************************************************
; 进入该实战演练的工序流程如下:
; 1.软硬件的安装:按照本说明书前面讲的”MPLAB-ICD的安装和使用”一节内介绍的方法操作即可.
; 2.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”
; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的
; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.
; 3.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB
; 并进入MPLAB的桌面.
; 4.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将
; 用记事本创建的源文件加入到该项目中.
; 5.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目
; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).
; 6.ICD参数设置:通过菜单命令Project>Edit Project或者Option>Development Mode,将开发模式设置为
; ”MPLAB ICD Debugger”,点击OK按钮,打开ICD的工作窗口,在调试阶段,可以按照说明书图2-10设置各项,但需注意
; OSCILLATOR应设置为XT方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目
; 标单片机烧写机器码程序时,会将调试临控程序同时写入单片机的指定程序存储器区域,然后才允许用ICD方式调试。
; 7.电路设置:将演示板的S1全部拔到ON,S4全部拔到OFF,S13的第5、第6、第7全部拔到OFF ,LCD不要插在演示板上,
; 以使端口C只与8只发光二极管接通;将用于选择频率的插针跳线插到”XT OSC”位置上.
; 8.向目标单片机烧写目标程序:用户在点击功能按钮”Program”向目标单片机烧写机器码程序时,会等待一段时间,
; 并且在条状的状态信息栏中,出现提示信息。有一点需要引起注意,就是PIC16F87X单片机的FLASH程序存储器的擦写
; 周期是有限的,大约为1000次,应尽量节省它的使用寿命。
; 9.运行和调试用户程序和用户电路:在各项参数设置好后,将ICD的工作窗口最小化,利用前面讲的”运行及调试”中介
; 绍的几种方法进行调试.当用自动单步方式调试时,建议临时禁止廷时子程序发挥作用,具体的方法是,可在CALL DELAY指
; 令前添加一个分号,并且重新汇编一次.为了学习目的,在调试过程中可以人为地加入一些软件漏洞(BUG)或硬件故障,来模
; 仿单片机端口引脚的片内或片外故障.
; 10.定型烧写目标单片机;经过多次重复上述步骤的反复修改和调试,使得程序和电路在联机状态完全正常,这时可以进行
; 定型烧写,即将ICD窗口中的”Enable Debug Mode”(使能调试模式)选项消除,不再将调试临控程序写入单片机中.
; 11.独立运行验收:上一步中的烧写过程完成后,即可将ICD模块和ICD仿真头(或演示板)之间的6芯电缆断开,让单片机在
; 演示板独立运行,观察实际效果.
;
;
5. LED8位流水灯《霹雳灯》左移到第七位,再从第七位右移到第一位,再循环。(C,第三种实现方式,利用左移的性质)
//实验目的:本程序主要实现一个简单的流水灯程序
//即轮流点亮C口的8个灯(先点亮RC0,再熄灭RCO点亮RC1。。。。)
//硬件要求:拨码开关S11全部置ON。
#include
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
void delay(); //delay函数申明
void main() //主函数
{
while(1) //死循环,让C口流水灯一直工作
{
char i; //定义整型变量
TRISC=0X00; //C口定义为输出
PORTC=0X01; //点亮RCO口LED
for(i=8;i>0;i--) //循环左移7次
{
delay();
delay(); //调用一定的延时程序,保证闪烁的速率
PORTC=PORTC<<1; //显示左移一位(RC0-->RC7-->RC0)
}
}
}
void delay() //延时子程序
{
int i; //定义整型变量
for(i=5000;i>0;i--)
{;} //空函数,什么也不执行,只是消耗一定的时间
}
6.LED8位流水灯《霹雳灯》从0位开始左移,移到第七位时直接跳到零位,再左移,循环(汇编)
;改为从0位开始左移,移到第七位时直接跳到零位,再左移。
;**************************************************
__CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭
;****************************************************
status equ 3h ;定义状态寄存器地址
portc equ 7h ;定义端口C的数据寄存器地址
trisc equ 87h ;定义端口C的方向控制寄存器地址
flag equ 25h ;定义一个控制左移/右移的标志寄存器
;***********************************************************
org 0000h ;定义程序存放区域的起始地址
nop ;放置一条ICD必须的空操用指令
bsf status,5 ;设置文件寄存器的体1
movlw 00h ;对端口C的方向控制码00H先送W
movwf trisc ;再由W转移到方向控制寄存器
bcf status,5 ;恢复到文件寄存器体0
loop2 movlw 01h ;将00000001B先送W
movwf portc ;再由W转移到数据寄存器
call delay ;
bsf flag,0 ;将左右移标志位置1,首先进行左移LED
bcf status,0 ;将标志位C先清0
loop btfss status,0 ;测试进位/借位位,是1则修改标志
goto loop1 ;是0则不修改标志
comf flag,1 ;FLAG的BIT0作为标志位,把它取反
loop1 btfss flag,0 ;判断标志位,是1则跳到循环左移
goto loop2 ;是0则跳回原处
rlf portc,0 ;循环左移端口C数据寄存器,结果送W
movwf portc ;将结果再送回端口C的数据寄存器
goto loop3 ;跳过下面两条指令
loop3 call delay ;调用廷时子程序
goto loop ;返回
;-------------------------廷时子程序----------------------------
delay ;子程序名,也是子程序入口地址
movlw 0ffh ;将外层循环参数值FFH经过W
movwf 20h ;送入用作外循环变量的20H单元
lp0 movlw 0ffh ;将内层循环参数值FFH经过W
movwf 21h ;送入用作内循环变量的21H单元
lp1 decfsz 21h,1 ;变量21H内容递减,若为0跳跃
goto lp1 ;跳转到LP1处
decfsz 20h,1 ;变量20H内容递减,若为0跳跃
goto lp0 ;跳跃到LP0处
return ;返回主程序
end ;源程序结束
;****************************************************************
; 进入该实战演练的工序流程如下:
; 1.软硬件的安装:按照本说明书前面讲的”MPLAB-ICD的安装和使用”一节内介绍的方法操作即可.
; 2.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”
; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的
; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.
; 3.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始>程序>Microchip MPLAB>MPLAB命令,启动MPLAB
; 并进入MPLAB的桌面.
; 4.创建项目:选用菜单File>New或Project>New Project,在事先建立的一个专用子目录下创建一个新项目,将
; 用记事本创建的源文件加入到该项目中.
; 5.建立项目中的目标文件:选择菜单Project >Build All(项目>建立所有文件),MPLAB将自动调用MPASM将项目
; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).
; 6.ICD参数设置:通过菜单命令Project>Edit Project或者Option>Development Mode,将开发模式设置为
; ”MPLAB ICD Debugger”,点击OK按钮,打开ICD的工作窗口,在调试阶段,可以按照说明书图2-10设置各项,但需注意
; OSCILLATOR应设置为XT方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目
; 标单片机烧写机器码程序时,会将调试临控程序同时写入单片机的指定程序存储器区域,然后才允许用ICD方式调试。
; 7.电路设置:将演示板的S1全部拔到ON,S4全部拔到OFF,S13的第5、第6、第7全部拔到OFF ,LCD不要插在演示板上,
; 以使端口C只与8只发光二极管接通;将用于选择频率的插针跳线插到”XT OSC”位置上.
; 8.向目标单片机烧写目标程序:用户在点击功能按钮”Program”向目标单片机烧写机器码程序时,会等待一段时间,
; 并且在条状的状态信息栏中,出现提示信息。有一点需要引起注意,就是PIC16F87X单片机的FLASH程序存储器的擦写
; 周期是有限的,大约为1000次,应尽量节省它的使用寿命。
; 9.运行和调试用户程序和用户电路:在各项参数设置好后,将ICD的工作窗口最小化,利用前面讲的”运行及调试”中介
; 绍的几种方法进行调试.当用自动单步方式调试时,建议临时禁止廷时子程序发挥作用,具体的方法是,可在CALL DELAY指
; 令前添加一个分号,并且重新汇编一次.为了学习目的,在调试过程中可以人为地加入一些软件漏洞(BUG)或硬件故障,来模
; 仿单片机端口引脚的片内或片外故障.
; 10.定型烧写目标单片机;经过多次重复上述步骤的反复修改和调试,使得程序和电路在联机状态完全正常,这时可以进行
; 定型烧写,即将ICD窗口中的”Enable Debug Mode”(使能调试模式)选项消除,不再将调试临控程序写入单片机中.
; 11.独立运行验收:上一步中的烧写过程完成后,即可将ICD模块和ICD仿真头(或演示板)之间的6芯电缆断开,让单片机在
; 演示板独立运行,观察实际效果.