第一步:配置GPIO
在点亮第一个LED章节已经讲解了GPIO口的操作,下面我们再来看一个寄存器:
这个寄存器只能读。越看越像msp430的操作了。
下面之间看按键初始化和按键读取函数:
void Key_Init(void)
{
PD_DDR &= 0x7F; //PD7 输入 PD_DDP第7位置0
PD_CR1 |= 0x80; //带上拉输入 PD_CR1第7位置1
PD_CR2 &= 0x7F; //禁止外部中断 PD_CR2第7位置0
}
void Key_Scan(void)
{
if(PD_IDR_IDR7==0)
{
delay_ms(20); //延时消抖
if(PD_IDR_IDR7==0) //读取PD7的输入状态
{
PE_ODR^=0x20; //PE5取反
}
}
}
按键读取函数是不是很像以前写
51
的程序那样?呵呵
O(
∩
_
∩
)O~
。
为什么用PD_IDR_IDR7?
打开头文件IOSTM8S105K4.h,是不是看见里面有好多的 Port A bit fields 的内容?PB、PC和其他端口和其他外设的也有。
其实端口都可以直接位操作,一般人我不告诉他。O(∩_∩)O哈哈~
例如PA0设置为输出输、出高电平:
PA_DDR_DDR0 = 1; //设置PA0为输出
PA_CR1_C10 = 1; //可以不写这句 为什么?自己看手册
PA_CR2_C20 = 1; //推挽输出最大速度10MHz
PA_ODR_ODR0 = 1; //PA0输出高电平
其实这个也是我看了头文件后感觉有些奇怪,有些像msp430;管他像什么,试试再说,哈哈,果然可以。
再给大家一个延时函数,这个是我自己用示波器测量出来了。
/*延时xms函数@ HSI 2MHz*/
void delay_ms(u16 xms)
{
u16 i,j;
for(i=xms;i>0;i--)
for(j=330;j>0;j--) //330这个参数可能单片机内部HSI有差异会不同
{
asm("nop");
}
}
第二步:下载调试
再看主函数:
int main( void )
{
System_Init();
Key_Init();
Gpio_Init();
while (1)
{
Key_Scan();
}
}