定时器模块控制小灯周期性的闪烁
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//红色字体是本次主要添加或者修改的内容
//本程序主要是演示计数器的基本功能
//用键盘产生脉冲信号,接到TPM1的计数器引脚
//每按键一次,计数器加1,把计数器的结果TPM1CNT显示在数码管上
//-------------------------------------------------------------------------*
// 工 程 名: KeyCtrlLight *
// 硬件连接: 见工程说明 *
// 程序描述: 用开关通过芯片控制小灯闪烁 *
// 目 的: 第一个Freescale AW系列MCU C语言程序框架 *
// 说 明: 提供Freescale MCU的编程框架,供教学入门使用 *
//----------------苏州大学飞思卡尔嵌入式系统实验室2010年-------------------*
#include "Includes.h"
const uint8 Dtable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
uint16 soc01;
void Delay_n_ms(uint16 n)
{
uint16 i,j;
for(i=0;i<n;i++)
{
for(j=0;j<950;j++);
}
}
void SMG_show(uint16 n)
{
uint8 b1,b10,b100,b1000;
b1=n%10;
b10=(n/10)%10;
b100=(n/100)%10;
b1000=(n/1000)%10;
BSET(5,PTDD);
PTBD=Dtable[b1];
Delay_n_ms(2);
BCLR(5,PTDD);
BSET(4,PTDD);
PTBD=Dtable[b10];
Delay_n_ms(2);
BCLR(4,PTDD);
BSET(1,PTDD);
PTBD=Dtable[b100];
Delay_n_ms(2);
BCLR(1,PTDD);
BSET(0,PTDD);
PTBD=Dtable[b1000];
Delay_n_ms(2);
BCLR(0,PTDD);
}
void interrupt 11 TPM1_over(void)
{
soc01++;
if(TPM1SC_TOF==1) //清除中断标志位。
{
TPM1SC_TOF=0;
}
PTEDD_PTEDD3=~PTEDD_PTEDD3; //每0.5S进一次中断 小灯的高低状态翻转一次。
}
void main(void)
{
//1 关总中断
DisableInterrupt(); //禁止总中断
//2 芯片初始化
MCUInit();
//上面是单片机总体功能的初始化,不要删除
//以后的程序主要在这个文件里面写
//GPIO的功能,就是通用输入、输出功能的含义
//每个端口的引脚都能够设置为输入和输出,但是同一时刻只能够为输入或者输出
//端口的输入或者输出功能是根据数据方向寄存器的设置而确定的
//如果对应的位置1,则设置为输出;
//如果对应的位置0,则设置为输入;
//根据数码管和单片机的连线,数码管显示的内容由B端口确定
//也就是B端口输出的内容决定数码管显示的数字或者字符
//所以B端口的8个引脚都设置为输出
//B端口对应的数据方向寄存器(8位寄存器对应8个引脚)要设置为都是1
// PTBDD:PT代表port端口的意思
//B 代表B端口的意思,DD代表data direction,也就是数据方向
//用到几个定义的宏
//1 BGET(n,REG),获得寄存器REG的n位的值(结果为0或者1);0≤n≤7;
//比如 BGET(0,PTFD) 获得寄存器PTFD的0位数值
//BGET---其中B代
表bit的意思,GET就是
获得的意思
//2 BSET(n,REG),设置寄存器REG的n位的值为1;0≤n≤7?
//比如 BSET(0,PTFD) 设置寄存器PTFD的0位数值为1
//BSET---其中B代表bit的意思,SET就是设置的意思
//3 BCLR(n,REG),设置寄存器REG的n位的值为0;0≤n≤7;
//比如 BCLR(0,PTFD) 设置寄存器PTFD的0位数值为0
//BCLR---其中B代表bit的意思,CLR就是clear的缩写,汉语经常翻译成清除的意思,清除了就没有,所以是0
//各个模块初始化的程序一般在下面写,写在while (1) 之前
PTBDD=255;
BSET(5,PTDDD);
BSET(4,PTDDD);
BSET(1,PTDDD);
BSET(0,PTDDD);
TPM1MOD=62500-1;
TPM1SC=0b01010100; //t=0.5s n=t*(fbus/p) fbus=2MHZ p=2^4=16 n=62500
EnableInterrupt(); //允许总中断。!这个有中断的时候一定要写。
//4 主循环
while (1)
{
SMG_show((soc01/600)*1000+soc01%600); //用于比较小灯亮0.5S 灭0.5S ,考试时可不写。
}
}