打印
[STM8]

STM8 新人报道,几个简单的程序(基于STM8 MCU 三合一体验套件)

[复制链接]
11094|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
327433171|  楼主 | 2011-5-4 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU, STM8, pd, IO, ui
本帖最后由 327433171 于 2011-5-4 21:13 编辑

首先来自我介绍,望大家以后多多关照。小姓陈,大家可以叫我小陈。用户名即QQ号码,大家可以通过QQ来联系到我。毕业后之内的一年里,因为工作是负责焊接电源的开发,目前开发的都是模拟控制的机器。所以这一年根本没有接触过单片机=处理器,C语言也有点生疏了。之前读书时候,曾用 MCU ARM FPGA 这玩意做作品出来参加电子大赛,所以基本功还是挺扎实的。虽然现在的工作暂时还用不上这数字化芯片,但也阻挡不了我对他们的热爱之情。读书时候层用过STM32 ARM,是因为ST是做工业级器件出身的,相信他做的CPU 在工业环境中也会表现出优秀的抗干扰特性。好,废话不多说。自我介绍也不是三言两语能表达出来的。希望在以后的交流中,彼此认知吧。。
第一个例程完全玩转IO,既读取IO的输入状态,又改变IO的输出状态,程序意思是 按键每按下一次,带松手检测。三颗LED 轮流点亮和熄灭。程序过于简单,就不解释了,如有疑问,可直接提出。
#include "STM8S105C_S.h"
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0x00,0x01,0x04,0x08};
uchar i=0;

void GPIO_Init(void)
{

PD_DDR|=0x0d;
//3个LED端口(PD3 PD2 PD0 )设为推挽输出,频率10M  方向,方式,频率

PD_CR1|=0x0d;

PD_CR2|=0x0d;



PD_DDR&=0x7f;
//按键端口(PD7)设置为三态输入

PD_CR1&=0x7f;
//三态输入

PD_CR2|=0x80;
//使能中断
}

void Delay(uint k)
{
uint j;

for(j=k;j>0;j--);
}
uchar key(void)
{

uchar j;

j=i;
if(!(PD_IDR&0x80))
//读入按键值

{

Delay(1000);

if(!(PD_IDR&0x80))

{

while(!(PD_IDR&0x80));

j++;

if(j==4)j=0;

i=j;

}

}

return (j);
}
main()
{
GPIO_Init();
while (1)
{

PD_ODR=table[key()];
//往IO口写数据
}
}
沙发
327433171|  楼主 | 2011-5-4 20:55 | 只看该作者
继续发一个,是定时器四的测试程序,程序实现功能是板子上的3颗LED做流水灯,至于流水快慢,我没有去研究,只是个时钟问题而已,关键是定时器能否跑起来,程序是用软件查询标志位的方法来判断定时计数器是否溢出实现的。

#include "STM8S105C_S.h"
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0x00,0x01,0x04,0x08};
uchar i=0;

void GPIO_Init(void)
{
        PD_DDR|=0x0d;                                        //3个LED端口(PD3 PD2 PD0 )设为推挽输出,频率10M  方向,方式,频率
        PD_CR1|=0x0d;
        PD_CR2|=0x0d;

}
void Time4_Init(void)
{
        TIM4_IER=0x00;                                        //禁止触发中断,禁止更新中断
        TIM4_EGR=0x01;                                        //计数器溢出时,更新事件产生
        TIM4_PSCR=0x07;                                //对计数脉冲进行128分频
        TIM4_ARR=255;                                        //计数值,当计数器计数到这个值就溢出
        TIM4_CR1=0x01;                                        //使能计数器
}

void Delay(uint k)
{
uint j;
        for(j=k;j>0;j--);
}

main()
{
GPIO_Init();
Time4_Init();
while (1)
{
                PD_ODR=table[i];                        //往IO口写数据
                if(TIM4_SR & 0X81)
                {
                i++;
                TIM4_SR=0x00;
                }
                if(i==4)i=0;
       
}
}

使用特权

评论回复
板凳
327433171|  楼主 | 2011-5-4 20:59 | 只看该作者
继续发一个也是定时器4的应用程序,这次是基于中断的方法的。实现功能跟上面软件查询的一样,简单的流水灯。
#include "STM8S105C_S.h"
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0x00,0x01,0x04,0x08};
uchar i=0;

void GPIO_Init(void)
{
        PD_DDR|=0x0d;                                        //3个LED端口(PD3 PD2 PD0 )设为推挽输出,频率10M  方向,方式,频率
        PD_CR1|=0x0d;
        PD_CR2|=0x0d;
}
void Time4_Init(void)
{
        TIM4_IER=0x01;                                        //禁止触发中断,使能更新中断
        TIM4_EGR=0x01;                                        //计数器溢出时,更新事件产生
        TIM4_PSCR=0x07;                                //对计数脉冲进行128分频
        TIM4_ARR=255;                                        //计数值,当计数器计数到这个值就溢出
        TIM4_CR1=0x01;                                        //使能计数器
        _asm("rim");//这是开中断
}

main()
{
GPIO_Init();
Time4_Init();
while (1)
{
                PD_ODR=table[i];                        //往IO口写数据
}
}
@far @interrupt void TIM4_UPD_OVF_IRQHanlder (void)
{
        TIM4_SR=0x00;
        i++;
        if(i==4)i=0;
}


/*        BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
*        Copyright (c) 2007 STMicroelectronics
*/

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
        unsigned char interrupt_instruction;
        interrupt_handler_t interrupt_handler;
};

@far @interrupt void NonHandledInterrupt (void)
{
        /* in order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction
        */
        return;
}

extern void _stext();     /* startup routine */
extern @far @interrupt void TIM4_UPD_OVF_IRQHanlder (void);
struct interrupt_vector const _vectab[] = {
        {0x82, (interrupt_handler_t)_stext}, /* reset */
        {0x82, NonHandledInterrupt}, /* trap  */
        {0x82, NonHandledInterrupt}, /* irq0  */
        {0x82, NonHandledInterrupt}, /* irq1  */
        {0x82, NonHandledInterrupt}, /* irq2  */
        {0x82, NonHandledInterrupt}, /* irq3  */
        {0x82, NonHandledInterrupt}, /* irq4  */
        {0x82, NonHandledInterrupt}, /* irq5  */
        {0x82, NonHandledInterrupt}, /* irq6  */
        {0x82, NonHandledInterrupt}, /* irq7  */
        {0x82, NonHandledInterrupt}, /* irq8  */
        {0x82, NonHandledInterrupt}, /* irq9  */
        {0x82, NonHandledInterrupt}, /* irq10 */
        {0x82, NonHandledInterrupt}, /* irq11 */
        {0x82, NonHandledInterrupt}, /* irq12 */
        {0x82, NonHandledInterrupt}, /* irq13 */
        {0x82, NonHandledInterrupt}, /* irq14 */
        {0x82, NonHandledInterrupt}, /* irq15 */
        {0x82, NonHandledInterrupt}, /* irq16 */
        {0x82, NonHandledInterrupt}, /* irq17 */
        {0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, NonHandledInterrupt}, /* irq19 */
        {0x82, NonHandledInterrupt}, /* irq20 */
        {0x82, NonHandledInterrupt}, /* irq21 */
        {0x82, NonHandledInterrupt}, /* irq22 */
        {0x82, TIM4_UPD_OVF_IRQHanlder}, /* irq23 */
        {0x82, NonHandledInterrupt}, /* irq24 */
        {0x82, NonHandledInterrupt}, /* irq25 */
        {0x82, NonHandledInterrupt}, /* irq26 */
        {0x82, NonHandledInterrupt}, /* irq27 */
        {0x82, NonHandledInterrupt}, /* irq28 */
        {0x82, NonHandledInterrupt}, /* irq29 */
};

使用特权

