3.1 实验一 I/O口输入输出实验4.实验原理如图3-1所示,将PTB6设置为输出端口后,若向PTB6写高电平时,LED灯不亮,若写低电平,则LED亮。
PTA2设置为输入端口后,在按键SW未按下时,读PTA2始终为高电平,只有在按键SW按下时,读PTA2时才得到低电平。
图3-1 LED灯与按键控制电路原理图5.实验内容⑴结合开发板电路图,用跳线夹连接对应LED引脚。
即LED1、LED2分别与PTB6、PTB7相连接。
将PTB 口定义为输出接口。
对端口写0即可点亮LED灯。
单步运行观察实验现象。
⑵结合开发板电路图,用跳线夹再将开发板上的按键SW1、SW2连到PTA2。
将PTA口定义为输入口,将PTB口定义为输出口。
按下SW1时点亮LED1、LED2。
按下SW2时熄灭LED1、LED2。
6.参考程序⑴直接点亮LED灯,其参考程序如下。
C语言程序:#include <hidef.h>#include "derivative.h" /* 头文件 */void main(void) {PTBDD=0xff; /*定义PTB口为输出口 */PTBD=0xff; /*输出高电平,LED灯灭*/PTBD=0x00; /*PTB口输出低电平,即PTB6、PTB7输出低电平 */for(;;) { __RESET_WATCHDOG(); /* 清看门狗 */} /* 死循环 */}汇编程序(加粗部分为所需添加的程序代码):;******************************************************************* ;* This stationery serves as the framework for a user application. * ;* For a more comprehensive program that demonstrates the more * ;* advanced functionality of this processor, please see the * ;* demonstration applications, located in the examples * ;* subdirectory of the "Freescale CodeWarrior for HC08" program * ;* directory. * ;*******************************************************************; Include derivative-specific definitionsINCLUDE 'derivative.inc';; export symbols;XDEF _StartupABSENTRY _Startup;; variable/data section;ORG RAMStart ; Insert your data definition here ExampleVar: DS.B 1;; code section;ORG ROMStart_Startup:LDHX #RAMEnd+1 ; initialize the stack pointerTXSCLI ; enable interruptsmainLoop:; Insert your code hereMOV #$FF,PTBDD; 端口方向寄存器初始化为输出MOV #$FF,PTBD; 输出高点平,LED灯灭MOV #$00,PTBD; 输出低电平,LED灯亮NOPfeed_watchdogBRA mainLoop;**************************************************************;* spurious - Spurious Interrupt Service Routine. *;* (unwanted interrupt) *;************************************************************** spurious: ; placed here so that security value NOP ; does not change all the time.RTI;**************************************************************;* Interrupt Vectors *;**************************************************************ORG $FFFADC.W spurious ;DC.W spurious ; SWIDC.W _Startup ; Reset⑵按键控制LED灯参考C语言程序如下:#include <hidef.h>#include "derivative.h" /* 头文件*/void main(void) {PTADD=0x00; /* 初始化PTA口,定义为输入口*/PTBDD_PTBDD6=1;PTBDD_PTBDD7=1; /* PTB6,PTB7定义为输出口*/PTBD_PTBD6=1;PTBD_PTBD7=1; /* PTB6,PTB7均写为1,开始时灯熄灭 */for(;;) {if(PTAD_PTAD2==0){PTBD_PTBD6=0;PTBD_PTBD7=0;}else if(PTAD_PTAD3==0){PTBD_PTBD6=1;PTBD_PTBD7=1;}else __RESET_WATCHDOG(); /* 清看门狗 */}}3.2 实验二键盘中断实验键盘中断(KBI)模块的块框图如图2-2所示,KBI模块允许多达8个管脚作为额外的中断源。
写键盘中断管脚使能寄存器(KBIPE)中KBIPEn位可独立的使能或屏蔽每个KBI管脚。
每个KBI管脚能够基于键盘中断状态和控制寄存器(KBISC)中的KBMOD位被配置成边沿敏感性或者边沿和电平敏感性。
边沿敏感性能够被软件编程为下降或上升沿;电平能被编程为低或高。
通过设置键盘中断选择寄存器(KBIES)中KBEDGn位可选择具体敏感性。
图3-2 键盘中断(KBI)块框图若要正确的使用KBI模块,需遵循以下步骤:⑴通过清除KBISC中KBIE,屏蔽键盘中断。
⑵通过设置KBIES中相应KBEDGn位使能KBI极性。
⑶如果使用内部上拉/下拉功能,配置PTAPE和PTBPE中相关位上拉使能位。
⑷通过设置KBIPE中相应KBIPEn位使能相应管脚为键盘中断管脚。
⑸写1到KBISC中KBACK,清除任何错误中断。
⑹设置KBISC中KBIE为1,使能中断。
5.实验内容MC9S08QG8开发板上的电路连接如图2-3所示,使能KBIP2、KBIP3,进而对LED1、LED2进行控制。
实现当按下SW1时,LED1亮、LED2灭,当按下SW2时,LED1灭、LED2亮。
在中断函数入口处设置断点,单步运行观察实验现象。
图3-3 键盘中断实验电路图6.参考程序#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void main(void) {DisableInterrupts; /*关中断总允许 */PTADD_PTADD2=0;PTADD_PTADD3=0; /*PTA2、PTA3定义为输入口*/PTBDD_PTBDD6=1;PTBDD_PTBDD7=1; /*PTB6、PTB7定义为输出口*/PTBD_PTBD6=1;PTBD_PTBD7=1; /*LED灯均熄灭*/KBISC_KBIE=0;KBIES=0x00; /*下降沿/低电平触发*/KBIPE=0x0C; /*键盘中断开启即KBIP2、KBIP3键盘中断开启*/KBISC_KBACK=1; /*清除任何错误中断*/KBISC_KBIE=1; /*键盘中断允许*/EnableInterrupts; /* 开中断总允许*/for(;;) {__RESET_WATCHDOG();}}void interrupt 18 Keyboard( ) {KBISC_KBACK=1;KBISC_KBIE=0; /*禁止键盘中断*/if(PTAD_PTAD2==0){PTBD_PTBD6=0;PTBD_PTBD7=1;}else if(PTAD_PTAD3==0) {PTBD_PTBD6=1;PTBD_PTBD7=0;}else __RESET_WATCHDOG();KBISC_KBIE=1; /*开启键盘中断*/}中断服务程序函数还有一种写法,即如下:void interrupt Keyboard( ) {KBISC_KBACK=1;KBISC_KBIE=0;………………………就是将函数入口的键盘中断向量号“18”删除了,其它程序保持不变,如果直接进行调试将不能进入键盘中断服务程序,此时还需要在左侧项目栏中Project settings/linker files/preject.prm的末尾添加中断向量 VECTOR ADDRESS 0xFFDA Keyboard以作为中断入口设置。
(C语言编程时,其他中断也有类似的中断入口向量需要设置)。
0xFFDA是键盘中断向量入口地址,Keyboard是用户定义的键盘中断函数,它必须与main函数中用户定义的键盘中断函数名一致,否则会出现错误。
3.3 实验三定时器实验4.实验原理⑴8位定时器模块——MTIM。
该模块只有软件定时功能。
它由8位计数器、辅助寄存器、状态与控制寄存器、配置寄存器组成,被称为8-BIT MODULO TIMER MODULE(MTIM)。
当计数器中的计数值达到MTIM 模寄存器中预先给定的值时,定时器就会溢出,一次计时结束。
其原理图如图2-4所示。
图3-4 MTIM原理图⑵16位定时模块——TPM。
该模块主要包括一个可选择时钟源与分频器的16位计数器、一个16位的模寄存器、2个独立的定时器通道。
每个通道可以有外部管脚对应,使得这2个通道可以工作于输入捕捉、输出比较或PWM模式。
通过主状态与控制寄存器TPMSC中的控制位CPWMS的设置,可以使主计数器TPMCNT 成为加法计数器(CPWMS=0)或者是加/减计数器(CPWMS=1)。