找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3573|回复: 0
打印 上一主题 下一主题
收起左侧

键盘的MC9S12DG128B单片机应用源程序

[复制链接]
跳转到指定楼层
楼主
4  键盘的单片机应用

  1. //-------------------------------------------------------------------------*
  2. //工 程 名:DG128键盘中断(KeyBoard)                                         *
  3. //硬件连接:                                                                *
  4. //    本实验程序只适合于4*4的键盘,使用了MC9S12DG128的PTH口作为该类键盘     *
  5. //    的4根行线(PTH3-0)和4根列线(PTH7-4),并且必须自行接线:PTH0-7引脚对     *
  6. //    应键盘模块的插线孔1-8脚(扩展板上有注明1脚),MCU的串口与PC方的串口相连 *
  7. //程序描述:按下键盘按键,串口发送对应的键值                                 *
  8. //说    明:PTH口引脚在扩展板上对应位置如下:                                *
  9. //         PTH7-LED1_CS3   PTH6-LED1_CS2    PTH5-LED1_CS1  PTH4-LED1_CS0   *
  10. //         PHT3-SPI2_SS    PHT2-SPI2_SPSCK  PTH1-SPI2_MOSI PHT0-SPI2_MISO  *
  11. //目    的:键盘扫描,键盘中断,键值识别,键盘编码                            *
  12. //日    期:2007.01.17                                                      *
  13. //-------《嵌入式系统-使用HCS12微控制器的设计与应用》教学实例-------------*

  14. //头文件
  15. #include  "Includes.h"    //总头文件

  16. //主函数
  17. int main()
  18. {
  19.     DISABLE_INTERRUPTS;    //禁止总中断
  20.     //1. 芯片初始化
  21.     MCUInit();
  22.     //2. 模块初始化
  23.     SCIInit();             //(1) 串行口初始化
  24.     KB_Init();             //(2) 键盘初始化
  25.    
  26.     DDRA = 0xff;
  27.     PORTA = 255;
  28.    
  29.     //3. 开放各模块中断
  30.     EnableIOint;           //KB_P.7-4输入引脚允许中断
  31.     //4. 开放总中断
  32.     ENABLE_INTERRUPTS;
  33.     //主循环
  34.     while (1)
  35.     {
  36.     }
  37. }
复制代码

  1. //[isr.c]中断处理函数------------------------------------------------------*
  2. //功能:                                                                    *
  3. //    (1)定义中断处理函数                                                  *
  4. //-------------------------------------------------------------------------*

  5. //头文件
  6. #include "isr.h"         //中断处理函数头文件

  7. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  8. char Calculate(char Str, int *Value);



  9. //ISR_KBI:键盘中断处理函数-------------------------------------------------*
  10. //功  能:获取键盘的键值和定义值并将它们通过串口发送出去                    *
  11. //参  数:无                                                                *
  12. //返  回:无                                                                *
  13. //-------------------------------------------------------------------------*
  14. __interrupt 25 void ISR_KBI(void)
  15. {
  16.     INT8U KB_valueN,KB_DefValue;
  17.     INT32U i;
  18.    
  19.     DISABLE_INTERRUPTS;                 //关总中断
  20.     DISABLEIOint;                       //KB_P.7-4输入引脚禁止中断   

  21.     for (i=0 ; i<20000; i++);           //延迟

  22.     KB_valueN = KB_ScanN(10);           //扫描键值,存于KB_valueN中
  23.     if (0xFF == KB_valueN)
  24.         goto KB_Exit;
  25.     //KB_DefValue = KB_Def(KB_valueN);    //键值转化为定义值并发送
  26.     SCISend1(KB_valueN);                //发送键值
  27.     PORTA = ~KB_valueN;
  28.     //SCISend1(KB_DefValue);

  29.     for (i=0 ; i<25000; i++);           //延迟

  30. KB_Exit:
  31.     KB_Init();                                            //初始化键盘
  32.     EnableIOint;                        //KB_P.7-4输入引脚允许中断
  33.     ENABLE_INTERRUPTS;                  //开总中断
  34. }

  35. //自定义函数---------------------------------------------------------------*
  36. //功  能:计算器                                                            *
  37. //参  数:无                                                                *
  38. //返  回:无                                                                *
  39. //-------------------------------------------------------------------------*
  40. int Op[2] = {0,0};
  41. int p = 0;
  42. char Sign = 0;

  43. char Fun()
  44. {  
  45.         switch (Sign)
  46.         {
  47.         case '+':
  48.                 Op[0] = Op[0] + Op[1];
  49.                 return 1;
  50.         case '-':
  51.                 Op[0] = Op[0] - Op[1];
  52.                 return 1;
  53.         default:
  54.                 return 0;
  55.         }
  56. }

  57. char Calculate(char Str, int *Value)
  58. {
  59.   
  60.         switch(Str)
  61.         {
  62.         case '1':
  63.         case '2':
  64.         case '3':
  65.         case '4':
  66.         case '5':
  67.         case '6':
  68.         case '7':
  69.         case '8':
  70.         case '9':
  71.         case '0':
  72.                 Op[p] = Op[p] * 10 + (Str - '0');
  73.                 return 0;
  74.         case '+':
  75.         case '-':
  76.                 p++;
  77.                 if (p > 1)
  78.                 {
  79.                         p = 1;
  80.                         Fun();
  81.                         Op[1] = 0;
  82.                         Sign = 0;
  83.                 }
  84.                 Sign = Str;
  85.                 return 0;
  86.         case '=':
  87.                 if(Fun())
  88.                 {
  89.                         *Value = Op[0];
  90.                         return 1;
  91.                 }
  92.                 else
  93.                         return 0;
  94.         }
  95. }


复制代码



//--------------------------------------------------------------------------
//  Readme.txt
//--------------------------------------------------------------------------
   通过阅读这个文档,你可以让芯片型号为MC9S12DG128B的CodeWarrior代码能够
尽快的启动和运行起来。

   选择的CPU和目标连接方式是预先设置的,但是可以方便地对其修改。
   
   下面的样例代码所使用的语言是由你设置的,这里设置的是:
   C语言
   
   通过向导,你选择的CodeWarrior目标的连接方式是:
   TBDML(这种连接方式允许通过TBDML BDM连线进行调试)

    外加的连接可以在模拟器/调试器中进行选择。(从菜单项Component>Set
Target进行选择)
   
//-------------------------------------------------------------------------
//  启动
//-------------------------------------------------------------------------
   选择菜单项Project中Debug或者单击键盘F5来模拟仿真或者调试工程。Code
Warrior将同时打开模拟器/调试器。

   启动应用程序:通过再次按快捷键F5(或者通过菜单项Run->Start/Continue)来实现
   终止应用程序:通过按快捷键F6(或者通过菜单项Run->Halt)来实现。
   加载额外的组件:通过调试菜单中的Component->Open来实现。

//-------------------------------------------------------------------------
//  工程文件结构
//-------------------------------------------------------------------------
   一个工程包括下面的文件/文件夹:
   
   -readme.txt:说明文件
   -Sourses文件夹:该文件夹中包含应用程序的源代码
   -Startup Code文件夹: C/C++启动代码(作用:初始化堆栈指针和全局变量)。如果
你只想进行堆栈指针的初始化,可以在编译器的命令行中添加命令-D__ONLY_INIT_SP
   -Prm文件夹:
     -burner.bbl文件产生S记录文件
     -.prm文件是连接器文件
   -Linker Map文件夹:通过连接器产生.map文件
   -Libraries文件夹::需要的库文件(包括ANSI文件,派生的头文件/执行文件)
   -调试器工程的文件夹:包含一个.ini文件作为每个连接的调试器
   -调试命令文件夹:包含各类调试命令

//-------------------------------------------------------------------------
//  加入你自己的代码
//-------------------------------------------------------------------------
   一旦所有预期的准备工作都完成了,你就可以开始在工程中添加你自己的代码。
牢记我们所提供的方法以使CodeWarrior代码能够尽快的启动和运行起来。当然你也
可以通过别的方式来处理中断和建立自己的连接命令文件。同时你也可以很容易的修
改工程所提供的源文件。

//  模拟器/调试器:附加的组件
//-------------------------------------------------------------------------
   在模拟器/调试器中,通过菜单项中的Component->Open可以加载附加的组件。

//-------------------------------------------------------------------------
//  附加的文档
//-------------------------------------------------------------------------
   阅读提供的在线文档。
   可以使用CodeWarrior IDE的菜单Help->CodeWarrior Help帮助文档
   
//------------------------------------------------------------------------
//  联系Metrowerks公司
//------------------------------------------------------------------------
   如果有漏洞的报告,技术问题和建议,请填写已经安装在Release_Notes文件夹下
面的表格,并发送到邮箱:cw_support@freescale.com
//--------------------------------------------------------------------------
//  Tips.txt
//--------------------------------------------------------------------------

//--------------------------------------------------------------------------
//  修改派生类
//--------------------------------------------------------------------------
   对于已经存在的派生类进行修改,你需要注意以下几点:

   1.你需要对CodeWarrior工程的设置进行修改:在"Assembler for HC12"和
"Compiler for HC12"控制面板中确定新的CPU将被使用在"Command Line Arguments":
    - HC12:   -CpuHC12
      - HCS12:  -CpuHCS12
    - HCS12X: -CpuHCS12X

   2.派生类的头文件和源文件被放置在如下的目录中:
    - {CodeWarrior}lib\hc12c\include (derivative header files)
      - {CodeWarrior}lib\hc12c\src (derivative source files)
   同时将新的派生类头文件和源文件从目录中加载到类库中。
   提示: 在文件所在处打开"Windows Explorer":
         找到"Libraries"工程中的派生类头文件和源文件,通过右击鼠标并选中
         "Open in Windows Explorer"。

   3.通过工程文件的合适的向导,你也可以对派生类的头文件和源文件进行移去。从
类库中移去派生类的头文件和源文件的方法如下:
         找到"Libraries"工程中的派生类头文件和源文件,通过右击鼠标并选中
    "Remove"。
   
   4.你需要对主函数的源文件进行修改。该文件可以在"Sources"文件组中找到。打开
该文件,并对其包含的头文件进行重命名。如果你所编辑的是一个C/C++文件时,你还需
要在编译指令"LINK_INFO DERIVATIVE"中更改一个新的派生类。这样,编译指令就会告
诉模拟器对哪个派生类进行模拟。当然你也可以删除该编译指令,在HI-WAVE调试器中重
新建立一个新的派生类。(请看下一点)
   
   5.同时还需要对PRM文件进行修改。PRM文件在目录的如下位置:
     - {CodeWarrior}lib\hc12c\prm
     你需要打开新的PRM文件,并且将其中的内容拷贝到你现在所使用的PRM文件中去。
如果你没有一个堆栈的内存模式,你只能修改PRM文件中的内容。 你可能要看一下已有
的PRM文件的内容。

   6.当编辑和连接成功后,你就能开始使用HI-WAVE调试器。
     你需要为一个新的派生类启动调试器。
     -对整个芯片的模拟/模拟器连接:
         在菜单选项中选择"Set Derivative..."对话框,然后在打开的对话框中你可
     以通过路径"Simulator"->"Set Derivative..."进行操作。同样的,在打开的对话
     框中你可以选择新的派生类,文件名可以被使用为编译指令的"LINK_INFO
     DERIVATIVE"。
   
     -基于P&E Multilink/Cyclone Pro上的连接:
          在菜单选项中打开"Set Derivative..."对话框,并选择路径为"Multilink-
     CyclonePro"->"Set Derivative..."。在打开的对话框中选择新的派生类。

     -基于SofTec HCS12上的连接:
          在菜单选项中打开"MCU Configuration"对话框,并选择路径为"inDART-
     HCS12"->"MCU Configuration"在打开的对话框中选择新的派生类。
     
     -基于HCS12系列的目标监视器:
          派生类会自动的连接到硬件上。但是,调试器可能仍然显示一部分,那里对于
     来自同一类型的芯片的选择很少能被采取。

   7.现在你可以在你的工程中添加一个新的派生类。

//--------------------------------------------------------------------------
//  打开专Processor Expert
//--------------------------------------------------------------------------         
   在工程创建时如果你还没有决定使用Processor Expert,你也稍后去使用。
但是你必须考虑如下几点:
   1.Processor Expert支持C和C++工程,但它不支持完全的汇编工程或者是
嵌套的汇编工程。

   2.Processor Expert并不支持所有的派生类。

   3.为了打开Processor Expert使用菜单项"Processor Expert->Enable Processor
     Expert for 文件名"。

   4.有一个对话框来询问你是否想要打开工程的Processor Expert:点击"Yes"

   5.然后你要为你的工程选择一块合适的CPU。选择的CPU的方法为:在菜单Processor
Expert->View->Bean Selector,然后在CPU树中双击你想要的CPU,那这块CPU将加入到
你的工程中。

   6.在Processor Expert产生自己的main函数或者源文件的时候,你必须移除由向导
产生的这些文件。移除Sources文件夹下的主文件的方法是:在工程文件夹"Sources"
中选择主文件右击鼠标选择"Remove"。

   7.同样的应用也用在派生类头文件中。由于Processor Expert维持自己的版本,你
需要在CodeWarrior工程中移去这些头文件:在"Libs"工程文件夹中找到.h和.c文件,
选中.h和.c文件,单击鼠标右键,选择"Delete"将文件删除。

   8.Processor Expert维持自己的连接器文件.prm。你需要在工程中移去由向导所
建立的连接器文件Prm",单击鼠标右键选择"Remove"将这些文件删除。

   9.现在你可以按通常的方式建立或编译你的工程(菜单Project->Make)。

//--------------------------------------------------------------------------
//  改变存储器模式
//--------------------------------------------------------------------------
   如果你想对已经存在的存储器模式进行改变,你可以考虑以下几点:
   1.存储器模式只是用来控制默认值。在任何存储器模式下编写各种应用程序是
可以的,但是存储器模式的选择错误肯定会造成更多的代码的修改。
   
   2.大的存储器模式会比扩展的存储器模式和小的存储器模式产生相对多的和使运行
速度下降的代码。但是如果你在别的模式下不能别写出你所要的功能,你可以首选这种
模式。
   扩展的存储器模式和小的存储器模式的区别不是很有意义。
  
   3.你需要修改CodeWarrior工程的设置:在"Assembler for HC12"和"Compiler for
HC12"面板上要确保新的存储器模式能在"Command Line Arguments"上使用:
   - Small memory model:  -ms
   - Banked memory model: -mb
   - Large memory model:  -ml

   4.你需要对标准库文件进行修改。库文件所在位置为:
   - {CodeWarrior}lib\hc12c\lib (HC12)
   - {CodeWarrior}lib\xgatec\lib (optional for a XGATE project)

   5.你需要将新的库文件从目录中拖到"Libraries"工程文件夹中,至于命名规则请查
找readme.txt文件:
   - {CodeWarrior}lib\hc12c\readme.txt (HC12)
  - {CodeWarrior}lib\xgatec\readme.txt (可以选择作为一个XGATE工程)

   6.你现在可以从工程中移除由向导产生的旧的库文件。从"Libraries"中删除旧的
库文件的方法如下:在"Libraries"工程文件夹中选择库文件右击鼠标并选择"Remove"。
  
   7.在prm文件中也要修改其存储器模式。
     在每个存储模式中都包含有如何对DEFAULT_ROM, DEFAULT_RAM, NON_PAGED和其他
的默认值进行分配的方法。
     - DEFAULT_ROM:在小的存储模式中,必须放在未分页的区域,在扩展的存储模式和
大的存储模式可以放到任何一页。
     - DEFAULT_RAM:在小的存储模式和扩展的存储模式中,必须未分页的RAM区域。
     - STARTUP,STRINGS,ROM_VAR,COPY。在小的存储模式和扩展的存储模式中,它们大
多数放在未扩展的Flahs区域中。COPY必须放在最后面。
     - 查看所有剩余的部分是如何使用的,如果不能确定的话,分配为未扩展的。

   8. 现在你可以在新的存储器模式下建立工程了。

//--------------------------------------------------------------------------
//  添加一个新的连接
//--------------------------------------------------------------------------
   如果你在创建一个工程时忘了添加一个指定的连接方式,你可以在稍后添加。
你可以考虑以下几点:
   
   1.在你的工程中选择"Target"标记,并在菜单中选择"Project"->"Create
Target..."。在对话框中添加新的连接名称,并且选择"Clone existing target",你可
以选择任何存在的target。

   2.选择一个新创建的target。我们需要准备好调试器。在菜单中选择"Project"->
"Set Default Target"来选择一个已经创建的target。

   3. 如果你要为自己特殊的连接建立一个不同的存储映射(例如:"Serial Monitor"),
你需要将修改过的prm文件添加到工程中去。同时确保新的.prm文件在所选的target中。
确保新的prm文件在工程窗口中的target栏中已经被指向。最后确保以前存在的prm文件
没有被指向。

   4.调试器的配置文件(.ini)被定位在"{Project}"目录下。你需要拷贝一个已存在的
的".ini"文件到相同的路径。这个配置文件的命名为该连接的名称。现在你就可以将
.ini文件拖到"Debugger Project File"中去了。

   5.你还需要在"CodeWarrior"的"Arguments"选项中选择"Build Extras"。将".ini"
文件名字用新文件名字去替换。
    可选项:在选择项中将"-instance=x"替换成为"-instance=y",此时y就是新的连接。
该实例选择的目的是为了确认调试器只对这个已确定的连接进行调试。

   6.我们现在可以启动调试器。你可以按照如下的方法开始启动。
    在调试器对话框中通过"Component"->"Set Connection..."选择所需的连接方式。
   
    -对于整个芯片的模拟/模拟器连接:
     选择处理器为HC12和连接方式为整芯片模拟

    -对于P&E Multilink/Cyclone Pro连接:
     选择处理器为HC12和连接方式为P&E Multilink/Cyclone Pro

    -对于SofTec HCS12连接:
     选择处理器为HC12和连接方式为SofTec HCS12

    -对于HCS12连续监控连接:
     选择处理器为HC12和连接方式为HCS12连续监控

   7.可选项:如果你需要"Command Files",你可以在"{Project}cmd"目录下创建一个空
文件。在调试器中,你可以通过连接菜单中的"Command Files..."对话框来修改调试器。

   8.你现在已经在工程中建立了一个新的连接。

//--------------------------------------------------------------------------
//  联系Metrowerks公司
//--------------------------------------------------------------------------
   如果有漏洞的报告,技术问题和建议,请填写已经安装在Release_Notes文件夹下
面的表格,并发送到邮箱:cw_support@freescale.com

下载:
C04_KeyBoard.rar (261.29 KB, 下载次数: 11)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表