评论回复
地板
327433171|  楼主 | 2011-5-5 23:01 | 只看该作者
继续发一个调用ADC的程序,程序实现功能是,电位器旋转,三颗LED的状态也跟着变化。程序宗旨在于简单的应用,简单的控制。只是为了跑动一下各个功能模块,更深入的请自行研究。
#include "STM8S105C_S.h"
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0x00,0x01,0x04,0x08};
uchar i=0;

void GPIO_Init(void)
{
        PD_DDR|=0x0d;                                        //3个LED端口(PD3 PD2 PD0 )设为推挽输出,频率10M  方向,方式,频率
        PD_CR1|=0x0d;
        PD_CR2|=0x0d;
       
        //PD_DDR&=0x7f;                                        //按键端口(PD7)设置为三态输入
        //PD_CR1&=0x7f;                                        //三态输入
        //PD_CR2|=0x80;                                        //使能中断
}

void ADC_Init(void)
{
        ADC_CSR=0x03;                                                //设定AIN3为模拟输入通道
        ADC_CR1=0x03;                                                //设定分频为1/2/ 连续转换模式,ADC电源开关打开
        ADC_CR2=0x28;                                                //禁止触发,禁止扫描,数据右对齐
        ADC_CR3=0x00;                                                //禁止数据缓存
        ADC_CR1=0x03;                                                //设定分频为1/2/ 连续转换模式,ADC电源开关打开
        //ADC_DR                                                                //16为ADC转换数据寄存器
}

void Delay(uint k)
{
uint j;
        for(j=k;j>0;j--);
}

main()
{
GPIO_Init();
ADC_Init();
while (1)
{
                if(ADC_DR>682) PD_ODR=table[3];
                else if(ADC_DR<341) PD_ODR=table[1];
                else PD_ODR=table[2];
}
}

使用特权

评论回复
5
无冕之王| | 2011-5-6 16:46 | 只看该作者
楼主挺自信嘛,不错

使用特权

评论回复
6
火箭球迷| | 2011-5-7 16:26 | 只看该作者
楼主是在写学习笔记,很好

使用特权

评论回复
7
yybj| | 2011-5-7 19:07 | 只看该作者
楼主的学习比较写的不错

使用特权

评论回复
8
batloveshan| | 2011-7-18 22:58 | 只看该作者
不错,顶!!呵呵,正在学习STM8L152C6T6后头也传份共享

使用特权

评论回复
9
xsgy123| | 2011-7-19 09:24 | 只看该作者
鼓励共享

使用特权

评论回复
10
zhangyanjuan| | 2011-7-20 13:05 | 只看该作者
学习学习

使用特权

评论回复
11
dfsa| | 2011-7-20 22:55 | 只看该作者
鼓励多写学习笔记

使用特权

评论回复
12
lixiaoxu2meng| | 2011-7-21 07:58 | 只看该作者
mark

使用特权

评论回复
13
火箭球迷| | 2011-7-21 09:15 | 只看该作者
楼主对数字电路这么感兴趣,为啥不找份数字电路的工作呢

使用特权

评论回复
14
anqier1| | 2011-7-21 13:04 | 只看该作者
对啊 楼主如此的痴迷

使用特权

评论回复
15
anqier1| | 2011-7-21 13:04 | 只看该作者
工作必然好找啊

使用特权

评论回复
16
hsbjb| | 2011-7-22 10:37 | 只看该作者
不错,值得鼓励

使用特权

评论回复
17
pananmao3760675| | 2011-7-22 10:40 | 只看该作者
:)

使用特权

评论回复
18
无冕之王| | 2011-7-22 14:14 | 只看该作者
鼓励初学者多写笔记和总结

使用特权

评论回复
19
gxgclg| | 2011-7-22 15:49 | 只看该作者
多多交流

使用特权

评论回复
20
mzh1245| | 2012-1-7 11:42 | 只看该作者
mark

使用特权

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

本版积分规则

207

主题

219

帖子

1

粉丝