TI中文支持网
TI专业的中文技术问题搜集分享网站

这是一个用MSP430为主系统做的信号发生器的程序,需要修改求大神指教,重谢!!!

#include <msp430x14x.h>
#include <math.h>
#include "Config.h"
#define uchar unsigned char
/***************显示模块的定义***************/
#define DataDir P4DIR
#define DataPort P4OUT#define Busy 0x80
#define CtrlDir P3DIR
#define CLR_RS P3OUT &= ~BIT0; //RS = P3.0#define SET_RS P3OUT |= BIT0;#define CLR_RW P3OUT &= ~BIT1; //RW = P3.1
#define SET_RW P3OUT |= BIT1;#define CLR_EN P3OUT &= ~BIT2; //EN = P3.2#define SET_EN P3OUT |= BIT2;

/***************DA转换模块的定义***************/
#define SCL_H P1OUT |= BIT1
#define SCL_L P1OUT &= ~BIT1
#define SDA_H P1OUT |= BIT0
#define SDA_L P1OUT &= ~BIT0
#define SCL_out P1DIR |= BIT1 //SCL设置为输出模式
#define SDA_in P1DIR &= ~BIT0 //SDA改成输入模式
#define SDA_out P1DIR |= BIT0 //SDA变回输出模式
#define SDA_val P1IN&BIT0 //SDA的位值
#define TRUE 1
#define FALSE 0
#define pai 3.14

/***************按键模块 全局变量***************/
uchar key_Pressed; //按键是否被按下:1–是,0–否
uchar key_val; //存放键值
uchar key_Flag; //按键是否已放开:1–是,0–否

//设置键盘逻辑键值与程序计算键值的映射
uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
uchar s1[] = {"zhengxian:"};
uchar s2[] = {"fangbo:"};
uchar s3[] = {"juchi:"};
uchar s4[] = {"sanjiao:"};

/***************调节模块 全局变量***************/
uchar fuzhi;
uchar pinlv;
unsigned int time; //定时
int vcc; //da上加的电压
uchar boxing;double bianliang;
uchar biaozhi;
int pianyi;
int shuchu;

/***************总体定义模块***************/
void xianshi(void);
void DispNChar(uchar x,uchar y, uchar n,uchar *ptr);
void LocateXY(uchar x,uchar y) ;
void Disp1Char(uchar x,uchar y,uchar data);
void LcdReset(void) ;
void LcdWriteCommand(uchar cmd,uchar chk) ;
void LcdWriteData( uchar data );
void WaitForEnable(void);
void Set_IO(void);
void start(void);
void stop(void);
uchar check(void);
void write1(void);
void write0(void);
void write1byte(uchar wdata);
uchar Write_DAC(uchar wdata);
void Init_Keypad(void);
void Check_Key(void);
void Key_Event(void);
void zhengxian(void);
void chansheng1(void);
void fangbo(void);
void chansheng2(void);
void juchi(void);
void chansheng3(void);
void sanjiao(void);
void chansheng4(void);
void zengfu(void);
void jiaofu(void);
void zengpin(void);
void jianpin(void);
void delay100us(void);
void delay5ms(void);
void delay15ms(void);

/***************总体显示模块***************/
/***********************************************函数名称:xianshi
功 能:让液晶显示程序中液晶显示的主框架
参 数:
返回值 :
***********************************************/
void xianshi(void){
LcdWriteCommand(0x01, 1); //清除显示
Disp1Char(0,1,0×46); //显示F
Disp1Char(1,1,0x3d); //显示=
Disp1Char(3,1,0×56); //0x56是字符V的ASCII码值
Disp1Char(5,1,0×50); //显示P
Disp1Char(6,1,0x3d); //显示=
Disp1Char(9,1,0×48); //0x48是字符H的ASCII码值
Disp1Char(10,1,0x5a); //0x5a是字符Z的ASCII码值

}

/*******************************************
函数名称:DispNchar
功 能:让液晶从某个位置起连续显示N个字符
参 数:x–位置的列坐标
y–位置的行坐标
n–字符个数
ptr–指向字符存放位置的指针
返回值 :无
********************************************/
void DispNChar(uchar x,uchar y, uchar n,uchar *ptr){
uchar i;
for (i=0;i<n;i++)
{
Disp1Char(x++,y,ptr[i]);
if (x == 0x0f)
{
x = 0; y ^= 1;
}
}
}

/*******************************************
函数名称:LocateXY
功 能:向液晶输入显示字符位置的坐标信息
参 数:x–位置的列坐标
y–位置的行坐标
返回值 :无
********************************************/
void LocateXY(uchar x,uchar y){
uchar temp;

temp = x&0x0f;
y &= 0x01;
if(y) temp |= 0x40; //如果在第2行
temp |= 0x80;
LcdWriteCommand(temp,1);
}

/*******************************************
函数名称:Disp1Char
功 能:在某个位置显示一个字符
参 数:x–位置的列坐标
y–位置的行坐标
data–显示的字符数据
返回值 :无
********************************************/
void Disp1Char(uchar x,uchar y,uchar data){ LocateXY( x, y ); LcdWriteData( data );}

/*******************************************
函数名称:LcdReset
功 能:对1602液晶模块进行复位操作
参 数:无
返回值 :无
********************************************/
void LcdReset(void){
CtrlDir |= 0x07; //控制线端口设为输出状态 DataDir = 0xFF; //数据端口设为输出状态
LcdWriteCommand(0x38, 0); //规定的复位操作
delay5ms();
LcdWriteCommand(0x38, 0); delay5ms();
LcdWriteCommand(0x38, 0);
delay5ms();

LcdWriteCommand(0x38, 1); //显示模式设置
LcdWriteCommand(0x08, 1); //显示关闭
LcdWriteCommand(0x01, 1); //显示清屏
LcdWriteCommand(0x06, 1); //写字符时整体不移动
LcdWriteCommand(0x0c, 1); //显示开,不开游标,不闪烁}

/*******************************************
函数名称:LcdWriteCommand
功 能:向液晶模块写入命令
参 数:cmd–命令,
chk–是否判忙的标志,1:判忙,0:不判
返回值 :无
********************************************/
void LcdWriteCommand(uchar cmd,uchar chk){
if (chk) WaitForEnable(); // 检测忙信号?
CLR_RS; CLR_RW; _NOP();

DataPort = cmd; //将命令字写入数据端口 _NOP(); SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;}
/*******************************************
函数名称:LcdWriteData
功 能:向液晶显示的当前地址写入显示数据
参 数:data–显示字符数据
返回值 :无
********************************************/
void LcdWriteData( uchar data ){
WaitForEnable(); //等待液晶不忙

SET_RS;
CLR_RW; _NOP();

DataPort = data; //将显示数据写入数据端口
_NOP();

SET_EN; //产生使能脉冲信号
_NOP(); _NOP(); CLR_EN;}

/*******************************************
函数名称:WaitForEnable
功 能:等待1602液晶完成内部操作
参 数:无
返回值 :无
********************************************/
void WaitForEnable(void){
P4DIR &= 0x00; //将P4口切换为输入状态

CLR_RS;
SET_RW;
_NOP();
SET_EN; _NOP();
_NOP();
while((P4IN & Busy)!=0); //检测忙标志

CLR_EN;
P4DIR |= 0xFF; //将P4口切换为输出状态}

/***************总体DA转换模块***************/
/*******************************************
函数名称:Set_IO
功 能:设置IIC对应IO为输出方向并输出高电平
参 数:无
返回值 :无
********************************************/
void Set_IO(void)
{
}
/*******************************************
函数名称:start
功 能:完成IIC的起始条件操作
参 数:无
返回值 :无
********************************************/
void start(void)
{
SCL_out;
SDA_out;
SCL_H;
SDA_H;}

/*******************************************
函数名称:stop
功 能:完成IIC的终止条件操作
参 数:无
返回值 :无
********************************************/
void stop(void)
{
SCL_H;
SDA_H;
delay100us();
SDA_L;
delay100us();
SCL_L;
delay100us();}

/*******************************************
函数名称:check
功 能:检查从机的应答操作
参 数:无
返回值 :从机是否有应答:1–有,0–无
********************************************/
uchar check(void)
{
uchar slaveack;

SDA_in;
SCL_H;
delay100us();
slaveack = SDA_val; //读入SDA数值
SCL_L;
delay100us();
SDA_out;
if(slaveack) return FALSE;
else return TRUE;
}

/*******************************************
函数名称:write1
功 能:向IIC总线发送一个1
参 数:无
返回值 :无
********************************************/
void write1(void)
{
SDA_H;
delay100us();
SCL_H;
delay100us();
SCL_L; delay100us();}

/*******************************************
函数名称:write0
功 能:向IIC总线发送一个0
参 数:无
返回值 :无
********************************************/
void write0(void)
{
SDA_L;
delay100us();
SCL_H;
delay100us(); SCL_L; delay100us();}

/*******************************************
函数名称:write1byte
功 能:向IIC总线发送一个字节的数据
参 数:wdata–发送的数据
返回值 :无
********************************************/
void write1byte(uchar wdata)
{
uchar i;

for(i = 8;i > 0;i–)
{
if(wdata & 0x80) write1();
else write0();
wdata <<= 1;
}}

/*******************************************
函数名称:Write_DAC
功 能:向DAC中写入输出电压数据
参 数:无
返回值 :写入结果:1–成功,0–失败
********************************************/
uchar Write_DAC(uchar wdata)
{
start();
write1byte(0x98); //DAC的设备地址
if(check()) write1byte(wdata>>4); //写控制模式和电压数据的高四位
else return 0;
if(check()) write1byte(wdata<<4); //写电压数据的低四位
else return 0;
if(check()) stop();
else return 0;
return 1;}

/***************总体按键模块***************/
/*******************************************
函数名称:Init_Keypad
功 能:初始化扫描键盘的IO端口
参 数:无
返回值 :无
********************************************/
void Init_Keypad(void)
{ P1DIR = 0xf0; //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态
P1OUT |= 0x0f; //P1.4~P1.7输出低电平
P1IES = 0x0f; //P1.0~P1.3下降沿触发中断
P1IE = 0x0f; //P1.0~P1.3允许中断
key_Flag = 0; key_Pressed = 0; key_val = 0;}

/*******************************************
函数名称:Check_Key
功 能:扫描键盘的IO端口,获得键值
参 数:无
返回值 :无
********************************************/
void Check_Key(void)
{
uchar row ,col,tmp1,tmp2;
tmp1 = 0x80;
for(row = 0;row < 4;row++) //行扫描
{
P1OUT = 0xf0; //P1.4~P1.7输出全1
P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0
tmp1 >>=1; if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0
{ tmp2 = 0x01; // tmp2用于检测出那一位为0 for(col = 0;col < 4;col++) // 列检测 { if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是
{ key_val = key_Map[row * 4 + col]; // 获取键值
return; // 退出循环
}
tmp2 <<= 1; // tmp2右移1位 }
}
}}

/*******************************************
函数名称:Key_Event
功 能:检测按键,并获取键值
参 数:无
返回值 :无
********************************************/
void Key_Event(void)
{ uchar tmp;
P1OUT &= 0x00; // 设置P1OUT全为0,等待按键输入
tmp = P1IN; // 获取 p1IN
if ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下
{ key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识
delay15ms(); //消除抖动
Check_Key(); // 调用check_Key(),获取键值 } else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放
{ key_Pressed = 0; // 清除key_Pressed标识
key_Flag = 1; // 设置key_Flag标识
}
else {
_NOP();
}}

/***************总体波形及显示模块***************/
/*******************************************
函数名称:zhengxian
功 能:输出正弦波
参 数:无
返回值 :无
********************************************/
void zhengxian(void)
{
biaozhi = 0;
boxing = 1;
xianshi();
DispNChar(0,0,10,s1); //显示正弦波 CCTL0 = CCIE;
CCR0 = time / 12;
TACTL = TASSEL_1 + MC_1;
_EINT(); //打开中断
while(1)
{ Disp1Char(2,1,0×30 + fuzhi); //显示幅值 数字的ASCII码值等于其本身数值加上0x30 Disp1Char(7,1,0×30 + pinlv / 10); //显示频率十位
Disp1Char(8,1,0×30); //显示频率各位 }
}

/*******************************************
函数名称:chansheng1
功 能:输出正弦波
参 数:无
返回值 :无
********************************************/
void chansheng1(void)
{
void chansheng1(void)
{if(biaozhi == 12)
{biaozhi = 0;}
if(biaozhi < 12)
{biaozhi += 1;}
shuchu = 0xff * (fuzhi * sin(biaozhi * bianliang)+1.5) / vcc;
Write_DAC(shuchu); //写入DAC}

/*******************************************
函数名称:fangbo
功 能:输出显示
参 数:无
返回值 :无
********************************************/
void fangbo(void)
{
boxing = 2;
biaozhi = 1;
time = time / 2;
xianshi();
DispNChar(0,0,7,s2); //显示方波 CCTL0 = CCIE;
CCR0 = time;
TACTL = TASSEL_1 + MC_1;
_EINT(); //打开中断
while(1)
{
Disp1Char(2,1,0×30 + fuzhi); //显示幅值 数字的ASCII码值等于其本身数值加上0x30
Disp1Char(7,1,0×30 + pinlv / 10); //显示频率十位
Disp1Char(8,1,0×30); //显示频率各位
shuchu = 0xff * fuzhi / vcc; //确定输出值的大小
}}

/*******************************************
函数名称:chansheng2
功 能:输出方波
参 数:无
返回值 :无
********************************************/
void chansheng2(void)
{ if(biaozhi != 0)
{Write_DAC(shuchu); //写入DAC }
else
{Write_DAC(0); //写入DAC }
}

/*******************************************
函数名称:juchi
功 能:输出显示
参 数:无
返回值 :无
********************************************/
void juchi(void)
{
boxing = 3;
xianshi();
shuchu = 0;
DispNChar(0,0,6,s3); //显示锯齿波 Write_DAC(shuchu); //写入DAC
CCTL0 = CCIE;
CCR0 = time / 10;
TACTL = TASSEL_1 + MC_1;
_EINT(); //打开中断
while(1)
{ Disp1Char(2,1,0×30 + fuzhi); //显示幅值 数字的ASCII码值等于其本身数值加上0x30
Disp1Char(7,1,0×30 + pinlv / 10); //显示频率十位
Disp1Char(8,1,0×30); //显示频率各位 }}

/*******************************************
函数名称:chansheng3
功 能:输出锯齿波
参 数:无
返回值 :无
********************************************/
void chansheng3(void)
{
shuchu += pianyi;
Write_DAC(shuchu); //写入DAC
if(shuchu >= pianyi * 10)
shuchu = 0; }

/*******************************************
函数名称:sanjiao
功 能:输出显示
参 数:无
返回值 :无
********************************************/
void sanjiao(void)
{
shuchu = 0;
biaozhi = 0;
boxing = 4;
xianshi();
DispNChar(0,0,8,s4); //显示三角波 CCTL0 = CCIE;
CCR0 = time / 10;
TACTL = TASSEL_1 + MC_1;
_EINT();
while(1)
{ Disp1Char(2,1,0×30 + fuzhi); //显示幅值 数字的ASCII码值等于其本身数值加上0x30
Disp1Char(7,1,0×30 + pinlv / 10); //显示频率十位
Disp1Char(8,1,0×30); //显示频率各位 }}

/*******************************************
函数名称:chansheng4
功 能:输出三角波
参 数:无
返回值 :无
********************************************/
void chansheng4(void)
{ if(biaozhi == 10)
{biaozhi = 0;
}
if(biaozhi >= 5 && biaozhi < 10)
{biaozhi += 1;
shuchu -= pianyi;
}
if(biaozhi < 5)
{biaozhi += 1;
shuchu += pianyi; }
Write_DAC(shuchu); //写入DAC
}

/*******************************************
函数名称:zengfu
功 能:增加波形幅值
参 数:无
返回值 :无
********************************************/
void zengfu(void)
{
_EINT(); //打开中断
if(fuzhi < 3)
{fuzhi += 1; } //幅值加1
}

/*******************************************
函数名称:jiaofu
功 能:减小波形幅值
参 数:无
返回值 :无
********************************************/
void jiaofu(void)
{
_EINT(); //打开中断
if(fuzhi > 1)
{fuzhi -= 1; } //幅值减1
}

/*******************************************
函数名称:zengpin
功 能:增加波形频率
参 数:无
返回值 :无
********************************************/
void zengpin(void)
{
_EINT(); //打开中断
pinlv = 20;
switch(boxing)
{case 1: time = 136; break;
case 2: time = 819; break;
case 3: time = 164; break;
case 4: time = 164; break;
}
CCR0 = time;}

/*******************************************
函数名称:jianpin
功 能:减小波形频率
参 数:无
返回值 :无
********************************************/
void jianpin(void)
{
_EINT(); //打开中断
pinlv = 10;
switch(boxing)
{case 1: time = 273; break;
case 2: time = 1638; break;
case 3: time = 327; break;
case 4: time = 327; break;
}
CCR0 = time;}

/***************总体延时模块***************/
/*******************************************
函数名称:delay100us
功 能:延时约100us的时间
参 数:无
返回值 :无
********************************************/
void delay100us(void)
{
uchar i;
for(i = 0;i < 15;i++)
_NOP();}

/*******************************************
函数名称:delay5ms
功 能:延时约5ms
参 数:无
返回值 :无
********************************************/
void delay5ms(void)
{ int i = 4000;
while (i != 0)
{
i–;
}}

/*******************************************
函数名称:delay15ms
功 能:延时约15ms,完成消抖功能
参 数:无
返回值 :无
********************************************/
void delay15ms(void)
{
int tmp;
for(tmp = 12000;tmp > 0;tmp–);}
/*******************************************
函数名称:delay400ms
功 能:延时约400ms
参 数:无
返回值 :无
********************************************/
void delay400ms(void)
{
uchar i = 50;
int j;
while(i–)
{
j = 7269;
while(j–);
}
}

//主函数*****************************************
void main(void)
{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
BoardConfig(0xb8); //关闭数码管、流水灯和电平转换 vcc = 3; //da上加的电压
bianliang = 2 * pai / 12;
fuzhi = 0x02;
pinlv = 10;
time = 3276;
LcdReset(); //初始化LCD
Init_Keypad(); //初始化键盘端口 _EINT(); //打开中断 while(1); }
/*******************************************
函数名称:Port1_ISR
功 能:端口P1的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{ while(1)
{ Key_Event(); //检测按键,并获取键值 P1IFG = 0; P1OUT = 0; //清中断标志
switch(key_val)
{ case 1: zhengxian(); break; //输出正弦波
case 2: fangbo(); break; //输出方波
case 3: juchi(); break; //输出锯齿波
case 4: sanjiao(); break; //输出三角波
case 5: zengfu(); break; //增加幅值
case 6: jiaofu(); break; //减小幅值
case 7: zengpin(); break; //增大频率 即选择20hz
case 8: jianpin(); break; //减小频率 即选择10hz
default: break;

}
break;
}
}
/*******************************************
函数名称:TIMERA0_VECTOR
功 能:定时器A的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{switch(boxing)
{case 1:
chansheng1(); break; case 2: biaozhi = ~biaozhi; chansheng2();
break;
case 3: pianyi = 0xff * fuzhi / vcc / 10; //确定偏移量的大小
chansheng3();
break;

case 4:
pianyi = 0xff * fuzhi / vcc / 5; //确定偏移量的大小;
chansheng4();
break;
}

灰小子:

错误很明显,编译器没找到那个头文件。你看一下,这个文件是否存在,在哪个文件夹?

Ling Zhu2:

头文件 路径 没有包括吧

qianli ma1:

回复 Ling Zhu2:

需要的就是头文件,我没有

qianli ma1:

回复 灰小子:

我没有这个头文件,你可以帮我弄出来么

HG:

请参考http://perso.citi.insa-lyon.fr/afraboul/rts6/doc/EW430_CompilerReference.pdf

赞(0)
未经允许不得转载:TI中文支持网 » 这是一个用MSP430为主系统做的信号发生器的程序,需要修改求大神指教,重谢!!!
分享到: 更多 (0)