键盘输入
——I/O输入试验
一.试验意图
可以正确读取PIO的管脚状况,完成当有按键按下时,LED点亮,不然灭。
二.试验程序和参数设置
1>连接器选项设置和发动代码都与上个试验相同
2>C言语的代码
#i nclude “AT91SAM7S64.h” //特别功用寄存器头文件。相似与51单片机中reg51.h
#i nclude “Board.h” //界说方针板的头文件
int main(void)
{ unsigned int Key_Val;//界说变量,unsigned int为32位,C51是16位
*AT91C_PIOA_PER = LED_MASK | SW_MASK;//使能LED、KEY脚I/O口功用 *AT91C_PIOA_ODR = SW_MASK;//使能4个KEY对应管脚的输入功用
*AT91C_PIOA_OER = LED_MASK;//使能4个LED管脚的输出功用
while (1)
{
Key_Val = *AT91C_PIOA_PDSR;//读管脚的电平状况
if (Key_Val & SW1)
{
*AT91C_PIOA_SODR = LED1;//将状况反映给LED
}
else
{
*AT91C_PIOA_COER = LED1;//按钮按下时,LED1亮
}
}
}
三.呈现的问题与解决方法
1> 不管作输入用的I/O口电平怎么改变,管脚状况寄存器(AT91C_PIOA_PDSR)的内容一直为0,即I/O口的输入功用没起作用。
原因是AT91SAM7Sxx内部集成了功率办理操控器,用它来操控一切外设的时钟以到达优化功耗的意图。所以只有使能了PIO的外围时钟,PIO外设才会作业,才干读入输入管脚的状况。那么为什么PIO作为输出时不需求使能外围时钟呢?我个人认为这与内部外设在数字电路上的完成有关,输出功用只需求组合逻辑电路(不必时钟)就能完成,而输入功用则需求用到时序逻辑电路(需求时钟)才干完成。
因而,有必要在main()函数的最初添加如下两条时钟使能的句子:
*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能体系时钟寄存器的处理器时钟
*AT91C_PMC_PCER = 1 91C_ID_PIOA; //使能PIOA外围时钟
四.总结
当要使AT91SAM7S64特定的外设作业时,有必要使能相应外设的时钟操控寄存器。相反,假如不必相应的外设,禁能相应的时钟可以降低功耗。