首 页 学 苑 例 子 工 具 下 载 商 城 论 坛
     
 

    我们再来看看I/O端口配置语句,很多有用的功能要靠它们先声明,例如键盘,红外线解码,定时器等等。

  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总线写单一字节
语法:
I
I2CStart 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
I
I2cstart &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)
SysadrCommand 变量必须使用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=PWM8PwmA=Inverted

 

 
 

链接:

 

周立功  AVR单片机DIY 21IC社区 正强单片坊 电子资料城
双龙电子 ICCAVR 力源信息 www.atmel.com 电子之城
华强电子世界 AVR与虚拟仪器 美信中国 www.fastavr.com ARM开发网
宁波三和壳体公司 杭州福芯电子 芯艺设计室 www.mcselec.com 东创科技

Copyright©2005 Basicavr.com Email:agui2008@21cn.net  TEL:13798456680 FAX:075584717022

地址:深圳市华强北路赛格电子市场一楼1B105柜 QQ:543527753 粤ICP备05079885号