AVR单片机关于端口的设置
我编了一个键盘程序,用的是AVR单片机,硬件端口没有用上拉电阻,我的想法是用反转法编程完成识别功能,在51上很好用的,可在AVR上不知怎么就是不行,我想可能是端口配置上出...
我编了一个键盘程序,用的是AVR单片机,硬件端口没有用上拉电阻,我的想法是用反转法编程完成识别功能,在51上很好用的,可在AVR上不知怎么就是不行,我想可能是端口配置上出了问题,我是初学菜鸟, 想请教单片机高手帮忙解答一下,AVR端口配置应该注意些什么?谢谢!
下面是我写的这个程序,见笑了。
uchar key_scan()
{
uchar scan,key;
DDRC=0XFF;
PORTC=0XF0;
DDRC=0X0F;
while(1)
{
scan=PINC;
scan&=0xf0;
if(scan!=0xf0)
{
delay(10);
scan=PINC;
scan&=0xf0;
if(scan!=0xf0)
{
DDRC=0XFF;
PORTC=0X0F;
DDRC=0XF0;
key=PINC;
key&=0x0f;
return (scan|key);
}
}
}
回答完有分,不是我小气,要是没人回答,我怕浪费了分值。辛苦一下大家吧! 展开
下面是我写的这个程序,见笑了。
uchar key_scan()
{
uchar scan,key;
DDRC=0XFF;
PORTC=0XF0;
DDRC=0X0F;
while(1)
{
scan=PINC;
scan&=0xf0;
if(scan!=0xf0)
{
delay(10);
scan=PINC;
scan&=0xf0;
if(scan!=0xf0)
{
DDRC=0XFF;
PORTC=0X0F;
DDRC=0XF0;
key=PINC;
key&=0x0f;
return (scan|key);
}
}
}
回答完有分,不是我小气,要是没人回答,我怕浪费了分值。辛苦一下大家吧! 展开
4个回答
展开全部
输入改成输出的时候,原来DDRC = 0X0F;PORTC = 0XF0;,取到SCAN.
之后反转DDRC = 0XF0;PORTC = 0X0F;这时候要注意在反转后要加一个空指令NOP();AVR单片机并不是马上会执行,隔一个周期,PORTC才会真正输出要求的.
一般写2~3条输出指令,如: PORTC = 0X0F; PORTC = 0X0F; 之后再读取端口状态才会读回正确的电平状态。
单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。
之后反转DDRC = 0XF0;PORTC = 0X0F;这时候要注意在反转后要加一个空指令NOP();AVR单片机并不是马上会执行,隔一个周期,PORTC才会真正输出要求的.
一般写2~3条输出指令,如: PORTC = 0X0F; PORTC = 0X0F; 之后再读取端口状态才会读回正确的电平状态。
单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。
展开全部
DDRC是控制端口方向的,为1时是输出口反之为输入口。当设置为输入口时,PORTC用来控制内部上拉允许的,为1时允许内部上拉。端口值读取用PINC。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
输入改成输出的时候,原来DDRC = 0X0F;PORTC = 0XF0;,取到SCAN.
之后反转DDRC = 0XF0;PORTC = 0X0F;这时候要注意在反转后要加一个空指令NOP();AVR单片机并不是马上会执行,隔一个周期,PORTC才会真正输出你要求的.
一般我会连续写2~3条输出指令,如: PORTC = 0X0F; PORTC = 0X0F; 之后再读取端口状态才会读回正确的电平状态.
最好每次输出都重复写2条指令或加一句空指令.
之后反转DDRC = 0XF0;PORTC = 0X0F;这时候要注意在反转后要加一个空指令NOP();AVR单片机并不是马上会执行,隔一个周期,PORTC才会真正输出你要求的.
一般我会连续写2~3条输出指令,如: PORTC = 0X0F; PORTC = 0X0F; 之后再读取端口状态才会读回正确的电平状态.
最好每次输出都重复写2条指令或加一句空指令.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器、内部SRAM 数据存储器和EEPROM 数据存储器。
Flash 存储器为1K~128K 字节,支持并行编程和串行下载,下载寿命通常可达10,000 次。由于AVR 指令都为16 位或32 位,程序计数器对它按字进行寻址,因此FLASH 存储器按字组织的,但在程序中访问 FLASH 存储区时专用指令LPM 可分别读取指定地址的高低字节。
寄存器堆(R0~R31)、I/O 寄存器和SRAM 被统一编址。所以对寄存器和I/O 口的操作使用与访问内部SRAM 同样的指令。32 个通用寄存器被编址到最前,I/O 寄存器占用接下来的64 个地址。从0X0060 开始为内部SRAM。外部SRAM 被编址到内部SRAM 后。
AVR 单片机的内部有64~4K 的EEPROM 数据存储器,它们被独立编址,按字节组织。擦写寿命可达100,000 次。
Flash 存储器为1K~128K 字节,支持并行编程和串行下载,下载寿命通常可达10,000 次。由于AVR 指令都为16 位或32 位,程序计数器对它按字进行寻址,因此FLASH 存储器按字组织的,但在程序中访问 FLASH 存储区时专用指令LPM 可分别读取指定地址的高低字节。
寄存器堆(R0~R31)、I/O 寄存器和SRAM 被统一编址。所以对寄存器和I/O 口的操作使用与访问内部SRAM 同样的指令。32 个通用寄存器被编址到最前,I/O 寄存器占用接下来的64 个地址。从0X0060 开始为内部SRAM。外部SRAM 被编址到内部SRAM 后。
AVR 单片机的内部有64~4K 的EEPROM 数据存储器,它们被独立编址,按字节组织。擦写寿命可达100,000 次。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询