欢迎光临MCUWAY! 本站网名:单片机之路  永久域名:www.mcuway.com

设为首页

加入收藏

电子基础 初学MCU 单片机类型 MCU程序 MCU应用 设计软件 测控电路 技术论坛
 您现在的位置: 单片机之路 >> 单片机类型 >> PIC系列 >> 文章正文

现场直播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

普通文章28课:单片机音乐汇编程序设计
普通文章27课:单片机的一些基本概念
普通文章26课:单片机矩阵式键盘接口技术
普通文章51单片机教程(从原理开始基于汇编)
普通文章1课:单片机概述
普通文章2课:8051单片机引脚介绍
普通文章3课:单片机存储器结构结构分析
普通文章4课:第一个单片机小程序
普通文章5课:单片机延时程序分析
普通文章6课:单片机并行口结构
普通文章7课:单片机的特殊功能寄存器
普通文章8课:单片机寻址方式与指令系统
普通文章9课:单片机数据传递类指令
普通文章10课:单片机数据传送类指令
普通文章11课:单片机算术运算指令
普通文章12课:单片机逻辑运算类指令
普通文章13课:单片机逻辑与或异或指令祥解
普通文章14课:单片机条件转移指令
普通文章15课:单片机位操作指令
普通文章16课:单片机定时器与计数器
普通文章17课:单片机定时器/计数器的方式控制
普通文章18课:单片机的中断系统
普通文章19课:单片机定时器、中断试验
普通文章20课:单片机定时/计数器实验
普通文章21课:单片机串行口介绍

  • 上一篇文章:
  • 下一篇文章:
  • 更多精彩内容>>>

    普通文章电流单位
    普通文章功率单位
    普通文章什么是达林顿管?
    普通文章晶闸管的作用与原理

    学习单片机的必经之路——单片机之路,永久域名:www.mcuway.com