📄 pic2.htm
字号:
<html>
<head>
<title>PIC学习/PIC系列单片机程序设计基础</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
BODY {font-size:12px;font-family:宋体;}
td {font-size:12px;font-family:宋体;}
A:link { COLOR: #0000ff; TEXT-DECORATION: underline}
A:visited { COLOR:#0000ff; TEXT-DECORATION: underline}
A:active { COLOR:red! important; TEXT-DECORATION: underline}
A:hover { TEXT-DECORATION: none}
.b24 a:link { FONT-SIZE: 12px; COLOR:#0000ff; TEXT-DECORATION: underline}
.b24 a:visited {FONT-SIZE: 12px; COLOR:#0000ff; TEXT-DECORATION: underline}
.b24 a:active { FONT-SIZE: 12px; COLOR:#0000ff; TEXT-DECORATION: underline}
.b24 a:hover { FONT-SIZE: 12px; COLOR:#990000; TEXT-DECORATION: none}
.lh13 { LINE-HEIGHT: 130%}
.lh15 { LINE-HEIGHT: 150%}
.lh17 { LINE-HEIGHT: 170%}
.lh19 { LINE-HEIGHT: 190%}
.lh30 { LINE-HEIGHT: 300%}
-->
</style>
</head>
<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" >
<table width="778" border="0" cellspacing="0" cellpadding="0">
<tr align="center">
<td> </td>
</tr>
<tr align="center">
<td> <table width="700" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="41%" height="46" valign="top"><img src="logo.gif" width="205" height="41"></td>
<td height="46" width="59%" valign="bottom" align="right"> <table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="right"><b><font style="font-size:16px" color="#990000">——
—— —— 技术资料下载中心</font></b> </td>
</tr>
<tr>
<td height="8"></td>
</tr>
</table></td>
</tr>
<tr>
<td height="1" colspan="2"></td>
</tr>
<tr bgcolor="#990000">
<td height="1" colspan="2"></td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td colspan="2"><font style="font-size:16px" color="#000000"><b>>> <a href="index.htm">PIC单片机原理</a>
\</b></font></td>
</tr>
</table>
<table width="700" border="0" cellspacing="0" cellpadding="2">
<tr>
<td align="center"> <div align="center" class="标题"> <span class="t18lan"><font size="3"><b>PIC系列单片机程序设计基础</b></font></span>
</div></td>
</tr>
<tr>
<td> <p></p></td>
</tr>
<tr valign="top">
<td height="300"> <b class="T14LAN"><span class="lh15">1、程序的基本格式</span></b><span class="lh15"><br>
先介绍二条伪指令:<br>
EQU ——标号赋值伪指令<br>
ORG ——地址定义伪指令<br>
PIC16C5X在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:<br>
PIC16C54/55:1FFH<br>
PIC16C56:3FFH<br>
PIC16C57/58:7FFH<br>
一般来说,PIC的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。<br>
TITLE This is …… ;程序标题<br>
;--------------------------------------<br>
;名称定义和变量定义<br>
;--------------------------------------<br>
F0 EQU 0<br>
RTCC EQU 1<br>
PC EQU 2<br>
STATUS EQU 3<br>
FSR EQU 4<br>
RA EQU 5<br>
RB EQU 6<br>
RC EQU 7 <br>
┋<br>
PIC16C54 EQU 1FFH ;芯片复位地址<br>
PIC16C56 EQU 3FFH<br>
PIC16C57 EQU 7FFH<br>
;-----------------------------------------<br>
ORG PIC16C54 GOTO MAIN ;在复位地址处转入主程序<br>
ORG 0 ;在0000H开始存放程序<br>
;-----------------------------------------<br>
;子程序区<br>
;-----------------------------------------<br>
DELAY MOVLW 255<br>
┋<br>
RETLW 0<br>
;------------------------------------------<br>
;主程序区<br>
;------------------------------------------<br>
MAIN<br>
MOVLW B‘00000000’<br>
TRIS RB ;RB已由伪指令定义为6,即B口<br>
┋<br>
LOOP<br>
BSF RB,7 CALL DELAY <br>
BCF RB,7 CALL DELAY<br>
┋<br>
GOTO LOOP<br>
;-------------------------------------------<br>
END ;程序结束<br>
注:MAIN标号一定要处在0页面内。<br>
<b class="T14LAN">2、程序设计基础</b><br>
1) 设置 I/O 口的输入/输出方向<br>
PIC16C5X的I/O 口皆为双向可编程,即每一根I/O 端线都可分别单独地由程序设置为输入或输出。这个过程由写I/O控制寄存器TRIS
f来实现,写入值为“1”,则为输入;写入值为“0”,则为输出。<br>
MOVLW 0FH ;0000 1111(0FH)<br>
输入 输出<br>
TRIS 6 ;将W中的0FH写入B口控制器,<br>
;B口高4位为输出,低4位为输入。<br>
MOVLW 0C0H ; 11 000000(0C0H)<br>
RB4,RB5输出0 RB6,RB7输出1<br>
2) 检查寄存器是否为零<br>
如果要判断一个寄存器内容是否为零,很简单,现以寄存器F10为例:<br>
MOVF 10,1 ;F10→F10,结果影响零标记状态位Z<br>
BTFSS STATUS,Z ;F10为零则跳<br>
GOTO NZ ;Z=0即F10不为零转入标号NZ处程序<br>
┋ ;Z=1即F10=0处理程序<br>
3) 比较二个寄存器的大小<br>
要比较二个寄存器的大小,可以将它们做减法运算,然后根据状态位C来判断。注意,相减的结果放入W,则不会影响二寄存器原有的值。<br>
例如F8和F9二个寄存器要比较大小:<br>
MOVF 8,0 ;F8→W<br>
SUBWF 9,0 ;F9—W(F8)→W<br>
BTFSC STATUS,Z ;判断F8=F9否<br>
GOTO F8=F9<br>
BTFSC STATUS,C ;C=0则跳<br>
GOTO F9>F8 ;C=1相减结果为正,F9>F8<br>
GOTO F9<<F8 ;c="0相减结果为负,F8">F8 ;C=0相减结果为负,F9<F8<br>
┋<br>
4) 循环n次的程序<br>
如果要使某段程序循环执行n次,可以用一个寄存器作计数器。下例以F10做计数器,使程序循环8次。<br>
COUNT EQU 10 ;定义F10名称为COUNT(计数器)<br>
┋<br>
MOVLW 8<br>
MOVWF COUNT LOOP ;循环体<br>
LOOP<br>
┋<br>
DECFSZ COUNT,1 ;COUNT减1,结果为零则跳<br>
GOTO LOOP ;结果不为零,继续循环<br>
┋ ;结果为零,跳出循环<br>
5)“IF……THEN……”格式的程序<br>
下面以“IF X=Y THEN GOTO NEXT”格式为例。<br>
MOVF X,0 ;X→W<br>
SUBWF Y,0 ;Y—W(X)→W<br>
BTFSC STATUS,Z ;X=Y 否<br>
GOTO NEXT ;X=Y,跳到NEXT去执行。<br>
┋ ;X≠Y<br>
6)“FOR……NEXT”格式的程序<br>
“FOR……NEXT”程序使循环在某个范围内进行。下例是“FOR X=0 TO 5”格式的程序。F10放X的初值,F11放X的终值。<br>
START EQU 10<br>
DAEND EQU 11<br>
┋<br>
MOVLW 0<br>
MOVWF START ; 0→START(F10)<br>
MOVLW 5<br>
MOVWF DAEND ;5→DAEND(F11)<br>
LOOP<br>
┋<br>
INCF START,1 ;START值加1<br>
MOVF START,0<br>
SUBWF DAEND,0 ;START=DAEND ?(X=5否)<br>
BTFSS STATUS,Z<br>
GOTO LOOP ;X<5,继续循环<br>
┋ ;X=5,结束循环<br>
7)“DO WHILE……END”格式的程序<br>
“DO WHILE……END”程序是在符合条件下执行循环。下例是“DO WHILE X=1”格式的程序。F10放X的值。<br>
X EQU 10<br>
┋<br>
MOVLW 1<br>
MOVWF X ;1→X(F10),作为初值<br>
LOOP<br>
┋<br>
MOVLW 1<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -