feiyangqingyun 发表于 2012-3-29 14:31:23

改进版的LED跑马灯程序(C#编写)

原帖地址:http://bbs.witech.com.cn/thread-13136-1-1.html

修改了几处地方,增加了跑马灯的速度控制,全亮全灭控制,要单个控制,只要看代码就知道怎么做,传个源码,以供学习!

第一步:声明API
//创建或打开对象,并返回一个可被对象访问的句柄

            
      private static extern IntPtr CreateFile
      (
            string lpFileName,//文件名
            uint dwDesiredAccess,//访问模式
            uint dwShareMode,//共享模式
            uint lpSecurityAttributes,//SD
            uint dwCreationDisposition,//如何创建
            uint dwFlagsAndAttributes,//文件属性
            uint hTemplateFile//文件模板句柄
      );

      //对设备执行指定的操作,访问设备驱动程序

      
      private static extern int DeviceIoControl
      (
            IntPtr hDevice,//设备句柄
            int dwIoControlCode,//设备控制选项,带有 FSCTL_ 前缀的常数
            byte lpInBuffer,//设备控制选项,具体取决于dwIoControlCode参数
            uint nInBufferSize,//输入缓冲区的长度
            byte lpOutBuffer,//设备控制选项,具体取决于dwIoControlCode参数
            uint nOutBufferSize,//输出缓冲区的长度
            ref int lpBytesReturned,//实际装载到输出缓冲区的字节数量
            IntPtr lpOverlapped//重叠指针
      );

第二步:自定义高电平低电平函数
/// <summary>
      /// 发送高电平
      /// </summary>
      /// <param name="i"></param>
      void SendIOHigh(int i)
      {
            IntPtr gpiodriver = CreateFile("LED1:", 0, 0, 0, 3, 0, 0);//打开LED
            int bytesReturned = 0;
            int ioHigh = 0x04001060;//与驱动里面的值对应
            ioHigh += i * 0x10;
            DeviceIoControl(gpiodriver, ioHigh, 0, 0, 0, 0, ref bytesReturned, IntPtr.Zero);
      }

      /// <summary>
      /// 发送低电平
      /// </summary>
      /// <param name="i"></param>
      void SendIOLow(int i)
      {
            IntPtr gpiodriver = CreateFile("LED1:", 0, 0, 0, 3, 0, 0);//打开LED
            int bytesReturned = 0;
            int ioHigh = 0x04001060;//与驱动里面的值对应
            ioHigh += i * 0x10+1;
            DeviceIoControl(gpiodriver, ioHigh, 0, 0, 0, 0, ref bytesReturned, IntPtr.Zero);
      }

第三步:timer控件定时发送高低电平到对应LED灯,控制关和开
int i = 0;
      private void timer1_Tick(object sender, EventArgs e)
      {
            SendIOLow(i);
            i++;

            if (i > 3)//到达最后一个LED灯
            {
                i = 0;
            }

            SendIOHigh(i);
      }

      private void trackBar1_ValueChanged(object sender, EventArgs e)
      {
            timer1.Interval = 100 * trackBar1.Value;
      }

全开全灭:
private void btnAll_Click(object sender, EventArgs e)
      {
            if (btnAll.Text == "全亮")
            {
                SendIOHigh(0);
                SendIOHigh(1);
                SendIOHigh(2);
                SendIOHigh(3);
                btnAll.Text = "全灭";
            }
            else
            {
                SendIOLow(0);
                SendIOLow(1);
                SendIOLow(2);
                SendIOLow(3);
                btnAll.Text = "全亮";
            }
      }

feiyangqingyun 发表于 2012-3-29 14:33:27



feiyangqingyun 发表于 2012-3-29 17:19:12

bxl131 发表于 2012-3-30 16:39:22

21MCUEL_SZ 发表于 2012-3-30 23:34:10

一叶蓝天 发表于 2013-5-10 00:18:20

页: [1]
查看完整版本: 改进版的LED跑马灯程序(C#编写)