PIC单片机的基本编程汇总,初学者必看

控制/MCU

1876人已加入

描述

适合3ePIC试验板,爱晶产品销售服务做的不好,好多C程序都是自己写的,不过汇编程序参考一下不错。

PIC单片机

;------------------------------------------------------------------------------------------

;单双位变换显示实验参考程序注意:此程序请用单步执行(实验1-1.asm)

;------------------------------------------------------------------------------------------

STATUS EQU03H;特殊功能寄存器定义

TRISD EQU88H;特殊功能寄存器定义

PORTD EQU08H;特殊功能寄存器定义

TRISE EQU89H;特殊功能寄存器定义

PORTE EQU09H;特殊功能寄存器定义

ORG0000H;复位地址

NOP;MPLAB专用语句

STBSFSTATUS,5;选择体1

CLRFTRISD;PORTD设置为输出

CLRFTRISE;PORTE设置为输出

BCFSTATUS,5;选择体0

BCF PORTE,0;RE0清零,选通LED

LOOPMOVLWB‘10101010’

MOVWFPORTD;设置PORTD的值

MOVLWB‘01010101’

MOVWFPORTD;再次设置PORTD的值

GOTOLOOP;循环操作

;------------------------------------------------------------------------------------------

END

;------------------------------------------------------------------------------------------

本文引用地址: http://www.21ic.com/app/mcu/201810/786583.htm

;------------------------------------------------------------------------------------------

;软件延时自动计数实验参考程序(实验1-2.asm)

;------------------------------------------------------------------------------------------

STATUS EQU03H ;特殊功能寄存器定义

TRISD EQU88H;特殊功能寄存器定义

PORTDEQU08H;特殊功能寄存器定义

TRISE EQU89H;特殊功能寄存器定义

PORTEEQU09H;特殊功能寄存器定义

ORG0000H;复位地址

NOP;MPLAB专用语句

STBSFSTATUS,5;选择体1

CLRF TRISD;PORTD设置为输出

CLRF TRISE;PORTE设置为输出

BCFSTATUS,5;选择体0

CLRF PORTD;PORTD清零

BCF PORTE,0;RE0清零,选通LED

LOOPCALL DELAY1S;调用1S延迟程序

INCF PORTD;PORTD+1

GOTO LOOP;循环操作

;------------------------------------------------------------------------------------------

;1秒延时子程序参考程序

;------------------------------------------------------------------------------------------

DELAY1S MOVLW 06H;外循环常数

MOVWF 20H;外循环寄存器

LOP0MOVLW 0EBH;中循环常数

MOVWF 21H;中循环寄存器

LOP1MOVLW 0ECH;内循环常数

MOVWF 22H;内循环寄存器

LOP2DECFSZ 22H;内循环寄存器递减

GOTO LOP2;继续内循环

DECFSZ 21H;中循环寄存器递减

GOTO LOP1;继续中循环

DECFSZ 20H;外循环寄存器递减

GOTO LOP0;继续外循环

RETURN;返回

;------------------------------------------------------------------------------------------

END

;------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------

;霓虹灯显示实验参考程序(实验1-3.ASM)

;------------------------------------------------------------------------------------------

STATUS EQU03H;特殊功能寄存器定义

TRISD EQU88H;特殊功能寄存器定义

PORTDEQU08H;特殊功能寄存器定义

TRISE EQU89H;特殊功能寄存器定义

PORTEEQU09H;特殊功能寄存器定义

PCLEQU02H;特殊功能寄存器定义

COUNTEREQU30H;自定义变量

ORG0000H;复位地址

NOP;MPLAB专用语句

STBSFSTATUS,5;选择数据存储器体1

CLRF TRISD;定义RD口为输出

CLRF TRISE;PORTE设置为输出

BCFSTATUS,5;选择数据存储器体0

CLRF PORTD;PORTD清零

BCF PORTE,0;RE0清零,选通LED

POPCLRF COUNTER;自定义变量COUNTER清0

LOOPMOVF COUNTER,0;取出变量COUNTER值

CALL TABLE;查表对应数据

MOVWF PORTD;从PORTD输出

CALL DELAY50MS;调用50MS延时

INCF COUNTER,1;循环变量递增

MOVF COUNTER,0;取出当前COUNTER变量值

SUBLW .20;是否已取出20个数据

BTFSC STATUS,2;查验Z标志位

GOTO POP;Z=1,表示一次循环结束,COUNTER重新复位

