信号发生器程序Word下载.docx
《信号发生器程序Word下载.docx》由会员分享,可在线阅读,更多相关《信号发生器程序Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
#include"
1602.h"
key.h"
tlc5615.h"
menu.h"
wave.h"
main.c--------------------------------------------------------------------------------------
system_inc.h"
unsignedchardot_num;
/*****************************************************************************/
voidTIM0_Init(void)
{
TCCR0=0x01;
//00000000
TCNT0=0x00;
OCR0=0x9B;
TIMSK|=(1<
<
1);
//TIM0比较匹配中断使能
//TCCR0|=0x05;
TCCR0&
=~0x07;
}
voidTIM16_Init()
TCCR1A=0x00;
TCCR1B=0x08;
//00001000
TCNT1=0x00;
//OCR1A=0x04F4;
//1KHz15.8750us
4);
//OCIE1A中断使能
//TCCR1B|=0x01;
//00000001
TCCR1B&
intmain()
SetVpp=10;
SetFreq=100;
SetDutyRatio=50;
LCD_init();
//TIM0_Init();
TLC5615_Init();
TIM16_Init();
KEY_Init();
TIM16_WirteOCR(SetFreq,Wave_OutEn);
VppValue_Calcu(SetVpp,Sine_Code);
asm("
sei"
);
TLC5615_WriteData(0);
Wave_SelectMenu(Wave_ID);
while
(1)
{
Wave_BuildRunning();
}
//定时器1比较匹配中断服务程序
#pragmavector=TIMER1_COMPA_vect
__interruptvoidTimer1_Interrupt(void)
dot_num++;
if(dot_num>
63)dot_num=0;
TLC5615_WriteData(Out_DACValue[dot_num]);
1602.c--------------------------------------------------------------------------------------
/*****************************************************************************/#defineBIT(x)(1<
(x))
#definenBIT(x)(0<
//数据寄存器
#defineLCD_Data_PPORTA
#defineLCD_Data_DDDRA
#defineLCD_Data_IPINA
//控制管脚
#defineRS_Bit5
#defineRW_Bit6
#defineEN_Bit7
#defineLCD_EN_PPORTC
#defineLCD_EN_DDDRC
#defineLCD_RS_PPORTC
#defineLCD_RS_DDDRC
#defineLCD_RW_PPORTC
#defineLCD_RW_DDDRC
#defineLCD_EN_Set()LCD_EN_P|=BIT(EN_Bit);
#defineLCD_EN_Reset()LCD_EN_P&
=~BIT(EN_Bit);
#defineLCD_RS_Set()LCD_RS_P|=BIT(RS_Bit);
#defineLCD_RS_Reset()LCD_RS_P&
=~BIT(RS_Bit);
#defineLCD_RW_Set()LCD_RW_P|=BIT(RW_Bit);
#defineLCD_RW_Reset()LCD_RW_P&
=~BIT(RW_Bit);
//液晶操作指令
#definescreen_clear0x01
#definecursor_on0x0e
#definecursor_off0x0c
#definecursor_flash0x0d
#definescreen_moveL0x07
/*****************************************************************************/voiddelay_1ms(void)
unsignedinti;
for(i=0;
i<
1600;
i++);
/*****************************************************************************/voiddelay_nms(unsignedintms)
ms;
i++)delay_1ms();
/*****************************************************************************/voidLCD_busy(void)
LCD_Data_D&
=~BIT(7);
//D7位为输入
LCD_RS_Reset();
//RS=0
LCD_RW_Set();
//RW=1
LCD_EN_Set();
//E=1
nop"
while(LCD_Data_I&
0x80);
//检查DB7是否为0
LCD_EN_Reset();
//E=0
LCD_Data_D|=BIT(7);
//D7位为输出
/*****************************************************************************/voidLCD_write_com(unsignedcharcom,unsignedcharbusy_en)
if(busy_en)LCD_busy();
//是否检查忙信号
//RS=0
LCD_RW_Reset();
//RW=0
//LCD_EN_Reset();
//E=0
//E=1
LCD_Data_P=com;
//写数据
/*****************************************************************************/voidLCD_write_dat(unsignedchardat)
LCD_busy();
//检查忙信号
LCD_RS_Set();
//RS=1
LCD_Data_P=dat;
/*****************************************************************************/voidLCD_init(void)
//端口初始化
LCD_Data_D=0xff;
LCD_EN_D|=BIT(EN_Bit);
LCD_RS_D|=BIT(RS_Bit);
LCD_RW_D|=BIT(RW_Bit);
//液晶初始化
delay_nms(20);
LCD_write_com(0x38,0);
delay_nms(10);
LCD_write_com(0x38,1);
//显示模式设置
LCD_write_com(0x08,1);
//显示关闭
LCD_write_com(0x01,1);
//显示清屏
LCD_write_com(0x06,1);
//显示光标移动设置
LCD_write_com(0x0c,1);
//显示开及光标不显示
LCD_write_com(0x80,1);
//初始化数据指针
/*****************************************************************************/voidLCD_ctrl(unsignedcharcommod)
LCD_write_com(commod,1);
/*****************************************************************************/voidLCD_set_addr(unsignedchary,unsignedcharx)
if(y==1)
LCD_write_com(0x80+x-1,1);
//设置第一行地址指针
elseif(y==2)
LCD_write_com(0x80+0x40+x-1,1);
//设置第二行地址指针
/*****************************************************************************/voidLCD_printchar(unsignedchary,unsignedcharx,unsignedcharword)
//设置显示位置
//打印一个字符
LCD_write_dat(word);
/*****************************************************************************/voidLCD_printstring(unsignedchary,unsignedcharx,unsignedchar*str)
LCD_set_addr(y,x);
//打印数据
while(*str!
='
\0'
)
LCD_write_dat(*str++);
/*****************************************************************************/voidLCD_printvalue(unsignedchary,unsignedx,unsignedinttmp,unsignedcharlen)
unsignedcharvalue[5];
//分离数据
value[0]=tmp/10000+0x30;
value[1]=tmp%10000/1000+0x30;
value[2]=tmp%1000/100+0x30;
value[3]=tmp%100/10+0x30;
value[4]=tmp%10+0x30;
for(i=(5-len);
5;
i++)
{
LCD_write_dat(value[i]);
voidLCD_ShowData(unsignedchary,unsignedx,unsignedintdata,unsignedchar*string,
unsignedcharcleanlen,unsignedcharflag)
unsignedcharfiLCD_RStplace=0;
//数据首位数值标志,0为0,非0?
cleanlen;
LCD_write_dat(0x20);
if(data==0)
LCD_write_dat(0x30);
else
value[0]=data/10000+0x30;
value[1]=data%10000/1000+0x30;
value[2]=data%1000/100+0x30;
value[3]=data%100/10+0x30;
value[4]=data%10+0x30;
//打印数据
if((data<
10)&
&
(flag==1))
LCD_write_dat(0x2E);
LCD_write_dat(value[4]);
if((value[i]==0x30)&
(fiLCD_RStplace==0))continue;
if(flag)
if(i==3)
fiLCD_RStplace=1;
while(*string!
LCD_write_dat(*string++);
}
1602.h--------------------------------------------------------------------------------------
#ifndef__1602_H
#define__1602_H
voiddelay_1ms(void);
voiddelay_nms(unsignedintms);
voidLCD_busy(void);
voidLCD_write_com(unsignedcharcom,unsignedcharbusy_en);
voidLCD_write_dat(unsignedchardat);
voidLCD_init(void);
voidLCD_ctrl(unsignedcharcommod);
voidLCD_set_addr(unsignedchary,unsignedcharx);
voidLCD_printchar(unsignedchary,unsignedcharx,unsignedcharword);
voidLCD_printstring(unsignedchary,unsignedcharx,unsignedchar*str);
voidLCD_printvalue(unsignedchary,unsignedx,unsignedinttmp,unsignedcharlen);
voidLCD_ShowData(unsignedchary,unsignedx,unsignedintdata,unsignedchar*string,unsignedcharcleanlen,unsignedcharflag);
key.c----------------------------------------------------------------------------------------
#defineKEY_PORTPIND
#defineKEY_DDRDDRD
externvoidKEY_Init()
KEY_DDR&
=~0xBF;
externunsignedcharKEY_Scan(unsignedchar*Cont)
unsignedcharTrg;
unsignedcharReadData=KEY_PORT;
ReadData^=0xff;
Trg=ReadData&
(ReadData^(*Cont));
*Cont=ReadData;
return(unsignedchar)(Trg&
0xBF);
key.h----------------------------------------------------------------------------------------
#ifndef__KEY_H
#define__KEY_H
externvoidKEY_Init();
externunsignedcharKEY_Scan(unsignedchar*Cont);
menu.c-------------------------------------------------------------------------------------
unsignedcharWave_ID=0;
unsignedcharWave_OutEn=0;
unsignedcharSet_Addr[7]={0xC0,0xC2,0xCB,0xCC,0xCD};
unsignedcharParameter_Tmp[7];
voidWave_SelectMenu(unsignedcharWave_ID)
switch(Wave_ID)
caseSINE_WAVE:
LCD_printstring(1,1,"
SINE"
break;
caseTRIA_WAVE:
TRIA"
VppValue_Calcu(SetVpp,Tria_Code);
caseRECT_WAVE:
RECT"
VppValue_Calcu(SetVpp,Rect_Code);
caseSAWT_WAVE:
SAWT"
VppValue_Calcu(SetVpp,Sawt_Code);
//Wave_ReInit(Wave_OutEn);
if(Wave_OutEn)
LCD_printstring(1,6,"
ENABLE"
else
DISENA