#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include<lm3sxxx.h>
#include<stdio.h>
unsigned long Sysclk = 12000000UL;
// 防止JTAG失效
void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能KEY所在的GPIO端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4); // 设置KEY所在管脚为输入
if (GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4) == 0x00) // 若复位时按下KEY,则进入
{
while(1); // 死循环,以等待JTAG连接
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口
}
void clockInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_75V);
SysCtlClockSet(SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN );
Sysclk=SysCtlClockGet();
}
int main(void)
{
jtagWait();
clockInit();
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC |);
// 使能KEY所在的GPIO端口
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_6|GPIO_PIN_7);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_6|GPIO_PIN_7);
GPIOPinWrite(GPIO_PORTB_BASE,
(GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3 |
GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6|GPIO_PIN_7), 0xF0);
unsigned char key;
while(1)
{
key=kbscan(); //键盘扫描函数
delay10ms(); //健消除抖动的延时函数
}
void delay10ms()
{
unsigned char i;
for(i=0xff;i>0;i--);
}
unsigned char kbscan()
{
unsigned char sccode,recode;
B=0xf0; //发全“0”行扫描,列线输入
if(B&0xf0)!=0xf0) //有键按下
{
delay10ms(); //延时去抖动
if((B&0xf0)!=0xf0)
{
sccode =0xf0; //逐行扫描初值
while((sccodeZ&0x10)!=0)
{
B=sccode; //输出行扫描码
if((B&0XF0)!=0XF0) //本行有键按下
{
ecode=(B&0xf0)|0xf0;
return((~sccode)+(~recode); //返回特征码
}
else sccode=(sccode<<1)|0x01; //行扫描码左移一位
}
}
}
}
return 0; //无键按下,返回0}
}
[
本帖最后由 academic 于 2011-9-18 20:33 编辑 ]
此帖出自
小平头技术问答
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_6|GPIO_PIN_7);
程序上看,你用了一个PORTB口来作为4*4键盘行和列,而且都配置成输出。
4*4矩阵键盘接在一个8位的PORT时,应当是4个脚配置成输出模式,用于给出扫描电平。另外四个配置成输入模式,读入引脚电平信号,用于判断按下的按键。
另外,还得注意输出最好配置成带上拉的模式,不要形成悬空。
一周热门 更多>