GOTO LOOP;返回继续

;------------------------------------------------------------------------------------------

;数据表内容

;------------------------------------------------------------------------------------------

TABLE

ADDWFPCL,1;考察偏移量

RETLWB‘00011000’;第0种显示状态

RETLWB‘00111100’ ;第1种显示状态

RETLWB‘01111110’ ;第2种显示状态

RETLWB‘11111111’ ;第3种显示状态

RETLWB‘01111110’ ;第4种显示状态

RETLWB‘00111100’;第5种显示状态

RETLWB‘00011000’ ;第6种显示状态

RETLWB‘00000000’;第7种显示状态

RETLWB‘10000001’ ;第8种显示状态

RETLWB‘11000011’;第9种显示状态

RETLWB‘11100111’ ;第10种显示状态

RETLWB‘11111111’;第11种显示状态

RETLWB‘11100111’ ;第12种显示状态

RETLWB‘11000011’;第13种显示状态

RETLWB‘10000001’ ;第14种显示状态

RETLWB‘00000000’;第15种显示状态

RETLWB‘11111111’;第16种显示状态

RETLWB‘00000000’;第17种显示状态

RETLWB‘11111111’;第18种显示状态

RETLWB‘00000000’;第19种显示状态

;------------------------------------------------------------------------------------------

;50MS软件延时子程序

;------------------------------------------------------------------------------------------

DELAY50MS

MOVLW 41H;外循环常数

MOVWF 20H;外循环寄存器

LOOP1 MOVLW 0FFH;内循环常数

MOVWF 21H;内循环寄存器

LOOP2DECFSZ 21H;内循环寄存器递减

GOTO LOOP2 ;继续内循环

DECFSZ 20H;外循环寄存器递减

GOTO LOOP1 ;继续外循环

RETURN;返回

;------------------------------------------------------------------------------------------

END

;------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------

;动态数码自动计数显示实验参考程序(实验2-1.asm)

;------------------------------------------------------------------------------------------

LISTP=16F877A

INCLUDE“P16F877A.INC”;头文件的设定

;------------------------------------------------------------------------------------------

;BAW、SHW、 GEW和COUNTER变量的定义

COUNTEREQU71H;可用于循环的次数变量

QWEQU7CH;可用于十进制千位变量

BAWEQU7DH;可用于十进制百位变量

SHWEQU7EH;可用于十进制十位变量

GEWEQU7FH;可用于十进制个位变量

;------------------------------------------------------------------------------------------

ORG0000H;复位地址

NOP;MPLAB专用语句

CLRFQW

CLRFBAW

CLRFSHW

CLRFGEW;个、十、百寄存器清零

STBSFSTATUS,RP0;选择体1

CLRFTRISD;PORTD设置为输出

MOVLWB‘11100001’

MOVWFTRISB;PORTB的B2-5设置为输出,其余输入

BCFSTATUS,RP0;选择体0

CLRFPORTD;PORTD清零

LGEWMOVFGEW,W;个位计数处理

SUBLW09H

BTFSCSTATUS,Z

GOTOLSHW;个位有进位,转十位计数处理

INCFGEW,F;无进位,各位加1

MOVFGEW,W

MOVWF60H;存入个位寄存器

GOTOPINC;数值动态显示

LSHWCLRFGEW;十位计数处理

CLRF60H;个位有进位,个位清零

MOVFSHW,W;十位处理

SUBLW09H

BTFSCSTATUS,Z

GOTOLBAW;十位有进位,转百位计数处理

INCFSHW,F

MOVFSHW,W

MOVWF61H

GOTOPINC;数值动态显示

LBAWCLRFSHW;百位计数处理

CLRF61H;百位有进位,十位清零

MOVFBAW,W

SUBLW09H

BTFSCSTATUS,Z

GOTOLQW;百位有进位,转千位计数处理

INCFBAW,F

MOVFBAW,W

MOVWF62H

GOTOPINC

LQWCLRFBAW;千位计数处理

CLRF62H;千位有进位,百位清零

MOVFQW,W

SUBLW09H

BTFSCSTATUS,Z

GOTOQL;千位有进位,转清零处理

INCFQW,F

MOVFQW,W

MOVWF63H

GOTOPINC

QLCLRFGEW;个位计数处理

CLRFSHW;十位计数处理

CLRFBAW;百位计数处理

CLRFQW;千位计数处理

PINCNOP;数值动态显示处理

