📄 io的备注.c
字号:
我用的是ATmega8L 内部1MHz晶振 内部上拉电阻打开)
设AVR的两个I/O口A和B.通过电阻接在一起,作开关用:如下图
-------------------
K | |
__/ _____|A |
|________|B |
| |
| ATMEGA8L |
图中开关为K(如在51中则设A为1,B为0,K闭合则A被拉低。) 设两口接在一起为"+",结果为"="后的数据,高电平为"1",低电平为"0",输出为"出",输入为"入".
AVR的I/0口通过实验数据入下:
1.A(出,1)+B(出,1)=A(出,1),B(出,1)
2.A(出,1)+B(出,0)=AB间不接电阻,单片机定住(类似死机),此时AB相当于电源的正负极,接在一起造成短路.如有足够大的电阻,则工作正常.
3.A(出,1)+B(入,1)=A(出,1),B(入,1)
4.A(出,0)+B(入,0)=A(出,0),B(入,0)
5.A(出,1)+B(入,0)=A(出,1),B(入,1) 低被拉高
6.A(入,1)+B(入,0)=A(入,1),B(入,1) 低被拉高
7.A(入,1)+B(出,0)=A(入,0),B(出,0) 高被拉低
8.A(入,1)+GND=A(入,0) 高被拉低
9,A(出,1)+GND=定住(类似死机)
通过上面的实验,我们可以发现:5,6,7,8条可以利用来做按键.
以上是我懒得做实验折腾了好久(最后不得不做实验)而得来的.呵呵.累啊:)
以下是例子:(刚从另外一个贴Copy过来 55怕被扣100分啊)
我刚学AVR一星期遇到了不少问题。弯路走的多多。下面例子让刚入们的新人少走弯路。我个人觉得比“D触发器做按键”的例子更容易让人理解。
-------------------
K | |
__/ _____|PB0 |
|________|PB1 |
| |
| ATMEGA8L |
//ATmega8L 内部晶振1MHz 编译器:CodeVisionAVR
//注意PB0和PB1高输入输出及高低电平的设置,这是按键成功的关键。
#include <mega8.h>
#define uint unsigned int
#define uchar unsigned char
#define TRUE 1
#define FALSE 0
#define key PINB.0
void delay()
{ //延时
uint i;
for(i=0;i<3000;i++)
{
#asm("nop");
}
}
uchar keyboard()
{ //按键处理
if(!key)
{ //有键按下
delay(); //延时去抖动
if(key) return FALSE; //假的按键。返回假
while(!key); //等待按键放开
return TRUE; //是按键返回真
}
return FALSE;
}
void main(void)
{
PORTB=0x01; //***PB0设为高电平1, PB1设为低电平0
DDRB=0x02; //***PB0设为输入, PB1设为输出
SFIOR=0x00; //开内部上拉电阻
OSCCAL=0xa7; //时钟效准
while (1)
{
if(keyboard())
{ //处理按键
//......
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -