打印
[STM8]

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

[复制链接]
38942|262
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 电子云图 于 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)   原理图; 风驰STM8开发板原理图V2_1版本.pdf (79.9 KB)








评分
参与人数 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)

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

源代码; 02.闪烁的LED.zip (24.49 KB)

使用特权

评论回复
板凳
xxiao6130| | 2013-9-16 12:00 | 只看该作者
怎么就只有这么两个呢?太少了。

使用特权

评论回复
地板
电子云图|  楼主 | 2013-9-16 12:03 | 只看该作者
本帖最后由 电子云图 于 2013-9-16 12:09 编辑

不要着急,后面会不断更新,我都是现写现发的 ,就当是前面学STM8的一个总结。欢迎各位交流讨论,
感兴趣的可以先搬个板凳做一下。

使用特权

评论回复
5
电子云图|  楼主 | 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)

使用特权

评论回复
6
callhgd| | 2013-9-16 13:05 | 只看该作者
来根板凳听老师讲解。

使用特权

评论回复
7
tee.| | 2013-9-16 13:07 | 只看该作者
前排,支持下。

使用特权

评论回复
8
xxiao6130| | 2013-9-16 13:47 | 只看该作者
电子云图 发表于 2013-9-16 12:03
不要着急,后面会不断更新,我都是现写现发的 ,就当是前面学STM8的一个总结。欢迎各位交流讨论,
感兴趣的 ...

等待更多精彩!

使用特权

评论回复
9
电子云图|  楼主 | 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)










使用特权

评论回复
10
电子云图|  楼主 | 2013-9-16 16:36 | 只看该作者
本帖最后由 电子云图 于 2013-9-16 16:41 编辑

后面的例程开始,采用C文件+H文件,软件延时用定时器4.

使用特权

评论回复
11
puchuang| | 2013-9-16 18:36 | 只看该作者
楼主给力   很好的学习帖子  谢谢楼主  谢谢了  这一块   要多花点时间去琢磨琢磨  谢谢楼主

使用特权

评论回复
12
电子云图|  楼主 | 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)

使用特权

评论回复
13
sunjiaqi2004| | 2013-9-17 08:54 | 只看该作者
我可以中途插播广告吗?

使用特权

评论回复
14
电子云图|  楼主 | 2013-9-17 09:12 | 只看该作者
做啥子广告?万一版主封了这个贴,广大网友可要找你麻烦了

使用特权

评论回复
15
电子云图|  楼主 | 2013-9-17 10:18 | 只看该作者
          玩转STM8,第六战,数码管静态驱动
利用STM8的GPIO强挽推直接驱动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全局中断       
        WEI1=WEI2=WEI3=WEI4=1;        //全部位打开
        while(1)                                //大循环
        {
                for(i=0;i<16;i++)        //16位循环结构
                {
                        DPY_DATA=DPY_CODE;        //显示数据
                        Delay_10us(50000);                //延时500毫秒
                }
        }
}

效果图片;


这里晒一下我的焊接技术


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


使用特权

评论回复
16
_正方形| | 2013-9-17 10:31 | 只看该作者
赞!!!!!

使用特权

评论回复
17
yuanquanquan| | 2013-9-17 10:38 | 只看该作者
求4*4矩阵按键的历程   因为我实在不知道为什么我的矩阵按键的程序只有12个可以正常使用

使用特权

评论回复
18
电子云图|  楼主 | 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;       
        }
}



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








使用特权

评论回复
19
电子云图|  楼主 | 2013-9-17 10:45 | 只看该作者
矩阵按键的后面来,我这个是按照难易程度来的,先搬个板凳做一下,等一下吧!

使用特权

评论回复
20
lnak| | 2013-9-17 11:09 | 只看该作者
:time:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

162

帖子

7

粉丝