📄 signal._c
字号:
//ICC-AVR application builder : 2008-9-7 11:00:08
// Target : M8515
// Crystal: 16.000Mhz
#include <iom8515v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define data1 PORTB
uchar h=0,j=0,k=0,func,th1=0xE7,tl1=0;
uchar f1=0x06,f2=0; //250Hz的步进
uint i=0;
#pragma data:code
const uchar sin_table[256]=
{
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,
0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,
0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,
0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,
0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,
0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,
0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,
0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c
};
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
j=0;
}
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xff;
PORTC = 0x00;
DDRC = 0xff;
PORTD = 0x00;
DDRD = 0x01;
PORTE = 0x00;
DDRE = 0x00;
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 400uSec
// actual value: 400.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = th1; //setup //th1,tl1用来改变频率
TCNT1L = tl1;
OCR1AH = 0x20;
OCR1AL = 0x00;
OCR1BH = 0x20;
OCR1BL = 0x00;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
TCCR1B = 0x00; //stop
TCNT1H = th1; //reload counter high value
TCNT1L = tl1; //reload counter low value
//func=1; //设置调试点,计算时间
if(func==1) //正弦波
{
data1=sin_table[j++];
}
//func++; //设置调试点
if(func==2) // 锯齿波
{
if(h<128)
data1=h;
else
data1=255-h;
h++;
}
else if(func==3) // 方波
{
k++;
if(k<=127)
data1=0x00;
else
data1=0xff;
}
TCCR1B = 0x01; //start Timer
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x02;
EMCUCR = 0x00;
GICR = 0x40;
TIMSK = 0x80;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void key_read()
{
uchar num,i;
DDRA=0xff; // 都定义为输出
PORTA=0xf0; // 高位输出高电平,低位输出低电平
DDRA=0x0f; // 有键按下,把相应列(高位)的电平拉低
asm("nop");
i=PINA; //获取列的地址,即
DDRA=0xff;
PORTA=0x0f;
DDRA=0xf0; //把相应行的电平拉低
asm("nop");
i|=PINA; //获取行的地址 ,行与列的地址决定按键的位置
switch(i)
{
case 0x77 :
{
func++;
if(func==4)
func=0x00; break;
}
case 0x7B : //频率加250Hz
{
th1-=f1;
tl1-=f2;
break;
}
case 0x7D : ////频率减250Hz
{
th1+=f1;
tl1+=f2;
break;
}
/*case 0xEE :
{
func++;
if(func==4)
func=0x00; break;
}
case 0xDE :
{
func++;
if(func==4)
func=0x00; break;
}
case 0xBE :
{
func++;
if(func==4)
func=0x00; break;
}
case 0x7E :
{
func++;
if(func==4)
func=0x00; break;
}
case 0xED :
{
func++;
if(func==4)
func=0x00; break;
}
case 0xDD :
{
func++;
if(func==4)
func=0x00; break;
} */
case 0xBD : ; break;
case 0xEB : ; break;
case 0xDB : ; break;
case 0xBB : ; break;
case 0xE7 : ; break;
case 0xD7 : ; break;
case 0xB7 : ; break;
default : break;
}
}
void main()
{
//set_cw1;
//set_xwr2;
init_devices();
while(1)
{
key_read();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -