|
1.$Def
I/O端口配置语句,给I/O端口起个别名,就像我们自己的小名,只是为了便于理解。
语法:
$Def name=PORT.n
说明:
name 合法的符号名
PORT 芯片的I/O 端口,如 PORTA ,PORTB
n 为0~7
例子:
$Def Led=PORTA.1
’PORTA.1接了一个发光二极管
那么下面两条指令是执行相同代码
Set PORTA.1
Set Led ’是不是要直观些?
2.$1Wire
I/O端口配置语句,给1Wire总线配置一个端口,典型的例子是数字温度计DS18b20
语法:
$1Wire=Port.pin
[, PORT.pin1, PORT.pin2, ...]
注释:
PORT.pin 是具体的一个I/O端口.
您能使用多个这样的端口那么您必须从0开始,当然您也可以在一个端口上连接多个1Wire设备!
例子:
$1Wire=PORTD.2
'1Wire bus 连接到端口PortD.2
3.$DTMF
I/O端口配置语句,利用OC1输出DTMF双音频信号
语法:
$DTMF =
PORT.pin,
duration
注释:
Port 必须为OC1 pin 所在的端口,将临时占用定时器timer1 并且以OVF1溢出中断产生双音频信号。
pin OC1的 pin 号
duration 为持续时间单位ms, 最大值255!
例子:
Enable Interrupts
‘开全局中断
Enable Ovf1
‘开定时器Ovf1中断
$DTMF =
PORTD.5, 200‘双音频信号从PORTD.5输出,时长200ms
DTMF(15)
‘以上面的规定输出#对应的双音频信号
括号里的值和双音频信号的对应关系如下:
0 1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
0 1 2 3 4 5
6 7 8 9 A
B C D *
#
4.$I2C
I/O端口配置语句,定义一个软的I2C主接口,暂不支持硬件I2C
语法:
$I2C SDA=PORT.pin, SCL=PORT.pin
注释:
告诉编译器哪个pin接到SDA
和SCL
不要忘记在 SDA and
SCL (4k7 - 10k)接上拉电阻!
例子:
$I2C SDA=PORTD.5, SCL=PORTD.6 '定义 I2C port pins
I2C相关指令说明:
I2CStart 启动I2C总线
I2CStop 停止I2C总线
I2CRead 通过I2C总线读单一字节
I2CWrite 通过I2C总线写单一字节
语法:
II2CStart adr
var1=I2CRead, Ack [, Nack]
I2CWrite var2
I2CStop
注释:
adr 被操作的I2C器件地址
var1 读取后的返回值
var2 变量或常量写到I2C总线
Ack - 应答位,表示会继续读
Nack - 表示这是最后一个读周期(这是必须有的)
不要忘记在SDA and SCL上接 (4k7 - 10k)的上拉电阻!
注意关于I2Cread: The first call to I2Cread will isue also device address for
Read (last bit is automaticaly set), 最后I2Cread 命令必须使用 Nack 选项!
例子1:读实时钟芯片Philips PCF85x3
II2cstart &ha0
'generate start
I2cwrite 2 'select second register
s=I2cread, Ack
m=I2cread, Ack
h=I2cread, Nack
I2cstop 'generate stop
例子2:页面写,数据来自一个数组定义的缓冲区
'///////////////////////////////////////////////////
Sub WritePage(Padr As Word)
Local i As Byte
I2Cstart &ha0 ' 24C64 address
I2Cwrite Msb(Padr) ' write adr MSB
I2Cwrite Padr ' write adr LSB
For i=0 To 31
I2Cwrite buff(i) ' write data from array buff
Next
I2Cstop
WaitMs 6 ' wait to write (10 max)
End Sub
例子3:页面读
'///////////////////////////////////////////////////
Sub ReadPage(Padr As Word)
Local i As Byte, tmp As Byte
I2Cstart &ha0 ' 24C64 address
I2Cwrite Msb(Padr) ' write adr MSB
I2Cwrite Padr ' write adr LSB
tmp=I2Cread, Ack ' first read deefers from others
For i=0 To 31
buff(i)=tmp ' we read into buff array
tmp=I2Cread, Ack
Next
tmp=I2Cread, Nack ' dummy read - we need Nack!
I2Cstop
End Sub
5.$WatchDog
处理器配置语句,配置看门狗的溢出时间。
语法:
$WatchDog=const
注释:
const
在VCC=5V的时候的溢出时间ms
(16, 32, 64, 128, 256, 512,
1024, 2048)
例子:
$WatchDog = 2048
'配置看门狗,溢出时间大约2s
Start WatchDog
'启动看门狗
Stop WatchDog '停止看门狗
reset
watchdog
'复位看门狗,俗称喂狗
6.$Sound
I/O端口配置语句,配置一个声音输出口
语法:
$Sound = PORT.pin
注释:
Port
合法端口名
pin
声音输出在哪个pin脚
例子:
$Sound = PORTD.2 ' PORTD.2作为声音输出口
7.$Spi
I/O端口配置语句,定义硬件SPI的工作参数。
语法:
$Spi num, Lsb|Msb, Master|Slave, Hi|Low, Hi|Low
注释:
num 是时钟的分频系数,其值为 4, 16, 64, 128
Lsb or Msb
数据低位在前还是高位在前
Master|Slave
工作于主模式或从模式
Hi or Low
时钟的极性(看 Atmel's data)
Hi or Low
时钟的相位(看 Atmel's data)
注意: 在 SPI 初始化为主模式时,
Clk 和 MOSI 为输出, SS 必须置高电平!
例子:
$Spi 128, Lsb, Master, Hi, Low
8.$Shiftout
I/O端口配置语句,定义一个移位输入/输出端口,可以作为软件SPI口。
语法:
$Shiftout Data=PORT.pin, Clock=PORT.pin, Msb [Lsb]
注释:
Port 合法的端口
Msb 高位在前, Lsb
低位在前
常规工作于2种时钟极性,展开数据使用移位寄存器!
例子:
$Shiftout Data=PORTB.0, Clock=PORTB.1, 1
9.$RC5
I/O端口配置语句,配置一个基于Philips
RC5编码格式的红外线接收口
语法:
$RC5 = PORT.pin
注释:
Port avr的合法端口
pin 用于红外线接收的pin脚
例子:
接收Philips RC5编码格式的红外线代码
语法:
Rc5(sysadr, command)
注释:
sysadr 是RC5 设备识别地址(Byte)
command 是接收到的键值(Byte)
Sysadr 和 Command
变量必须使用Dim 先定义再使用
TOGGLE BIT is sysadr.5
Command 长6bit, sysadr 长5 bit!
假如接收到的Command=255,那么sysadr的值无效,也就是说接收到了错误的代码或者没有接收到代码!
注意!
Timer0 的 OVF0 中断要被使用,这个时候使用者不能将定时器0和它的中断用于其它的目的!
使用这个指令必须开放全局中断和Ovf0 中断!
例子:
$RC5 = PORTD.2
Dim Adr As Byte
Dim Com As Byte
Enable Interrupts
'使能全局中断
Enable
Ovf0
'使能Timer0 Ovf0 中断
Do
RC5(Adr, Com)
Print Adr; " "; Com
Loop
10.$Timer
说明:定义Timer的工作模式,AVR的定时器功能强大,要灵活应用还真不容易!
$Timer0=Timer
[, Prescale=const, Async, Compare=
Set|Reset|Toggle|DisConnected, Clear]
$Timer0=定时器[分频系数=const,同步,比较=置位|复位|翻转|断开,清零]
$Timer0=Counter,
Rising|Falling
[, Compare= Set|Reset|Toggle|DisConnected, Clear]
$Timer0=计数器,上升沿|下降沿[,比较=置位|复位|翻转|断开,清零]
$Timer0=PWM,
8|9|10, Normal|Inverted|DisConnected [,Prescale=8]
$Timer0=PWM,8|9|10,常规|反相|断开[,分频系数=8]
$Timer1=Timer
[, Prescale=const,
Compare=Set|Reset|Toggle|DisConnected,CompareA=Set|Reset|Toggle|DisConnected,
CompareB=Set|Reset|Toggle|DisConnected, Clear, Capture=Rising|Falling,
NoiseCancel]
$Timer1=定时器 [,分频系数=const,
比较=置位|复位|翻转|断开,比较A=置位|复位|翻转|断开, 比较B=置位|复位|翻转|断开, 清零, 捕捉=上升沿|下降沿, 噪音消除]
$Timer1=Counter,
Rising|Falling
[,Compare=Set|Reset|Toggle|DisConnected,
CompareA=Set|Reset|Toggle|DisConnected,
CompareB=Set|Reset|Toggle|DisConnected, Clear, Capture =Rising|Falling,
NoiseCancel]
$Timer1=计数器, 上升沿|下降沿 [,比较=置位|复位|翻转|断开,
比较A=置位|复位|翻转|断开, 比较B=置位|复位|翻转|断开, 清零, 捕捉 =上升沿|下降沿,噪音消除]
$Timer1=PWM, 8|9|10, PwmA|PwmB=Normal|Inverted|DisConnected [, Prescale=8]
$Timer1=PWM, 8|9|10, PwmA|PwmB=常规|反相|断开 [,分频系数=8]
$Timer2=Timer [, Prescale=8, Async, Compare=Set|Reset|Toggle|DisConnected, Clear]
$Timer2=定时器 [,分频系数=8, 同步, 比较=置位|复位|翻转|断开, 清零]
$Timer2=Counter, Rising|Falling [, Compare= Set|Reset|Toggle|DisConnected, Clear]
$Timer2=计数器,上升沿|下降沿[,比较=置位|复位|翻转|断开,清零]
$Timer2=PWM, 8|9|10, Normal|Inverted|DisConnected [, Prescale=8]
$Timer2=pwm,8|9|10,常规|反相|断开[,分频系数=8]
$Timer3=Timer
[, Prescale=const,
Compare=Set|Reset|Toggle|DisConnected,CompareA=Set|Reset|Toggle|DisConnected,
CompareB=Set|Reset|Toggle|DisConnected, Clear, Capture=Rising|Falling,
NoiseCancel]
$Timer3=定时器 [,分频系数=const,
比较=置位|复位|翻转|断开,比较A=置位|复位|翻转|断开, 比较B=置位|复位|翻转|断开, 清零, 捕捉=上升沿|下降沿, 噪音消除]
$Timer3=Counter,
Rising|Falling
[,Compare=Set|Reset|Toggle|DisConnected,
CompareA=Set|Reset|Toggle|DisConnected,
CompareB=Set|Reset|Toggle|DisConnected, Clear, Capture =Rising|Falling,
NoiseCancel]
$Timer3=计数器, 上升沿|下降沿 [,比较=置位|复位|翻转|断开,
比较A=置位|复位|翻转|断开, 比较B=置位|复位|翻转|断开, 清零, 捕捉 =上升沿|下降沿,噪音消除]
$Timer3=PWM, 8|9|10, PwmA|PwmB=Normal|Inverted|DisConnected [, Prescale=8]
$Timer3=PWM, 8|9|10, PwmA|PwmB=常规|反相|断开 [,分频系数=8]
注释:
const 是分频系数,可以= 1, 8, 64, 256, 1024, 对于Timer0 和Timer2 可以= 32 或 128
(不是所有的芯片可以选)
在定时器工作于PWM 与 Compare 模式未对时钟进行分频,假如要使用低频率就象这样声明:
$Timer0=Timer, Prescale=256 ' 工作于定时器方式,分频系数为256
$Timer0=PWM, 8, Normal|Inverted ' PWM will now use prescaled clock
在PWM模式使用特殊变量:
Pwm0, Pwm1A, Pwm1B, Pwm2
在比较输出模式使用特殊变量:
Compare0, Compare1A, Compare1B, Compare2
请看手册定时器使用的部分!
例子:
$Timer0=Timer, Prescale=1
$Timer1=PWM, 8, PwmA=Inverted
|