📄 main.c
字号:
#include<msp430x16x.h>
#include"pwm_timer_b.h"
#include"LTC1450.H"
#include"setclock.h"
#include"7290.h"
#include"lcd.h"
#include"pwm.h"
#include"vf.h"
/*************************************************************
全局变量
*************************************************************/
uchar WHICH=0;
uchar SET=0; //0 表示键盘在非读取状态
uchar RESET=1; //1 表示重设参数 第一次进入的状态为1
unsigned long TOTAL=0; //输入数据的十进制
unsigned char GO=0; //无模块运行时为0
unsigned long temp_num[7]; //存储输入数据为字符串
char temp_i,tr;
char state=0; //输入为负数时state等于1
uchar ReadBuf[2];
unsigned long frq=2048;
unsigned long scale=1024;
unsigned long temp;
char temp1=0;
char temp2=0;
unsigned long num2,num1=1;
unsigned char display1[]="频率:";
unsigned char display2[]="占空比:";
unsigned char display_scale[]="%";
unsigned char display_Hz[]="Hz";
unsigned char displayDA1[]="电压:";
unsigned char displayDA2[]="mV";
unsigned char fu[]="-";
unsigned char kong[]=" ";
unsigned char _exit[]="退出:0 重设:1";
unsigned char _out[]="退出:0 ";
unsigned char erro[]="输入错误";
unsigned char dis1[]=" 追求卓越 拒绝平庸 我爱电子设计";
unsigned char dis2[]="1:PWM控制 2:D/A转换 3:A/D转换 4:V/F转换";
void DAC();
void vf();
void wellcome() {
LCD_LcmClearTXT();
LCD_PutStr(0,0,dis1);
delayMS(26666);
}
void menu() {
LCD_LcmClearTXT();
LCD_PutStr(0,0,dis2);
}
int main() {
WDTCTL=WDTPW+WDTHOLD;
open_XT2(); //7290需要MCLK
BCSCTL2 =SELM_2+SELS;
_EINT();
ini_7290();
LCD_LcmInit();
LCD_LcmClearTXT();
//CD_PutStr( -1, -1,displaymy);
//ellcome(); //欢迎并进入界面
while(1) {
SET=0;
RESET=1;
GO=0;
menu();
LPM0; //中断函数设置which进入相应模块
_NOP();
switch (WHICH) {
case 1 : Pwm(); break;
case 2 : DAC(); break;
//case 3 : tempreture(); break;
case 4 : vf(); break;
// case 5 : VF(); break;
case 0 : break;
default : break ;
}
WHICH=0;
}
}
/*****************************************************************************
键盘中断处理
*****************************************************************************/
#pragma vector = PORT2_VECTOR
__interrupt void l7289do () {
uchar key_num;
IRcvStr(0x70,0x01,(uchar*)ReadBuf,2);
key_num=ReadBuf[0] ;
if(ReadBuf[1]==0) { //禁止连按
switch(key_num) {
case 9: key_num=4; break;
case 10: key_num=5; break;
case 11: key_num=6; break;
case 17: key_num=7; break;
case 18: key_num=8; break;
case 19: key_num=9; break;
case 12: key_num=0; break;
case 20: key_num=12; break; //取消
case 4: key_num=11; break; //确定
default :break;
}
if(SET&&key_num<13) { //键盘在读取状态
get_num(key_num);
goto loop2;
}
if(GO) { //模块正在运行,判断要退出还是重设
if(key_num==1) RESET=1;
if(key_num==0) GO=0;
goto loop2;
}
if(key_num<6) //键盘在非设置状态,选择模块
//0 Go=0退出程序,7
WHICH=key_num;
}//if
loop2:
LPM0_EXIT;
P2IFG&=~0X10;
}
void pwm_init() {
ini_7290();
TimerBInit();
LCD_LcmInit();
LCD_LcmClearTXT();
}
char get_num(uchar key) {
uchar k,h;
unsigned char WriteBuf[2];
if((key<10)&&(temp_i<7)) { //输入为数字,多于7会溢出
WriteBuf[1]=key;
tr=4+temp_i;
tr=tr&0x07;
WriteBuf[0]=0x60+tr; //在第 time_i 位数码管译码并显示key
ISendStr(0x70,0x07,(uchar*)WriteBuf,2);
temp_num[temp_i]=key;
temp_i++;
return 2;
}
if(key==11) { //结算
Clear_7290();
if(temp_num[0]==0) state=1;//输入为负数
else state=0;
for(k=0;k<temp_i;k++) {
for(h=k;h<temp_i-1;h++)
temp_num[k]=temp_num[k]*10;
TOTAL=TOTAL+temp_num[k];
}
SET=0;
temp_i=0;
temp_num[0]=0;
Clear_7290();
return 0;
}
if(key==12) {//清除
Clear_7290();
for(k=0;k<7;k++) temp_num[k]=0;
temp_i=0;
return 1;
}
}
void Pwm() {
pwm_init();
GO=1;
while(GO) {
if(RESET) {
LCD_LcmClearTXT();
LCD_PutStr(0,0,display1);
SET=1;
while(SET==1);
if(TOTAL<125) {
LCD_PutStr(-1,-1,erro);
delayMS(9999);
TOTAL=0;
continue;
}
LCD_PutStr(-1,-1,display_Hz);
LCD_PutNum_l(0,3,TOTAL);
//temp1=TOTAL;
frq=8000000/TOTAL;
TOTAL=0;
LCD_PutStr(-1,-1,display_Hz);
// 设置占空比
LCD_PutStr(1,0,display2);
SET=1;
while(SET==1);
if((TOTAL>=100)||TOTAL==0) {
LCD_PutStr(-1,-1,erro);
delayMS(999);
TOTAL=0;
continue;
}
temp2=TOTAL;
scale=TOTAL;
scale=frq*scale/100;
TOTAL=0;
LCD_PutNum(1,4,(unsigned int)temp2);
LCD_PutStr(-1,-1,display_scale);
while(0==GoPwm(100,scale,frq));
// LCD_PutStr(2,0,_reset);
LCD_PutStr(3,0,_exit);
SET=0;
RESET=0;
}//if
}//while
}
void DAC() {
GO=1;
LCD_LcmInit();
LCD_LcmClearTXT();
LTCOpen(1);
while(GO) {
if(RESET) {
LCD_LcmClearTXT();
LCD_PutStr(0,0,displayDA1);
SET=1;
while(SET==1);
if(TOTAL>2047){ //输出越界
LCD_PutStr(-1,-1,erro);
delayMS(999);
TOTAL=0;
continue;
}
if(state==1) { //把输入的负数转换为正数
SendData(2048-TOTAL);
LCD_PutStr(0,3,fu);
LCD_PutNum_l(0,4,TOTAL);
}
else {
SendData(TOTAL+2048);
LCD_PutNum_l(0,3,TOTAL);
}
LCD_PutStr(-1,-1,displayDA2);
TOTAL=0;
LCD_PutStr(3,0,_exit);
SET=0;
RESET=0;
}//if
}//while
}
void vf() {
GO=1;
_vf();
LCD_PutStr(3,0,_out);
while(GO==1) {
LCD_PutStr(1,0,kong);
num1=GetCyc();
num2=8000000/num1;
LCD_PutNum_l(1,0,num2);
}
TOTAL=0;
SET=0;
RESET=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -