[STM8] 玩转STM8(寄存器版),超强连载,绝对原创,欢迎讨论交流

[复制链接]
44155|262
 楼主| 电子云图 发表于 2013-9-16 10:38 | 显示全部楼层 |阅读模式
本帖最后由 电子云图 于 2013-9-16 12:04 编辑

                             玩转STM8,第一战,点亮一个LED
开发工具;ST-LINK/V2
开发环境;STVD+STVP+Cosmic
硬件平台;风驰STM8开发板(豪华板)

//单位:虔州科技
//作者;电子云图
//时间;2013-9-16
//功能;点亮一个LED灯
//MCU ; STM8S208R8----HSI(2M)
//连接LED2--------------PD0


#include<iostm8s.h>                //STM8S寄存器寄存器声明头文件


_Bool PD0 @PD_ODR:0;        //将PD0口定义为一个位变量        
#define LED2 PD0                //宏定义PD0口接的是LED2


void LED_Init(void);        //声明LED初始化子函数


void main(void)                //主函数
{
        LED_Init();                        //初始化LED
        LED2=0;                    //点亮LED
        while(1);                        //无限循环
}


//名称;LED初始化函数
void LED_Init(void)        
{
        PD_DDR|=0X01;        //PD0输出模式
        PD_CR1&=0XFE;        //PD0模拟开漏输出
        PD_CR2&=0XFE;        //PD0输出速度最大为2MHZ
}

实验现象;LED被点亮了

设计要点;
1.STM8单片机IO口位变量的声明
2.用&和|操作8位I/O口,使其余IO口的状态不变

注意事项;本例程用的是单片机内部RC震荡,默认为16M的8分频,即2M,开机会自动初始化完成。

由于上传限制;资料请自己搜索下载;现在上传一下源代码; 01.点亮一个LED.zip (34.1 KB, 下载次数: 335)   原理图; 风驰STM8开发板原理图V2_1版本.pdf (79.9 KB, 下载次数: 315)








评分

参与人数 1威望 +10 收起 理由
xyz549040622 + 10

查看全部评分

 楼主| 电子云图 发表于 2013-9-16 11:40 | 显示全部楼层
本帖最后由 电子云图 于 2013-9-16 16:23 编辑

                               玩转STM8,第二战,闪烁的LED

//单位:虔州科技
//作者;电子云图
//时间;2013-9-16
//功能;闪烁的LED灯
//MCU ;        STM8S208R8----HSI(2M)
//连接LED2--------------PD0


#include<iostm8s.h>                //STM8S寄存器寄存器声明头文件


_Bool PD0 @PD_ODR:0;        //将PD0口定义为一个位变量        
#define LED2 PD0                //宏定义PD0口接的是LED2


void Delay(void);                //声明延时子函数
void LED_Init(void);        //声明LED初始化子函数


void main(void)                //主函数
{
        LED_Init();                        //初始化LED
        while(1)                        //大循环
        {
                LED2=~LED2;                //LED2取反
                Delay();                //延时
        }
}


//名称;延时函数,由于STM8流水线结构,不能精确计算延时,若要精确延时,用定时器
void Delay(void)
{
        unsigned int x;
        for(x=65535;x>0;x--)
        {
                _asm("nop");
        }
}


//名称;LED初始化函数
void LED_Init(void)        
{
        PD_DDR|=0X01;        //PD0输出模式
        PD_CR1&=0XFE;        //PD0模拟开漏输出
        PD_CR2&=0XFE;        //PD0输出速度最大为2MHZ
}

设计要点; 如何在Cosmic C文件中使用汇编.zip (500 Bytes, 下载次数: 188)

实验现象;LED2一定频率闪烁

源代码; 02.闪烁的LED.zip (24.49 KB, 下载次数: 196)
xxiao6130 发表于 2013-9-16 12:00 | 显示全部楼层
怎么就只有这么两个呢?太少了。
 楼主| 电子云图 发表于 2013-9-16 12:03 | 显示全部楼层
本帖最后由 电子云图 于 2013-9-16 12:09 编辑

不要着急,后面会不断更新,我都是现写现发的 ,就当是前面学STM8的一个总结。欢迎各位交流讨论,
感兴趣的可以先搬个板凳做一下。
 楼主| 电子云图 发表于 2013-9-16 12:45 | 显示全部楼层
本帖最后由 电子云图 于 2013-9-16 16:23 编辑

                                玩转STM8,第三战,流水灯
//单位:虔州科技
//作者;电子云图
//时间;2013-9-16
//功能;闪烁的LED灯
//MCU ;        STM8S208R8----HSI(2M)
//连剑; LED2--------------PD0
//             LED3--------------PC3


#include<iostm8s.h>                //STM8S寄存器寄存器声明头文件


_Bool PD0 @PD_ODR:0;        //将PD0口定义为一个位变量        
#define LED2 PD0                //宏定义PD0口接的是LED2


_Bool PC3 @PC_ODR:3;        //将PC3口定义为一个位变量        
#define LED3 PC3                //宏定义PC3口接的是LED3


void Delay(void);                //声明延时子函数
void LED_Init(void);        //声明LED初始化子函数


void main(void)                //主函数
{
        LED_Init();                        //初始化LED
        while(1)                        //大循环
        {
                LED2=0;                        //点亮LED2
                LED3=1;                        //熄灭LED3
                Delay();                //延时
                LED2=1;                        //熄灭LED2
                LED3=0;                        //点亮LED3
                Delay();                //延时               
        }
}


//名称;延时函数,由于STM8流水线结构,不能精确计算延时,若要精确延时,用定时器
void Delay(void)
{
        unsigned int x;
        for(x=65535;x>0;x--)
        {
                _asm("nop");
        }
}


//名称;LED初始化函数
void LED_Init(void)        
{
        PD_DDR|=0X01;        //PD0输出模式
        PD_CR1&=0XFE;        //PD0模拟开漏输出
        PD_CR2&=0XFE;        //PD0输出速度最大为2MHZ
        
        PC_DDR|=0X08;        //PC3输出模式
        PC_CR1&=0XF7;        //PC3模拟开漏输出
        PC_CR2&=0XF7;        //PC3输出速度最大为2MHZ        
}

实验现象;LED2和LED3交替闪烁
源代码; 03.流水灯.zip (24.37 KB, 下载次数: 183)

callhgd 发表于 2013-9-16 13:05 | 显示全部楼层
来根板凳听老师讲解。
tee. 发表于 2013-9-16 13:07 | 显示全部楼层
前排,支持下。
xxiao6130 发表于 2013-9-16 13:47 | 显示全部楼层
电子云图 发表于 2013-9-16 12:03
不要着急,后面会不断更新,我都是现写现发的 ,就当是前面学STM8的一个总结。欢迎各位交流讨论,
感兴趣的 ...

等待更多精彩!
 楼主| 电子云图 发表于 2013-9-16 16:22 | 显示全部楼层
本帖最后由 电子云图 于 2013-9-16 16:28 编辑

               玩转STM8,第四战,独立按键
//单位:虔州科技
//作者;电子云图
//时间;2013-9-16
//功能;        独立按键
//MCU ;        STM8S208R8----HSI(2M)
//连接;LED2--------------PD0
//             LED3--------------PC3
//                KEY1--------------PD7
//                KEY2--------------PE3


#include<iostm8s.h>                //STM8S寄存器寄存器声明头文件


_Bool PD0 @PD_ODR:0;        //将PD0口定义为一个位变量        
#define LED2 PD0                //宏定义PD0口接的是LED2


_Bool PC3 @PC_ODR:3;        //将PC3口定义为一个位变量        
#define LED3 PC3                //宏定义PC3口接的是LED3


_Bool PD7 @PD_IDR:7;        //将PD7口定义为一个位变量        
#define KEY1 PD7                //宏定义PD7口接的是KEY1


_Bool PE3 @PE_IDR:3;        //将PE3口定义为一个位变量        
#define KEY2 PE3                //宏定义PE3口接的是KEY2


void Delay(unsigned int);        //声明延时子函数
void LED_Init(void);                //声明LED初始化子函数
void KEY_Init(void);                //声明按键初始化函数
void KEY_Scan(void);


void main(void)                //主函数
{
        LED_Init();                        //初始化LED
        KEY_Init();                        //初始化KEY
        while(1)                        //大循环
        {
                KEY_Scan();                //按键扫描
        }
}


//名称;延时函数,由于STM8流水线结构,不能精确计算延时,若要精确延时,用定时器
//参数;延时时间
void Delay(unsigned int x)
{
        unsigned int i;
        for(i=x;i>0;i--)
        {
                _asm("nop");
        }
}


//名称;LED初始化函数
void LED_Init(void)        
{
        PD_DDR|=0X01;        //PD0输出模式
        PD_CR1&=0XFE;        //PD0模拟开漏输出
        PD_CR2&=0XFE;        //PD0输出速度最大为2MHZ
        
        PC_DDR|=0X08;        //PC3输出模式
        PC_CR1&=0XF7;        //PC3模拟开漏输出
        PC_CR2&=0XF7;        //PC3输出速度最大为2MHZ        
}


//名称;按键初始化函数
void KEY_Init(void)
{
        PD_DDR&=0X7F;        //PD7输入模式
        PD_CR1|=0X80;        //PD7带上拉输入
        PD_CR2&=0X7F;        //PD7无中断输入
        
        PE_DDR&=0XF7;        //PE3输入模式
        PE_CR1|=0X08;        //PE3带上拉输入
        PE_CR2&=0XF7;        //PE3无中断输入
}


//名称;按键扫描函数
void KEY_Scan(void)               
{
        if(KEY1==0)                                //KEY1按键按下
        {
                Delay(1000);                //消抖
                if(KEY1==0)                        //KEY1真的按下
                {
                        while(!KEY1);        //释放KEY1
                        LED2=~LED2;                //LED2取反
                }
        }
        if(KEY2==0)                        
        {
                Delay(1000);
                if(KEY2==0)
                {
                        while(!KEY2);
                        LED3=~LED3;
                }
        }        
}

调试结果;按KEY1,LED2取反亮灭。按KEY2,LED3取反亮灭。不同的按键可以适当调节消抖延时

设计要点;由于STM8没有双向I/O口,设计按键驱动程序时要将I/O口设置成上拉输入。 源代码; 独立按键.zip (34.92 KB, 下载次数: 202)










 楼主| 电子云图 发表于 2013-9-16 16:36 | 显示全部楼层
本帖最后由 电子云图 于 2013-9-16 16:41 编辑

后面的例程开始,采用C文件+H文件,软件延时用定时器4.
puchuang 发表于 2013-9-16 18:36 | 显示全部楼层
楼主给力   很好的学习帖子  谢谢楼主  谢谢了  这一块   要多花点时间去琢磨琢磨  谢谢楼主
 楼主| 电子云图 发表于 2013-9-17 08:35 | 显示全部楼层
                         玩转STM8,第五战,TIM4做软件延时
由于STM8流水线的原因,计算延时很麻烦,
它不像51有专用软件可以计算延时,也不像ARM有一个滴答定时器,
为了解决STM8软件延时的问题,用定时器做软件延时是一个很好的办法,
但是对于10US以下的延时,建议用_asm("nop");


设计要点;
1.全局中断的开启;_asm("rim");
2,中断程序的设计;
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)
{
    TIM4_SR = 0x00;         //清除更新标志
    //客户代码
}

3.在stm8s_interrupt_vector.c上配置和声明中断
配置;        {0x82, TIM4_UPD_OVF_IRQHandler}, /* irq23 */
声明;extern @far @interrupt void TIM4_UPD_OVF_IRQHandler (void);

具体详情,请看源代码 05.TIM4做软件延时.zip (58.58 KB, 下载次数: 430)
sunjiaqi2004 发表于 2013-9-17 08:54 | 显示全部楼层
我可以中途插播广告吗?
 楼主| 电子云图 发表于 2013-9-17 09:12 | 显示全部楼层
做啥子广告?万一版主封了这个贴,广大网友可要找你麻烦了
 楼主| 电子云图 发表于 2013-9-17 10:18 | 显示全部楼层
          玩转STM8,第六战,数码管静态驱动
