PIC系列单片机程序设计基础
发布时间:2008/5/27 0:00:00 访问次数:419
http://www.hificat.com
1、pic单片机程序的基本格式
先介绍二条伪指令:
equ ——标号赋值伪指令
org ——地址定义伪指令
pic16c5x单片机在reset后指令计算器pc被置为全“1”,所以pic16c5x几种型号芯片的复位地址为:
pic16c54/55:1ffh
pic16c56:3ffh
pic16c57/58:7ffh
一般来说,pic单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。
title this is …… ;程序标题
;--------------------------------------
;名称定义和变量定义
;--------------------------------------
f0 equ 0
rtcc equ 1
pc equ 2
status equ 3
fsr equ 4
ra equ 5
rb equ 6
rc equ 7
┋
pic16c54 equ 1ffh ;芯片复位地址
pic16c56 equ 3ffh
pic16c57 equ 7ffh
;-----------------------------------------
org pic16c54 goto main ;在复位地址处转入主程序
org 0 ;在0000h开始存放程序
;-----------------------------------------
;子程序区
;-----------------------------------------
delay movlw 255
┋
retlw 0
;------------------------------------------
;主程序区
;------------------------------------------
main
movlw b‘00000000’
tris rb ;rb已由伪指令定义为6,即b口
┋
loop
bsf rb,7 call delay
bcf rb,7 call delay
┋
goto loop
;-------------------------------------------
end ;程序结束
注:main标号一定要处在0页面内。
2、pic单片机程序设计基础
1) 设置 i/o 口的输入/输出方向
pic16c5x单片机的i/o 口皆为双向可编程,即每一根i/o 端线都可分别单独地由程序设置为输入或输出。这个过程由写i/o控制寄存器tris f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。
movlw 0fh ;0000 1111(0fh)
输入 输出
tris 6 ;将w中的0fh写入b口控制器,
;b口高4位为输出,低4位为输入。
movlw 0c0h ; 11 000000(0c0h)
rb4,rb5输出0 rb6,rb7输出1
2) 检查寄存器是否为零
如果要判断一个寄存器内容是否为零,很简单,现以寄存器f10为例:
movf 10,1 ;f10→f10,结果影响零标记状态位z
btfss status,z ;f10为零则跳
goto nz ;z=0即f10不为零转入标号nz处程序
┋ ;z=1即f10=0处理程序
3) 比较二个寄存器的大小
要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位c来判断。注意,相减的结果放入w,则不会影响二寄存器原有的值。
例如f8和f9二个寄存器要比较大小:
movf 8,0 ;f8→w
subwf 9,0 ;f9—w(f8)→w
btfsc status,z ;判断f8=f9否
goto f8=f9
btfsc status,c ;c=0则跳
goto f9>f8 ;c=1相减结果为正,f9>f8
goto f9<f8 ;c=0相减结果为负,f9<f8
┋
4) 循环n次的程序
如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以f10做计数器,使程序循环8次。
count equ 10 ;定义f10名称为count(计数器)
┋
movlw 8
movwf count loop ;循环体
loop
┋
decfsz count,1 ;count减1,结果为零则跳
goto loop ;结果不为零,继续循环
┋ ;结果为零,跳出循环
5)“if……then……”格式的程序
下面以“if x=y
先介绍二条伪指令:
equ ——标号赋值伪指令
org ——地址定义伪指令
pic16c5x单片机在reset后指令计算器pc被置为全“1”,所以pic16c5x几种型号芯片的复位地址为:
pic16c54/55:1ffh
pic16c56:3ffh
pic16c57/58:7ffh
一般来说,pic单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。
title this is …… ;程序标题
;--------------------------------------
;名称定义和变量定义
;--------------------------------------
f0 equ 0
rtcc equ 1
pc equ 2
status equ 3
fsr equ 4
ra equ 5
rb equ 6
rc equ 7
┋
pic16c54 equ 1ffh ;芯片复位地址
pic16c56 equ 3ffh
pic16c57 equ 7ffh
;-----------------------------------------
org pic16c54 goto main ;在复位地址处转入主程序
org 0 ;在0000h开始存放程序
;-----------------------------------------
;子程序区
;-----------------------------------------
delay movlw 255
┋
retlw 0
;------------------------------------------
;主程序区
;------------------------------------------
main
movlw b‘00000000’
tris rb ;rb已由伪指令定义为6,即b口
┋
loop
bsf rb,7 call delay
bcf rb,7 call delay
┋
goto loop
;-------------------------------------------
end ;程序结束
注:main标号一定要处在0页面内。
2、pic单片机程序设计基础
1) 设置 i/o 口的输入/输出方向
pic16c5x单片机的i/o 口皆为双向可编程,即每一根i/o 端线都可分别单独地由程序设置为输入或输出。这个过程由写i/o控制寄存器tris f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。
movlw 0fh ;0000 1111(0fh)
输入 输出
tris 6 ;将w中的0fh写入b口控制器,
;b口高4位为输出,低4位为输入。
movlw 0c0h ; 11 000000(0c0h)
rb4,rb5输出0 rb6,rb7输出1
2) 检查寄存器是否为零
如果要判断一个寄存器内容是否为零,很简单,现以寄存器f10为例:
movf 10,1 ;f10→f10,结果影响零标记状态位z
btfss status,z ;f10为零则跳
goto nz ;z=0即f10不为零转入标号nz处程序
┋ ;z=1即f10=0处理程序
3) 比较二个寄存器的大小
要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位c来判断。注意,相减的结果放入w,则不会影响二寄存器原有的值。
例如f8和f9二个寄存器要比较大小:
movf 8,0 ;f8→w
subwf 9,0 ;f9—w(f8)→w
btfsc status,z ;判断f8=f9否
goto f8=f9
btfsc status,c ;c=0则跳
goto f9>f8 ;c=1相减结果为正,f9>f8
goto f9<f8 ;c=0相减结果为负,f9<f8
┋
4) 循环n次的程序
如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以f10做计数器,使程序循环8次。
count equ 10 ;定义f10名称为count(计数器)
┋
movlw 8
movwf count loop ;循环体
loop
┋
decfsz count,1 ;count减1,结果为零则跳
goto loop ;结果不为零,继续循环
┋ ;结果为零,跳出循环
5)“if……then……”格式的程序
下面以“if x=y
http://www.hificat.com
1、pic单片机程序的基本格式
先介绍二条伪指令:
equ ——标号赋值伪指令
org ——地址定义伪指令
pic16c5x单片机在reset后指令计算器pc被置为全“1”,所以pic16c5x几种型号芯片的复位地址为:
pic16c54/55:1ffh
pic16c56:3ffh
pic16c57/58:7ffh
一般来说,pic单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。
title this is …… ;程序标题
;--------------------------------------
;名称定义和变量定义
;--------------------------------------
f0 equ 0
rtcc equ 1
pc equ 2
status equ 3
fsr equ 4
ra equ 5
rb equ 6
rc equ 7
┋
pic16c54 equ 1ffh ;芯片复位地址
pic16c56 equ 3ffh
pic16c57 equ 7ffh
;-----------------------------------------
org pic16c54 goto main ;在复位地址处转入主程序
org 0 ;在0000h开始存放程序
;-----------------------------------------
;子程序区
;-----------------------------------------
delay movlw 255
┋
retlw 0
;------------------------------------------
;主程序区
;------------------------------------------
main
movlw b‘00000000’
tris rb ;rb已由伪指令定义为6,即b口
┋
loop
bsf rb,7 call delay
bcf rb,7 call delay
┋
goto loop
;-------------------------------------------
end ;程序结束
注:main标号一定要处在0页面内。
2、pic单片机程序设计基础
1) 设置 i/o 口的输入/输出方向
pic16c5x单片机的i/o 口皆为双向可编程,即每一根i/o 端线都可分别单独地由程序设置为输入或输出。这个过程由写i/o控制寄存器tris f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。
movlw 0fh ;0000 1111(0fh)
输入 输出
tris 6 ;将w中的0fh写入b口控制器,
;b口高4位为输出,低4位为输入。
movlw 0c0h ; 11 000000(0c0h)
rb4,rb5输出0 rb6,rb7输出1
2) 检查寄存器是否为零
如果要判断一个寄存器内容是否为零,很简单,现以寄存器f10为例:
movf 10,1 ;f10→f10,结果影响零标记状态位z
btfss status,z ;f10为零则跳
goto nz ;z=0即f10不为零转入标号nz处程序
┋ ;z=1即f10=0处理程序
3) 比较二个寄存器的大小
要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位c来判断。注意,相减的结果放入w,则不会影响二寄存器原有的值。
例如f8和f9二个寄存器要比较大小:
movf 8,0 ;f8→w
subwf 9,0 ;f9—w(f8)→w
btfsc status,z ;判断f8=f9否
goto f8=f9
btfsc status,c ;c=0则跳
goto f9>f8 ;c=1相减结果为正,f9>f8
goto f9<f8 ;c=0相减结果为负,f9<f8
┋
4) 循环n次的程序
如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以f10做计数器,使程序循环8次。
count equ 10 ;定义f10名称为count(计数器)
┋
movlw 8
movwf count loop ;循环体
loop
┋
decfsz count,1 ;count减1,结果为零则跳
goto loop ;结果不为零,继续循环
┋ ;结果为零,跳出循环
5)“if……then……”格式的程序
下面以“if x=y
先介绍二条伪指令:
equ ——标号赋值伪指令
org ——地址定义伪指令
pic16c5x单片机在reset后指令计算器pc被置为全“1”,所以pic16c5x几种型号芯片的复位地址为:
pic16c54/55:1ffh
pic16c56:3ffh
pic16c57/58:7ffh
一般来说,pic单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。
title this is …… ;程序标题
;--------------------------------------
;名称定义和变量定义
;--------------------------------------
f0 equ 0
rtcc equ 1
pc equ 2
status equ 3
fsr equ 4
ra equ 5
rb equ 6
rc equ 7
┋
pic16c54 equ 1ffh ;芯片复位地址
pic16c56 equ 3ffh
pic16c57 equ 7ffh
;-----------------------------------------
org pic16c54 goto main ;在复位地址处转入主程序
org 0 ;在0000h开始存放程序
;-----------------------------------------
;子程序区
;-----------------------------------------
delay movlw 255
┋
retlw 0
;------------------------------------------
;主程序区
;------------------------------------------
main
movlw b‘00000000’
tris rb ;rb已由伪指令定义为6,即b口
┋
loop
bsf rb,7 call delay
bcf rb,7 call delay
┋
goto loop
;-------------------------------------------
end ;程序结束
注:main标号一定要处在0页面内。
2、pic单片机程序设计基础
1) 设置 i/o 口的输入/输出方向
pic16c5x单片机的i/o 口皆为双向可编程,即每一根i/o 端线都可分别单独地由程序设置为输入或输出。这个过程由写i/o控制寄存器tris f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。
movlw 0fh ;0000 1111(0fh)
输入 输出
tris 6 ;将w中的0fh写入b口控制器,
;b口高4位为输出,低4位为输入。
movlw 0c0h ; 11 000000(0c0h)
rb4,rb5输出0 rb6,rb7输出1
2) 检查寄存器是否为零
如果要判断一个寄存器内容是否为零,很简单,现以寄存器f10为例:
movf 10,1 ;f10→f10,结果影响零标记状态位z
btfss status,z ;f10为零则跳
goto nz ;z=0即f10不为零转入标号nz处程序
┋ ;z=1即f10=0处理程序
3) 比较二个寄存器的大小
要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位c来判断。注意,相减的结果放入w,则不会影响二寄存器原有的值。
例如f8和f9二个寄存器要比较大小:
movf 8,0 ;f8→w
subwf 9,0 ;f9—w(f8)→w
btfsc status,z ;判断f8=f9否
goto f8=f9
btfsc status,c ;c=0则跳
goto f9>f8 ;c=1相减结果为正,f9>f8
goto f9<f8 ;c=0相减结果为负,f9<f8
┋
4) 循环n次的程序
如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以f10做计数器,使程序循环8次。
count equ 10 ;定义f10名称为count(计数器)
┋
movlw 8
movwf count loop ;循环体
loop
┋
decfsz count,1 ;count减1,结果为零则跳
goto loop ;结果不为零,继续循环
┋ ;结果为零,跳出循环
5)“if……then……”格式的程序
下面以“if x=y