热度 20
2015-11-30 11:36
3028 次阅读|
4 个评论
帮同学写的简单的入门程序,基于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 CKDIVR &=~(BIT(4)|BIT(3)); switch(SYS_CLK) { CKDIVR |=((1<<4)|(1<<3)); break; CKDIVR |=(1<<4); break; 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; } }