Microsoft .NET Micro Framework移植开发笔记2之点灯神话

 写完HelloWorld后,开始进入GPIO的操作,无论是拿到任何的嵌入式的板子,第一件事情就是点亮LED。MF也是这里开始,废话不多说,直接新建VS2010的MF工程。要想点亮LED,就是要操作GPIO,要操作GPIO口就要初始,MF也是一样。在Program.cs的Main函数加入初始化 OutputPort led0 = new OutputPort((Cpu.Pin)21, false);  OutputPort说明是把IO初始化成通用输出口,"(Cpu.Pin)21”说是初始化第21个IO(MF的IO是从PA0作0开始算,战舰板上的LED0是PB5,也就是16+5=21),后面的false是指初始化的电平,这里要点亮LED0,就要把电平拉低,所以是false(0)。点生成,会发现有错误,那是新建的工程里没增加定义Output的动态链接库。右键点右边的引用 找到Microsoft.SPOT.Hardware,然后点确定加进去。然后在代码开头用using看它加进去,即是using Microsoft.SPOT.Hardware; 这跟我们有#include是一样的。然后可以看到错误就没有了,点调试,把代码部署到板子就,就可以看到LED0被点亮了(这也太简单了吧,用MDK写的话要点亮LED,还要一大堆的工作,大家都知道,就不说了)。
     点亮了LED后,都会想怎么把它闪烁起来。要闪烁自然要用到延时,先上代码
while (true)
            {
                led0.Write(!led0.Read());
                Thread.Sleep(500);
            }
led0.Write就是直接写PB5的电平,led0.Read()是读现在PB5电平状态,连接起来就是翻转PB5的电平,达成led0的闪烁。  Thread.Sleep(500)自然就是延时函数,这里MF只提供了以ms为单位的延时(很多人就会想,如果操作GPIO需要us级的延时话,怎么办,这里MF是无能为力,目前的解决方法是在底层来操作,然后给上面接口来直接使用,其实这里也是移植最大的难度,我也还没有开始折腾,能力还有限啊)。VS也会指示 Thread.Sleep有错误,跟前面一样,在代码开头加using System.Threading;。然后调试,就可以看到led0按1HZ的频率闪烁起来了,So easy!
    再看初始化,PB5为(Cpu.Pin)21,这也太难记,有什么方法把它改成PB5这种,C#这么高级语言,自然是没什么问题,像用C的宏定义一样来做就要可以了。这里我也写了一个类文件 :
amespace MFPins
{
    public class CPU
    {
        public static class Pins
        {
            public const Cpu.Pin PA0 = (Cpu.Pin)0;
            public const Cpu.Pin PA1 = (Cpu.Pin)1;
            public const Cpu.Pin PA2 = (Cpu.Pin)2;
            public const Cpu.Pin PA3 = (Cpu.Pin)3;
            public const Cpu.Pin PA4 = (Cpu.Pin)4;
            public const Cpu.Pin PA5 = (Cpu.Pin)5;
            public const Cpu.Pin PA6 = (Cpu.Pin)6;
            public const Cpu.Pin PA7 = (Cpu.Pin)7;
            public const Cpu.Pin PA8 = (Cpu.Pin)8;
            public const Cpu.Pin PA9 = (Cpu.Pin)9;
            public const Cpu.Pin PA10 = (Cpu.Pin)10;
            public const Cpu.Pin PA11 = (Cpu.Pin)11;
            public const Cpu.Pin PA12 = (Cpu.Pin)12;
            public const Cpu.Pin PA13 = (Cpu.Pin)13;
            public const Cpu.Pin PA14 = (Cpu.Pin)14;
            public const Cpu.Pin PA15 = (Cpu.Pin)15;
            public const Cpu.Pin PB0 = (Cpu.Pin)16;
            public const Cpu.Pin PB1 = (Cpu.Pin)17;
            public const Cpu.Pin PB2 = (Cpu.Pin)18;
            public const Cpu.Pin PB3 = (Cpu.Pin)19;
            public const Cpu.Pin PB4 = (Cpu.Pin)20;
            public const Cpu.Pin PB5 = (Cpu.Pin)21;
            public const Cpu.Pin PB6 = (Cpu.Pin)22;
            public const Cpu.Pin PB7 = (Cpu.Pin)23;
只贴这么多,剩下的自行补齐就可以了。那么初始化就变 OutputPort led0 = new OutputPort(MFPins.CPU.Pins.PB5, false);这样就明朗多了。然后把led1也加进去,就可以做流水灯了,这里直接贴代码整个代码:

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using System.Threading;
using MFPins;
namespace LED
{
    public class Program
    {
        public static void Main()
        {
            OutputPort led0 = new OutputPort(MFPins.CPU.Pins.PB5, true);
            OutputPort led1 = new OutputPort(MFPins.CPU.Pins.PE5, true);
            while (true)
            {
                led0.Write(!led0.Read());
                Thread.Sleep(500);
                led1.Write(!led1.Read()); 
            }
        }

    }
}
按F5调试,看到led0跟led1红绿交替闪烁,心情真是太愉悦了。哈哈!后面附上整个工程,还有固件也有更新,我在写led1的时候,发现led1没闪烁,最后是找到固件那边GPIOE没有初始化(led1用到PE5,固件只初始化了A、B、C三个端口)。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值