AVR利用CTC模式输出方波程序
请教马老师:利用AVR单片机CT1,外部晶振7.3728M,PD4脚输出10HZ--320HZ方波,PA0、PA1口接2个按键,按下PA0频率增加,按下PA1频率减少,程序如下,请各位帮忙修改一下。#include <iom16v.h>
#include <macros.h>
#defineuchar unsigned char
#defineuintunsigned int
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
uchar key_press() // 检测有没有按键按下
{
uchar a;
DDRA|=0X03; //将PA0、PA1设置为输出
PORTA|=0X03; //PA0、PA1输出1
DDRA&=0XFC; //PA0、PA1设置为输入
a=PINA; //将PA口的值读入a
a=a&0X03; //0000 0011,检测PA0、PA1有没有按下
if(a==0X03)
{
return 0; //如果PA0、PA1没有变化,表示没有按键按下
}
else
{
return 1; //表示有按键按下
}
}
void data_change(void)
{
uint e;uchar key;
OCR1A=e;
delay(10); //按键消抖
if(key_press())
{
key=PINA; //PA口的值读入KEY中
key&=0X03; //取PA0、PA1状态
switch(key)
{
case 0X0E:
key=1; //频率值增加
if(key=1;e<=47000);
{
e=e-400;
}
else
{
e=47000;
}
break;
case 0X0D:
key=2; //频率值减少
if(key=2;e>=143);
{
e=e+400;
}
else
{
e=140;
}
break;
default:
key=0;
}
while(key_press()); //等待按键松开
}
else
{
key=0;
}
return key;
}
void main()
{
uchar b,c;
DDRD|=0X30; //将PD4、PD5设置为输出
TCCR1A=0X50; //OC1A,OC1B输出相同波形
TCCR1B=0X09; //无预分频
0CR1A=46079; //设置初始频率10HZ
while(1)
{
b=key_press();
if(b)
{
//c=key_scan();
data_change();
}
}
} 还是建议你买本我的教材从基础认真学习。里面都有。
本教材的前2篇在本拦可以下载电子版的,觉的好再买。 马老师,我把程序改了一下,编译没有问题,但是按下按键频率值没有改变,仿真按键部分程序没有问题,就是OCR1A的值不变,请帮忙看看,谢谢!
程序如下:
#include <iom16v.h>
#include <macros.h>
#defineuchar unsigned char
#defineuintunsigned int
void Delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
uchar key_press() // 检测有没有按键按下
{
uchar a;
DDRA|=0X0F; //将PA0、PA1设置为输出
PORTA|=0X0F; //PA0、PA1输出1
DDRA&=0XF0; //PA0、PA1设置为输入
a=PINA; //将PA口的值读入a
a=a&0X0F; //0000 0011,检测PA0、PA1有没有按下
if(a==0X0F)
{
return 0; //如果PA0、PA1没有变化,表示没有按键按下
}
else
{
return 1; //表示有按键按下
}
}
void data_change()
{
uint e;uchar key;
//e=47000;
Delay(10); //按键消抖
if(key_press())
{
key=PINA; //PA口的值读入KEY中
key=key&0X0F; //取PA0、PA1状态
if(key==0X0E) //频率值增加
{
e=e-400;
}
if(key==0X0D) //频率值减少
{
e=e+400;
}
if(e>=47000)
{
e=47000;
}
if(e<=140)
{
e=140;
}
while(key_press()); //等待按键松开
}
OCR1A=e;
}
void main()
{
uint b,f;
DDRD|=0X30; //将PD4、PD5设置为输出
TCCR1A=0X50; //OC1A,OC1B输出相同波形
TCCR1B=0X0A; //8分频
OCR1A=47000; //设置初始频率10HZ
while(1)
{
b=key_press();
if(b)
{
data_change();
}
}
} 自己已经改好了,谢谢!
页:
[1]