//函数名称:LCDInit //函数返回:无 //参数说明:无
//功能概要:LCD初始化。
//=========================================================================== void LCDInit() {
uint_32 i = 0;
//定义数据口和控制口为输出 for(i = 0;i < 11;i++) {
gpio_init(LCD[i].gpio_port, LCD[i].gpio_pin, 1,0); }
//设置指令,RS,R/W = 00, 写指令代码 gpio_set (LCD[0].gpio_port, LCD[0].gpio_pin, 0); gpio_set (LCD[1].gpio_port, LCD[1].gpio_pin, 0);
//功能设置- //设置指令
LCDCommand(0x38); //5*7点阵模式,2行显示,8位数据总线 LCDCommand(0x08); //关显示,关光标显示,不闪烁 LCDCommand(0x01); //清屏 for (i=0; i<40000; i++)asm(\延时 LCDCommand(0x06);
LCDCommand(0x14); //光标右移一个字符位,AC自动加1 LCDCommand(0x0C); //开显示,关光标显示,不闪烁 }
//=========================================================================== //函数名称:LCDShow //函数返回:无
//参数说明:需要显示的数据 //功能概要:液晶显示data中的数据。
//=========================================================================== void LCDShow(uint_8 data[16])
13
{
uint_8 i; //LCD初始化 LCDInit();
//显示第1行16个字符
gpio_set (LCD[0].gpio_port, LCD[0].gpio_pin, 0); gpio_set (LCD[1].gpio_port, LCD[1].gpio_pin, 0); //后7位为DD RAM地址(0x00)
LCDCommand(0x80);
//写16个数据到DD RAM
gpio_set (LCD[0].gpio_port, LCD[0].gpio_pin, 1); gpio_set (LCD[1].gpio_port, LCD[1].gpio_pin, 0); //将要显示在第1行上的16个数据逐个写入DD RAM中 for (i = 0;i < 16;i++) { }
//显示第2行16个字符
gpio_set (LCD[0].gpio_port, LCD[0].gpio_pin, 0); gpio_set (LCD[1].gpio_port, LCD[1].gpio_pin, 0); //后7位为DD RAM地址(0x40)
LCDCommand(0xC0);
gpio_set (LCD[0].gpio_port, LCD[0].gpio_pin, 1); gpio_set (LCD[1].gpio_port, LCD[1].gpio_pin, 0);
//将要显示在第2行上的16个数据逐个写入DD RAM中 for (i = 16;i < 19;i++) { } }
LCDCommand(data[i]); LCDCommand(data[i]);
14
//=========================================================================== //函数名称:LCDCommand //函数返回:无
//参数说明:cmd:待执行的命令
//功能概要:执行给定的cmd命令,且延时。
//=========================================================================== void LCDCommand(uint_8 cmd) {
uint_8 i; uint_16 j; uint_8 temp;
//等待延迟防止重复调用此函数而LCD卡死 for (j=0; j<1600; j++);asm(\ //数据送到LCD的数据线上 for(i = 3;i < 11;i++) {
gpio_set (LCD[i].gpio_port, LCD[i].gpio_pin, 0); }
for(i = 3;i < 11;i++) { }
//给出E信号的下降沿(先高后低),使数据写入LCD gpio_set (LCD[2].gpio_port, LCD[2].gpio_pin, 1); for (j=0;j<25;j++) asm(\
gpio_set (LCD[2].gpio_port, LCD[2].gpio_pin, 0); }
temp = 0x01 & (cmd>>(i-3));
gpio_set (LCD[i].gpio_port, LCD[i].gpio_pin, temp);
4.4定时器(timer.c)
//=========================================================================== //文件名称:timer.c
//功能概要:时间处理软件源文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn) //更新记录:2013-04-27 V1.0
//===========================================================================
15
#include \
//=========================================================================== //函数名称:SecAdd1 //函数返回:无
//参数说明:*p:为指向一个时分秒数组p[3]
//功能概要:秒单元+1,并处理时分单元(00:00:00-23:59:59)
//=========================================================================== void SecAdd1(uint_8 *p) {
*(p+2)+=1; //秒+1 if(*(p+2)>=60) //秒溢出 { }
*(p+2)=0; //清秒 *(p+1)+=1; //分+1 if(*(p+1)>=60) //分溢出 {
*(p+1)=0; //清分 *p+=1; //时+1 if(*p>=24) //时溢出 {
*p=0; //清时 } }
}
4.5 定时器/脉宽调制子程序(tpm.c)
//=========================================================================== //文件名称:tpm.c
//功能概要:tpm底层驱动构件源文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn) //更新记录:2013-5-5 V2.0
//=========================================================================== #include \
//定时器模块0,1,2地址映射
const TPM_MemMapPtr TPM_ARR[]={TPM0_BASE_PTR,TPM1_BASE_PTR,TPM2_BASE_PTR};
16
//========================================================================= //函数名称:tpm_init //功能概要:初始化tpm模块. //参数说明:tpmModule:模块号:0、1、2
// clk_src_sel:时钟源选择:1:PLL/FLL(推荐)、2:晶振 // int_us:中断微秒数,中断时间间隔 //函数返回:无
//========================================================================= void tpm_init (uint_8 tpmModule,uint_8 clk_src_sel,uint_32 int_us) {
uint_32 int_ticks;
if(tpmModule>2) tpmModule=2; //防止越界值 //开启SIM时钟门
BSET(SIM_SCGC6_TPM0_SHIFT+tpmModule,SIM_SCGC6); //使能TPM时钟 //根据传入参数(时钟源、中断时间间隔),使能时钟、确定有关寄存器值 if (1==clk_src_sel) //选择PLL/FLL为TPM模块的时钟源 {
//MCGPLL/2或者MCGFLL作为时钟源
BSET(SIM_SOPT2_PLLFLLSEL_SHIFT,SIM_SOPT2); //使能PLL为时钟源
int_ticks=6*int_us; //6*int_us=(48000/8)*int_us/1000 } else {
//晶振作为时钟源
BSET(OSC_CR_ERCLKEN_SHIFT,OSC0_CR); //开启晶振输出时钟 int_ticks=int_us; //1*int_us=(8000/8)*int_us/1000 }
SIM_SOPT2 |= SIM_SOPT2_TPMSRC(clk_src_sel); //使能时钟选择 TPM_ARR[tpmModule]->CNT=0x00; //计数器清0 TPM_ARR[tpmModule]->MOD=int_ticks; //给模数寄存器赋值
//TOF写1清0,TOIE中断使能,CMOD选择每次时钟加1,PS=0x011 选择8分频; TPM_ARR[tpmModule]->SC=TPM_SC_TOF_MASK|TPM_SC_TOIE_MASK| TPM_SC_CMOD(1)|TPM_SC_PS(3); }
17