|
现场直播Pic学习过程(2)
简单说明: LET pic basic compiler 就是LEADING EDGE TEHNOLOGY LTD公司出品的PIC单片机BASIC编译器
他允许使用者使用BASIC语言环境编辑代码,经过编译后可以产生运行于PIC单片机的汇编代码 如果购买他的编程器,可以在写好BASIC程序后,自动编译直接写入离线或在线的芯片上。 如果没有他的编程器可以利用他产生的汇编代码,通过MICROCHIP的免费汇编环境MPASM或 MPASMWIN产生HEX文件。然后通过其他编程器写入芯片。 本文后期将介绍六个应用PC并口或串口的简单的编程器供广大网友自制。
LET PIC BASIC 支持以下PIC芯片: 12C508,12C509,16C54,16C55,16C56,16C57,16C71,16F83,16F84 12系列的芯片最大好处是八个引脚,体积小,无须晶震成本极底。 71芯片具有A/D转换口,一般学习编程的人士最好选用16F84 因为这个芯片可以重复使用。
LITPICBASIC 还支持一些标准外设如:LCD,kEYPADS,I2C总线设备,等。非常易用。
安装说明: 对于广大高水平网友而言,要安装LITBASIC简直是易如反掌。 网上可以下载最新版本。
使用方法: 请大家看PDF文件的第6页 有一个注意事项,请大家把COMPILE/SETUP OPTION/ PRODUCE MPASM FILE 此项用于输出汇编代码。
程序编写规则: 程序编写有一些基本的格式需要弄明白: 程序必须按照以下格式编写: 文件头: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ' ' 此段用于声明程序的用途结构作者版本硬件接法等信息 ' 凡注解文字请用’符号开头,编译时将不管此信息 ' ' 以下例同' ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
' 以下为文件头,此文件头与下一主程序并非完全关联,仅用作详细说明文件头的构成。
DEVICE 16F84 ‘确定使用芯片,因为不同的芯片有不同的代码
INCLUDE SERIAL ‘定义包含元件,如KEYPAD,A2D,12CBUS, ‘EEPROM,LCD,SERIAL
DIM DOG ,CATS ‘定义变量,程序需要用的变量
SYMBLE LED1 =PORTA.0 ‘如果你在端口A上接一个LED那么可以把他改名为 ‘LED1 让程序更易懂。
DEFINE PORTA=00000000 ‘定义端口A为输出端口:0表示输出 DEFINE PORTA=11111111 ‘定义端口b为输入端口:1表示输入
INIT SERIAL A.0 A.1 ’定义INCLUSE包含的硬件的具体连接方法 DATA 5,8,"CHINA",12 '定义数据库,用于存放常量,包括数字,文字等
'以下为程序开始,此程序为演示让一个LED一亮一灭的效果 MAIN: ‘标签,类似以前的行号,利于程序跳转时使用 ‘必须放于第一列,其他语句请勿防在此列 HIGH LED1 ‘在LED1上输出高电平,此高电平会自动保持到 ‘下一个关于LED1命令。 GOSUB DELAYSUB ‘调用子程序:DELAYSUB LOW LED1 ‘在LED1上输出低电平, GOTO MAIN ‘转向MAIN标签
DELAYSUB: ’子程序标签,这是延时子程序 DELAYMS 500 ‘延迟500毫秒 RETURN ’返回调用处
END ‘表示程序结束
上一个程序我并无测试,因为太简单了 我于是写了一个相对复杂的程序:循环点亮一组LED 认识了一个“一行多语句”的方法,如下,用冒号和空格分隔,就行了
DEVICE 16F84 DEFINE PORTB=00000000 DEFINE PORTA=00000000
main: high a.0 : goSUB delasub : low a.0 high a.1 : goSUB delasub : low a.1 high a.2 : goSUB delasub : low a.2 high a.3 : goSUB delasub : low a.3 high a.4 : goSUB delasub : low a.4
high B.0 : goSUB delasub : low B.0 high B.1 : goSUB delasub : low B.1 high B.2 : goSUB delasub : low B.2 high B.3 : goSUB delasub : low B.3 high B.4 : goSUB delasub : low B.4 high B.5 : goSUB delasub : low B.5 high B.6 : goSUB delasub : low B.6 high B.7 : goSUB delasub : low B.7
goto main
delasub: delayms (4000) return
END
程序编译通过,但是运行有时出问题,请教网友 我的想法是按以下循序循环: A0,A1,A2,A3,A4,B0,B1,B2,B3,B4,B5,B6,B7 但他变成以下循环: A0,A1,A2,A0,A1,A2,A3,A4不亮,B0,B1,B2,B3,B4,B5,B6,B7 以下是ASM文件,请老师和高手指教
;----------------------------------------------------- ; (C) Leading Edge Technology Ltd ; --- Pic Basic Compiler V5.0 --- ; Website: http://LET.cambs.net ; EMail: johnmorr@mail.keyworld.net ;-----------------------------------------------------
W equ 00 F equ 01
LIST p=16F84 , r=DEC ; ----- DEFINE PORTB=00000000 ----- movlw 0 tris 06 ; ----- DEFINE PORTA=00000000 ----- movlw 0 tris 05 MAIN ; ----- MAIN: HIGH A.0 : GOSUB DELASUB : LOW A.0 ----- bsf 05,00 call DELASUB bcf 05,00 ; ----- HIGH A.1 : GOSUB DELASUB : LOW A.1 ----- bsf 05,01 call DELASUB bcf 05,01 ; ----- HIGH A.2 : GOSUB DELASUB : LOW A.2 ----- bsf 05,02 call DELASUB bcf 05,02 ; ----- HIGH A.3 : GOSUB DELASUB : LOW A.3 ----- bsf 05,03 call DELASUB bcf 05,03 ; ----- HIGH A.4 : GOSUB DELASUB : LOW A.4 ----- bsf 05,04 call DELASUB bcf 05,04 ; ----- HIGH B.0 : GOSUB DELASUB : LOW B.0 ----- bsf 06,00 call DELASUB bcf 06,00 ; ----- HIGH B.1 : GOSUB DELASUB : LOW B.1 ----- bsf 06,01 call DELASUB bcf 06,01 ; ----- HIGH B.2 : GOSUB DELASUB : LOW B.2 ----- bsf 06,02 call DELASUB bcf 06,02 ; ----- HIGH B.3 : GOSUB DELASUB : LOW B.3 ----- bsf 06,03 call DELASUB bcf 06,03 ; ----- HIGH B.4 : GOSUB DELASUB : LOW B.4 ----- bsf 06,04 call DELASUB bcf 06,04 ; ----- HIGH B.5 : GOSUB DELASUB : LOW B.5 ----- bsf 06,05 call DELASUB bcf 06,05 ; ----- HIGH B.6 : GOSUB DELASUB : LOW B.6 ----- bsf 06,06 call DELASUB bcf 06,06 ; ----- HIGH B.7 : GOSUB DELASUB : LOW B.7 ----- bsf 06,07 call DELASUB bcf 06,07 goto MAIN DELASUB ; ----- DELASUB: DELAYMS (4000) ----- movlw 4000 movwf 13 clrf 12 pb_lab2 nop nop decfsz 12,F goto pb_lab2 decfsz 13,F goto pb_lab2 return goto $ END
为了完成我的目的我又准备写另一个程序,用另一种方法实现此目的 在实验过程中,无意中写了一个邻闪灯:
DEVICE 16F84 DEFINE PORTB=00000000 DEFINE PORTA=00000000 'DIM no main: set a.0 outb (85) '向并口B输出一个数字,85=%b01010101 gosub delasub
low a.0 outb (170) ' '向并口B输出另一个数字,170=%b10101010 gosub delasub
gosub main
delasub: delayms (4000) return
END
大家可以写一写,看看好不好玩。后来把A也写进去
DEVICE 16F84 DEFINE PORTB=00000000 DEFINE PORTA=00000000 'DIM no main:
outa (85) outb (85) gosub delasub low a.0 outb (170) outa (170) gosub delasub
gosub main
delasub: delayms (4000) return
END 我还是搞不明白为什么A4不亮,他美国老娘的, 不过好象是英国飞机。管他呢
为了完成我的目的我又写了另一个程序,用另一种方法实现此目的 成功了 DEVICE 16F84 DEFINE PORTB=00000000 DEFINE PORTA=00000000 DIM no
no=1 main:
outb (no) gosub delasub no=no<<1 '一个位移运算符,原来N0=%b00000001 '左移一位那么NO=%B00000010 如此类推 '但是当NO移了八位后应当等于%b00000000全部灯都灭 '但是实际的效果是他不停地循环,请教各位,何解? gosub main
delasub: delayms (6000) return
END
但是看起来有多个LED亮,改一下,一个LED亮了。但还存在上述问题: DEVICE 16F84 DEFINE PORTB=00000000 DEFINE PORTA=00000000 DIM no
no=1 main:
outb (no) gosub delasub outb (0) '让LED全灭 no=no<<1 gosub main
delasub: delayms (6000) return
END |
|