帮同学写的简单的入门程序,基于STM8S105
课程:按下键就灯亮
环境:IAR for STM8
芯片:STM8S105
照惯例,分享附件
1,公司之前做的一块板的原理图
2,STM8从入门到精通 这是一本个人比较推荐的入门书籍,纯粹为了入门
ok,开始
1,配置好时钟,为16M晶振
Tip:这个函数可以直接拿去用
/*********************************************
函数功能:系统内部时钟配置
输入参数:SYS_CLK : 2、4、8、16
输出参数:无
备 注:系统启动默认内部2MHZ
*********************************************/
void CLOCK_Config(unsigned char SYS_CLK)
{
//时钟配置为内部RC,16M
CLK->CKDIVR &=~(BIT(4)|BIT(3));
switch(SYS_CLK)
{
case 2: CLK->CKDIVR |=((1<<4)|(1<<3)); break;
case 4: CLK->CKDIVR |=(1<<4); break;
case 8: CLK->CKDIVR |=(1<<3); break;
}
}
2,配置好IO口
Tip:这个请查看我分享的资料《stm8从入门到精通》的GPIO章节
void LED_INTI(void) //推挽输出
{
PC_DDR |=(1<<3); //power 1-3
PC_CR1 |=(1<<3);
PC_DDR |=(1<<4);
PC_CR1 |=(1<<4);
PC_DDR |=(1<<5);
PC_CR1 |=(1<<5);
}
void KEY_INTI(void) //配置成悬浮输入
{
PB_DDR &= ~((1<<1)+(1<<2)+(1<<3)); //按键1-3
PB_CR2 |= ((1<<1)+(1<<2)+(1<<3));
PB_CR1 &= ~((1<<1)+(1<<2)+(1<<3));
EXTI_CR1 |= (1<<2); //配置上升沿中断
}
3,添加头文件
#include "IOSTM8S105K4.h"
#include "stm8s.h" //有时候我觉得没有必要添加这个
....(你自己写的头文件添加进来)
Tip : 请检查你的文件已经添加到工程项目中
4,按键解决方案
a,之前学C51的时候,我采用的方法是
Tip : 软件演示,"消抖"
if(key1)
{
delay_us(20); //这个要看具体的延时
if(key1)
{
执行程序;
........;
........;
}
}
b,这里采用的方法是
Tip:
a,自行查阅STM8从入门到精通 的 中断向量表;
b, 如果用数字表示中断向量,请加2
c,这个程序请确保引脚平时处于低电平,按下处于高电平
#pragma vector = 6 //这个要根据具体的外部中断选择 PA:5 PB:6 PC:7 PD:8 ...
__interrupt void PC_470Rx(void)
{
if(PB_ODR_ODR1==1)
{
LED1=!LED1;
}
if(PB_ODR_ODR2==1)
{
LED2=!LED2;
}
if(PB_ODR_ODR3==1)
{
LED3=!LED3;
}
}
5,编写主函数
#.....//需要的时候添加头文件
#.....//需要的时候添加头文件
#include "IOSTM8S105K4.h" //要自己查看芯片
#define LED1 PC_ODR_ODR3
#define LED2 PC_ODR_ODR4
#define LED3 PC_ODR_ODR5
#define KEY1 PCB_ODR_ODR1
#define KEY2 PCB_ODR_ODR2
#define KEY3 PCB_ODR_ODR3
unsigned char Key1Fg;
unsigned char Key2Fg;
unsigned char Key3Fg;
void LED_INTI(void); //函数先声明
void KEY_INTI(void); //函数先声明
void CLOCK_Config(unsigned char SYS_CLK); //函数先声明
//Tip:可以试着把上面一段注释掉 看看什么错误
//Tip: 由于我是在记事本里面写的程序,可能有中文输入的问题
void main()
{
CLOCK_Config(16);
LED_INTI();
KEY_INTI();
for(;;)
{
if(Key1Fg)
{
Key1Fg=0; // 试一下不加这一句
....; //自己添加自己要增加的功能
....; /自己添加自己要增加的功能
}
if(Key2Fg)
{
Key2Fg=0; // 试一下不加这一句
....; //自己添加自己要增加的功能
....; /自己添加自己要增加的功能
}
if(Key3Fg)
{
Key3Fg=0; // 试一下不加这一句
....; //自己添加自己要增加的功能
....; /自己添加自己要增加的功能
}
}
}
void LED_INTI(void)
{
........;在这里进行配置 如上
}
void KEY_INTI(void)
{
。。。。。;//配置按键 如上
}
void CLOCK_Config(unsigned char SYS_CLK)
{
.......;//配置时钟
}
中断函数
#pragma vector = 6 //这个要根据具体的外部中断选择 PA:5 PB:6 PC:7 PD:8 ...
{
if(PB_ODR_ODR1==1)
{
Key1Fg =1;
}
if(PB_ODR_ODR2==1)
{
Key2Fg =1;
}
if(PB_ODR_ODR3==1)
{
Key3Fg =1;
}
}
作者: Bruce-Woo, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-1850657.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
用户1862599 2015-12-25 15:24
用户377235 2015-12-7 23:38
Bruce-Woo 2015-11-30 12:18
用户611095 2015-11-30 10:57