DTJPMOVLW19H

MOVWFCOUNTER;递增计数时间常数设置

LJ DECFSZCOUNTER,1

GOTOLS;时间未到,继续动态扫描显示

GOTOLR;时间到,递增计数

LSBCFPORTB,1;显示个位数值编码

BSFPORTB,2

BSFPORTB,3

BSFPORTB,4

MOVFGEW,W

CALLBMA;调要显示的数值的编码

MOVWFPORTD

CALLDELAY10MS;动态扫描转换时间控制

BSFPORTB,1;显示十位数值编码

BCFPORTB,2

BSFPORTB,3

BSFPORTB,4

MOVFSHW,W

CALLBMA;调要显示的数值的编码

MOVWFPORTD

CALLDELAY10MS;调用延时10MS程序

BSFPORTB,1;显示百位数值的编码

BSFPORTB,2

BCFPORTB,3

BSFPORTB,4

MOVFBAW,W

CALLBMA;调要显示的数值的编码

MOVWFPORTD

CALLDELAY10MS;调用延时10MS程序

BSFPORTB,1;显示千位数值的编码

BSFPORTB,2

BSFPORTB,3

BCFPORTB,4

MOVFQW,W

CALLBMA;调要显示的数值的编码

MOVWFPORTD

CALLDELAY10MS;调用延时10MS程序

GOTO LJ;返回显示时间记时

LR GOTOLGEW;返回主程序

;-----------------------------------------------------------------------------------------

;10MS延时

;-----------------------------------------------------------------------------------------

DELAY10MS

MOVLW03H;0fh外循环常数

MOVWF20H;外循环寄存器

LOOP2MOVLW0FFH;中循环常数

MOVWF21H;中循环寄存器

L01DECFSZ21H,1;中循环寄存器递减

GOTOL01;继续中循环

DECFSZ20H,1;外循环寄存器递减

GOTOLOOP2;继续外循环

RETURN;返回

;------------------------------------------------------------------------------------------

;编码查询

;------------------------------------------------------------------------------------------

BMAADDWFPCL,F;考察偏移量

RETLW3FH;“0” 编码

RETLW06H;“1” 编码

RETLW5BH;“2” 编码

RETLW4FH;“3” 编码

RETLW66H;“4” 编码

RETLW6DH;“5” 编码

RETLW7DH;“6” 编码

RETLW07H;“7” 编码

RETLW7FH;“8” 编码

RETLW6FH;“9” 编码

;------------------------------------------------------------------------------------------

END

;------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------

;高4位自动计数低4位手动计数显示实验参考程序(实验2-2.asm)

;------------------------------------------------------------------------------------------

LISTP=16F877A

INCLUDE“P16F877A.INC”;头文件的设定

;------------------------------------------------------------------------------------------

AAAEQU10H;高4位计数递增常数

GSWEQU30H;高4位值寄存器

DSWEQU31H;低4位值寄存器

ORG0000H ;复位地址

NOP ;MPLAB专用语句

STBSFSTATUS,RP0;选择体1

MOVLW00H

MOVWFTRISD;PORTD设置为输出

MOVLW0FFH

MOVWFTRISB;PORTB设置为输入

MOVLW0FFH

MOVWFTRISC;PORTC设置为输入

CLRFTRISE;PORTE设置为输出

BCFSTATUS,RP0;选择体0

CLRFPORTD;PORTD端口清零

BCF PORTE,0;RE0清零,选通LED

CLRFGSW;高4位值寄存器清零

CLRFDSW;低4位值寄存器清零

GOTOMAIN;转至MAIN

MAINNOP;高4位自动计数程序段

MOVLWAAA;送高4位计数递增常数

ADDWFPORTD,W

ANDLW0F0H;屏蔽低4位

MOVWFGSW

ADDWFDSW,W;高4位与低4位合成

MOVWFPORTD;送显

CALLDELAY1S;调用延时约1秒的子程序

GOTOMAIN

DELAY1S;含按键扫描的1秒延时子程序

MOVLW6H

MOVWF20H

LP2MOVLW0EAH

MOVWF21H

LP1MOVLW0FFH

MOVWF22H

J0BTFSCPORTC,5;J0按下么?

GOTOJ1;去判断J1是否按下

CALLDELAY10MS;防抖动延迟

BTFSCPORTC,5;J0按下确认

GOTOJ1;去判断J1是否按下

PP0BTFSSPORTC,5;J0按下,判J0是否释放

