外设天下 - 电脑外设发烧友聚集地

12下一页
我的人缘0

[讨论] 打造自己的专属鼠标——鼠标DIY教程(二)

19 14488
楼主
跳转到指定楼层
发表于 2011-1-14 20:03 只看该作者 倒序浏览 阅读模式
本帖最后由 超电磁侠 于 2011-1-14 20:06 编辑

本期依然会带着大家搞搞代码,重要的不是说看懂,看懂是什么概念?就是要知道每个函数的作用等等,但是对于我们刚刚学习或者转移到另一个语言上的人来说,明显这是做不到的,我们一开始要的是理解。举个例子来说,我没学过普通话,那我在一个纯普通话的环境怎么生存?长篇大论听不懂的一概忽略,照抄。然后尝试问“你好、吃饭、再见...”怎么说,有了只字片语,慢慢我们就可以组织句子了。


    总结一下上期,抛开硬件方面的准备,我们首先是要知道怎么写18f14k50的简单固件,首先我们要下载CCS 编译器和Proteus这两个软件,然后熟悉一下操作,复制一下我的例子让LED亮起来。


     上一次我们做了一个最最简单的点亮Led的例子, 现在我先来解释一下那短短的几行代码的作用。 带#号的#xxxx C语言中是预编译命令

#include <18F14k50.h>  // ---------包含18f14k50的头文件,相当于“驱动”
#fuses  HS,NOFCMEN,NOBROWNOUT,NOWDT,BORV30,NOPUT,NOCPD,STVREN,
NOXINST,NOWRT,NOWRTD,NOWRTC,WDT32768,NOIESO,NOEBTR,NOEBTRB,NO  MCLR,NOPROTECT,NOCPB,NOWRTB,CPUDIV1,USBDIV1,PLLEN,NOHFOFST,NOLVP
//------------------#fuses  即设置所谓单片机的熔丝位,我们化繁为简,它意思就是设置单片机运行的参数,具体参数作用可以参考18f14k50PDF

#use delay(clock=48000000) //------------------告诉编译器, 18f14k50将跑在48mhz


//以上3行是18f14k50的最简启动参数,

void main(void)  //主函数------------------单片机启动之后,第一件事就是跳到这个函数的入口,一切都从主函数开始。
{

output_high(PIN_C0);   //  正如字面,将PIN_C0设置为输出,并且设置高电平。



} //------------------------------------括号表明了函数的范围, 一定要注意配对,因为whileiffor都可以用{}来声明作用范围。

2、循环, 一切都要循环
   上面这个例子,整个主程序就是点亮了RC0led, 之后, 单片机就会因为没事可做进入预定的待机状态。打个比方,比如设计了一个报时间的程序,第一次你问:“现在几点。”
单片机很快给出答案,但是当你第二次问的时候,单片机沉默了。因为那个模式只执行了一次。所以,我们要把程序循环起来。把我们上次写的主函数按下面的例子来改一下。  

   void main(void)
{


while(1)   // 具体请google while()的用法,这里是无限循环的意思
   {




     output_high(PIN_C0);  // 输出高
     delay_ms(1000);  //延迟1000毫秒=1
     output_low(PIN_C0); // 输出低
     delay_ms(1000); // 延迟1秒,那么就是以2秒为周期亮灭循环
   }

}

再按上一期的步骤编译一下,再在Proteus中运行仿真,怎么样,Led一闪一闪的了吧。

评分

参与人数 1技术分 +1 收起 理由
论坛管理员 + 1

查看全部评分

0
已赞
微信分享 收藏
回复

使用道具 举报

我的人缘0
2
发表于 2011-1-14 20:03 只看该作者
本帖最后由 超电磁侠 于 2011-1-14 20:08 编辑

3RTOS,实时操作系统


   首先我们来理解一下多任务,以电脑为例,我们现在在windows下同时打开好几个程序是习以为常的,每一个程序就对应一个“任务”,我们的cpu只有一个,(虽然现在多核很常见,我们不扯远)所以windows会将cpu按一个时间来分配给各个任务, 让它们看起来是在“同时”运行一样。为什么我们会感觉不到延迟?电脑CPU每秒数百万次以上的运算能力不是摆在那看的....
说回单片机,虽然运算能力不像通用处理器那样强,但是也能实现多任务,一种办法是状态机(state machine),什么是状态机? 有很多种解释,在编程上,可以说是根据条件进行筛选进入不同的任务循环。
第二种办法就是RTOSreal-time operating system,比起状态机,rtos能实现任务调度,任务间的信息交换,对于我们写鼠标固件来说,最重要的是能比较精确地控制每个任务的执行。RTOS的任务调度有很多种,就CCS提供的RTOS来说,它是一个循环型的(round-robin)的任务系统,每个任务预先指定一个执行时间,每个任务的运行时间都是相同的。一个任务执行完毕,就等待到执行另外一个任务的时刻。下面我们就来试一下用CCSRTOS
                                 // 上面那些依然是基本三件套,略

#use rtos(timer=0, minor_cycle=100ms)  // 使用rtos,使用0号计时器,关于18f14k50
                                  //的计时器有多少个请参考PDFminor_cycle,
                                  //将时间按多少秒来分段

#task(rate=1000ms, max=100ms)   //  任务参数,rate必须为minor_cyle的整倍数每
void LED();                   //1000ms执行一次,max最大执行时间,不超过上
                              //面定义的minor_cyle的值。 跟着指定这个任务的
                               //函数名字


void LED()                 // 定义函数。
{
output_toggle(PIN_C0);     // output_toggle()CCS的函数,“开关”一个端口,上次
                         // 为开,则这次关上,上次为关,则这次打开。即端口输
                         //出高低变化。
}


void main(void)     //必备的保留节目
{


rtos_run();       // rtos运行的号角
}


编译,运行,怎么样,LED也是一闪一闪的了。




本期先到这,因为动手的内容比较多,有兴趣DIY的不要怕麻烦,打完一盘dota或者CF歇歇的时间就可以用来去下载软件,运行运行例子了。



回复 支持 反对

使用道具 举报

我的人缘0
3
发表于 2011-1-14 20:19 只看该作者
强帖,留名
回复 支持 反对

使用道具 举报

我的人缘0
4
发表于 2011-1-14 20:21 只看该作者
前排,哪怕看不懂~!
回复 支持 反对

使用道具 举报

我的人缘0
5
发表于 2011-1-14 20:27 只看该作者
没看明白{:1_007:}
回复 支持 反对

使用道具 举报

我的人缘0
6
发表于 2011-1-14 20:47 只看该作者
继续看不懂
回复 支持 反对

使用道具 举报

我的人缘0
7
发表于 2011-1-14 20:57 只看该作者
神马,不懂
回复 支持 反对

使用道具 举报

我的人缘0
8
发表于 2011-1-14 20:59 只看该作者
略懂略懂~
回复 支持 反对

使用道具 举报

我的人缘0
9
发表于 2011-1-14 21:02 只看该作者
其实楼主可以自己弄个品牌了
回复 支持 反对

使用道具 举报

我的人缘2
10
发表于 2011-1-15 02:33 只看该作者
测试
高手~大神~膜拜~
回复 支持 反对

使用道具 举报

12下一页
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则