利用STM8的GPIO强挽推直接驱动STM8
截图19.png
//单位:虔州科技
//作者;电子云图
//时间;2013-9-17
//功能;数码管静态显示
//现象;四位数码管静态显示0-F,间隔500MS


#include"stm8s.h"        //STM8头文件
#include"clk.h"                //时钟头文件
#include"tim4.h"        //定时器4头文件
#include"dpy.h"                //数码管头文件


//共阳数码管编码
unsigned char DPY_CODE[]={        0xc0,0xf9,0xa4,0xb0,                //0-3
                                                        0x99,0x92,0x82,0xf8,                //4-7
                                                        0x80,0x90,0x88,0x83,                //8-B
                                                        0xc6,0xa1,0x86,0x8e};                //c-f


void main(void)                                //主函数
{
        uchar i;                                //定义一个FOR循环变量
        CLK_Init();                                //初始化时钟,外部24M
        DPY_Init();                                //初始化数码管
        _asm("rim");                    //允许CPU全局中断       
        WEI1=WEI2=WEI3=WEI4=1;        //全部位打开
        while(1)                                //大循环
        {
                for(i=0;i<16;i++)        //16位循环结构
                {
                        DPY_DATA=DPY_CODE;        //显示数据
                        Delay_10us(50000);                //延时500毫秒
                }
        }
}

效果图片;
IMG_20130917_095937_副本.jpg
IMG_20130917_095842_副本.jpg
这里晒一下我的焊接技术
IMG_20130917_095852_副本.jpg

下面是源代码;
06.数码管静态显示.zip (61.46 KB, 下载次数: 202)


_正方形 发表于 2013-9-17 10:31 | 显示全部楼层
赞!!!!!
yuanquanquan 发表于 2013-9-17 10:38 | 显示全部楼层
求4*4矩阵按键的历程   因为我实在不知道为什么我的矩阵按键的程序只有12个可以正常使用
 楼主| 电子云图 发表于 2013-9-17 10:43 | 显示全部楼层
                                      玩转STM8,第七战,数码管动态驱动
//单位:虔州科技
//作者;电子云图
//时间;2013-9-17
//功能;数码管静态显示
//现象;四位数码管静态显示0-F,间隔500MS


#include"stm8s.h"        //STM8头文件
#include"clk.h"                //时钟头文件
#include"tim4.h"        //定时器4头文件
#include"dpy.h"                //数码管头文件


//共阳数码管编码
unsigned char DPY_CODE[]={        0xc0,0xf9,0xa4,0xb0,                //0-3
                                                        0x99,0x92,0x82,0xf8,                //4-7
                                                        0x80,0x90,0x88,0x83,                //8-B
                                                        0xc6,0xa1,0x86,0x8e};                //c-f


void main(void)                                //主函数
{
        uchar i;                                //定义一个FOR循环变量
        CLK_Init();                                //初始化时钟,外部24M
        DPY_Init();                                //初始化数码管
        _asm("rim");                    //允许CPU全局中断
        while(1)                                //大循环
        {
                WEI1=1;                                        //开第一位
                DPY_DATA=DPY_CODE[1];        //送段数据
                Delay_10us(100);                //延时1MS
                WEI1=0;                                        //关第一位
               
                WEI2=1;
                DPY_DATA=DPY_CODE[2];
                Delay_10us(100);
                WEI2=0;       


                WEI3=1;
                DPY_DATA=DPY_CODE[3];
                Delay_10us(100);
                WEI3=0;       


                WEI4=1;
                DPY_DATA=DPY_CODE[4];
                Delay_10us(100);
                WEI4=0;       
        }
}

IMG_20130917_103939_副本.jpg

下面是源代码;
07.数码管动态显示.zip (60.96 KB, 下载次数: 209)








 楼主| 电子云图 发表于 2013-9-17 10:45 | 显示全部楼层
矩阵按键的后面来,我这个是按照难易程度来的,先搬个板凳做一下,等一下吧!
lnak 发表于 2013-9-17 11:09 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

162

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部