GOTOPP0;没有释放,再判

CALLDELAY10MS;防抖动延迟

BTFSSPORTC,5;J0可靠释放?

GOTOPP0;不确定,则再判J0是否释放

INCFPORTD,W;D口加1

ANDLW0FH;屏蔽高四位

MOVWFDSW;送入低4位值存储器

ADDWFGSW,W;高四位加1

MOVWFPORTD;送D口显示

J1 BTFSCPORTB,0;J1按下么?

GOTOLP0;J1没有按下,转到LP0延迟

CALLDELAY10MS;防抖动延迟

BTFSCPORTB,0;J1可靠按下?

GOTOLP0;J1没有按下,转到LP0延迟

PP1BTFSSPORTB,0;J1按下,判J1是否释放

GOTOPP1;没有释放,再判

CALLDELAY10MS;防抖动延时

BTFSSPORTB,0;J1可靠释放?

GOTOPP1;不确定,则再判J1是否释放

DECFPORTD,W;D口减1

ANDLW0FH;屏蔽高四位

MOVWFDSW;送入低4位值存储器

ADDWFGSW,W;高四位加1

MOVWFPORTD;送D口显示

LP0DECFSZ22H,F;延迟程序

GOTOLP0

DECFSZ21H,F

GOTOLP1

DECFSZ20H,F

GOTOLP2

RETURN

DELAY10MS

MOVLW0FH;外循环常数

MOVWF23H;外循环寄存器

LOOP2MOVLW0FH;中循环常数

MOVWF24H;中循环寄存器

L01DECFSZ24H,F;中循环寄存器递减

GOTOL01;继续中循环

DECFSZ23H,F;外循环寄存器递减

GOTOLOOP2;继续外循环

RETURN;返回

;------------------------------------------------------------------------------------------

END

;------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------

;电平变化基本计数实验参考程序(实验2-3.ASM)

;------------------------------------------------------------------------------------------

LISTP=16F877A

INCLUDE“P16F877A.INC”

PB_TEMPEQU40H;定义PORTB临时备份寄存器

;------------------------------------------------------------------------------------------

ORG0000H;复位地址

NOP;MPLAB专用语句

GOTOST;进入主程序

;------------------------------------------------------------------------------------------

;中断服务程序

;------------------------------------------------------------------------------------------

ORG0004H;中断程序入口地址

MOVFPORTB,W;PORTB 内容放到W

MOVWFPB_TEMP;W内容放到PB_TEMP

BTFSSPB_TEMP,4;判断RB4是否为低电平

GOTOPP4;是RB4输入,转到PP4执行PORTD加1

BTFSSPB_TEMP,5;判断RB5是否为低电平

DECFPORTD;RB5低电平,是RB5输入,执行PORTD减1

PPQBCFINTCON,RBIF;B口电平中断标志位清零

RETFIE;中断返回

PP4INCFPORTD;PORTD加1

GOTOPPQ;转到PPQ退出中断

;------------------------------------------------------------------------------------------

;系统主程序

;------------------------------------------------------------------------------------------

STBSFSTATUS,5;选择数据存储器体1

CLRFTRISD;定义RD口为输出

BSF TRISB,4;定义RB4、RB5为输入

BSF TRISB,5

CLRFTRISE;PORTE设置为输出

BCFSTATUS,5;选择数据存储器体0

MOVLWB‘10001000’;开启RB口电平变化中断

MOVWFINTCON;送W数据到INTCON

CLRFPORTD;PORTD口清零

BCF PORTE,0;RE0清零,选通LED

GOTO$;原地等待

;------------------------------------------------------------------------------------------

END

;------------------------------------------------------------------------------------------

;LCD显示本站网址和电话实验参考程序(实验2-4.ASM)

;进一步熟悉查表程序的用法,LCD的读写方法。

;------------------------------------------------------------------------------------------

LISTP=16F877A

INCLUDE“P16F877A.INC”

INCLUDE“MY.INC”;COUNT、TEMP变量已经定义

;------------------------------------------------------------------------------------------

EEQU03H;LCD片选信号脚定义在RB.3脚

RWEQU02H;LCD读/写信号脚定义在RB.2脚

RSEQU01H ;LCD寄存器选择信号脚定义在RB.1脚

;------------------------------------------------------------------------------------------

ORG 0000H

NOP ;放置一条ICD必需的空操作指令

GOTO MAIN

ORG 0008H

;------------------------------------------------------------------------------------------

TABLE ;取第一行的显示码WWW.AJDZ.NET

ADDWF PCL,1 ;地址偏移量加当前PC值

RETLW ‘ ’

RETLW ‘ ’

RETLW ‘W’

RETLW ‘W’

RETLW ‘W’

RETLW ‘。’

RETLW ‘A’

RETLW ‘J’

RETLW ‘D’

RETLW ‘Z’

RETLW ‘。’

RETLW ‘N’

RETLW ‘E’

RETLW ‘T’

RETLW ‘ ’

RETLW ‘ ’

RETLW 00H;数据结束标记

;------------------------------------------------------------------------------------------

TABLE1 ;取第二行的显示码TEL0575 2263178

ADDWF PCL,1 ;地址偏移量加当前PC值

RETLW ‘T’

RETLW ‘E’

RETLW ‘L’

RETLW ‘:’

RETLW ‘0’

RETLW ‘5’

RETLW ‘7’

RETLW ‘5’

RETLW ‘-’

RETLW ‘2’

RETLW ‘2’

RETLW ‘6’

RETLW ‘3’

RETLW ‘1’

RETLW ‘7’

RETLW ‘8’

RETLW 00H;数据结束标记

;------------------------------------------------------------------------------------------

MAIN

BSFSTATUS,RP0;选择体1

MOVLW B‘11110001’

MOVWF TRISB;PORTB的B1-3定义为输出,其余为输入

CLRF TRISD;PORTD端口定义为输出

BCF STATUS,RP0

CALL DELAY ;调用延时,刚上电LCD复位不一定有PIC快

MOVLW 01H

MOVWF PORTD ;清屏

CALL ENABLE

MOVLW 38H

MOVWF PORTD ;8位2行5x7点阵

CALL ENABLE

MOVLW 0FH ;显示器开、光标开、闪烁开

MOVWF PORTD

CALL ENABLE

MOVLW 06H ;文字不动,光标自动右移

MOVWF PORTD

CALL ENABLE

MOVLW 80H

MOVWF PORTD ;显示位置

CALL ENABLE

CALL WRITE1 ;调用送第一行数子程序“WWW.AJDZ.NET“

MOVLW 0C0H

MOVWF PORTD ;第一行的位置

CALL ENABLE

CALL WRITE2 ;调用送第二行数子程序“TEL0575 2263178”

MOVLW 0C2H

MOVWF PORTD ;第二行的位置

CALL ENABLE

GOTO $

;------------------------------------------------------------------------------------------

WRITE1

CLRF COUNT ;送第一行数字程序

LOOP1

MOVFW COUNT

CALL TABLE

MOVWF TEMP

CALL DATA2LCD

INCF COUNT,F

MOVFW TEMP

XORLW 00H;只影响标记位

BTFSS STATUS,Z;判断第1行数据是否读完,未读完则继续读

GOTO LOOP1

RETLW 0

;------------------------------------------------------------------------------------------

WRITE2 ;送第二行数子程序

CLRF COUNT

LOOP2

MOVFW COUNT

CALL TABLE1

MOVWF TEMP

CALL DATA2LCD

INCF COUNT,1

MOVFW TEMP

XORLW 00H

BTFSS STATUS,Z

GOTO LOOP2

RETLW 0

;------------------------------------------------------------------------------------------

DATA2LCD ;送数据到LCD子程序

MOVWF PORTD

BSF PORTB,RS

BCF PORTB,RW

BCF PORTB,E

CALL DELAY

BSF PORTB,E

RETLW 0

;------------------------------------------------------------------------------------------

ENABLE

BCF PORTB,RS ;写入控制命令的子程序

BCF PORTB,RW

BCF PORTB,E

CALL DELAY

BSF PORTB,E

RETLW 0

;------------------------------------------------------------------------------------------

DELAY

movlw 0ffh ;将外层循环参数值FFH经过W

movwf 20h ;送入用作外循环变量的20H单元

lp0movlw 0ffh ;将内层循环参数值FFH经过W

movwf 21h ;送入用作内循环变量的21H单元

lp1decfsz 21h,1 ;变量21H内容递减,若为0跳跃

goto lp1 ;跳转到LP1处

decfsz 20h,1 ;变量20H内容递减,若为0跳跃

goto lp0 ;跳跃到LP0处

return ;返回主程序

;------------------------------------------------------------------------------------------

END

;------------------------------------------------------------------------------------------

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分