标题:
mega128波形发生器仿真及源程序 LCD显示
[打印本页]
作者:
51黑ff
时间:
2016-9-25 19:24
标题:
mega128波形发生器仿真及源程序 LCD显示
084540zbo0brsfzr3kgmkr.gif
(1.45 MB, 下载次数: 137)
下载附件
2016-9-25 19:24 上传
AVR studio编译环境。波形发生器仿真,全部资料下载:
lcd.zip
(72.27 KB, 下载次数: 108)
2016-9-25 19:23 上传
点击文件名下载附件
下载积分: 黑币 -5
单片机程序:
//#include
//#include
#include
#include
#include
#include
#define F_CPU 8000000UL // 8MHz clock
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
//#define lcdrs PORTG2
//#define lcdwr PORTG1
//#define lcden PORTG0
uchar const table1[]={" The period is"};
uchar const table2[]={"The frequency is"};
unsigned char const sin_tab[]={
125,128,131,134,138,141,144,147,150,153,156,159,
162,165,168,171,174,177,180,182,185,188,191,193,196,198,201,203,
206,208,211,213,215,217,219,221,223,225,227,229,231,232,234,235,
237,238,239,241,242,243,244,245,246,246,247,248,248,249,249,250,
250,250,250,250,250,250,250,249,249,248,248,247,246,246,245,244,
243,242,241,239,238,237,235,234,232,231,229,227,225,223,221,219,
217,215,213,211,208,206,203,201,198,196,193,191,188,185,182,180,
177,174,171,168,165,162,159,156,153,150,147,144,141,138,134,131,
128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82,79,76,73,
70,68,65,62,59,57,54,52,49,47,44,42,39,37,35,33,31,30,29,29,28,27,26,25,25,23,21,
19,18,16,15,13,12,11,9,8,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,1,1,2,
2,3,4,4,5,6,7,8,9,11,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,
39,42,44,47,49,52,54,57,59,62,65,68,70,73,76,79,82,85,88,97,94,97,
100,103,106,109,112,116,119,122
};
float period;
float frequency;
uchar change_flag;
uchar const tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar i=0;
uchar wave_flag=0;
uchar sine_wave;
uchar pluse;
uchar triangle=0,flag;
uchar counter=1;
uchar show_number;
void write_lcdcom(uchar date)//写lcd1602命令
{
PORTG&=0xFD;
PORTG&=0xFB;
_delay_us(5);
PORTF=date;
PORTG|=0x01;
_delay_us(5);
PORTG&=0xFE;
}
void write_lcddate(uchar lcddate)//写1602数据
{
PORTG&=0xFD;
PORTG|=0x04;
_delay_us(5);
PORTF=lcddate;
PORTG|=0x01;
_delay_us(5);
PORTG&=0xFE;
}
void lcd_init()//1602初始化
{
write_lcdcom(0x38); //display mode
//write_lcdcom(0x38); //display mode
//write_lcdcom(0x38); //display mode
write_lcdcom(0x06); //显示光标移动位置
write_lcdcom(0x0c); //显示开及光标设置
write_lcdcom(0x01); //显示清屏
}
void display()//显示字符子函数
{
uchar i;
PORTG&=0xFD;
PORTG&=0xFB;
PORTG&=0xFE;
_delay_ms(1);
if(change_flag==0)
{
write_lcdcom(0x80);//第一行lcd显示地址
for(i=0;i<16;i++)
{
write_lcddate(table1[i]);//显示table1中的字符
}
}
else
{
write_lcdcom(0x80);//第二行LCD显示起始地址
for(i=0;i<16;i++)
{
write_lcddate(table2[i]);//显示table2中的字符
}
}
PORTG|=0x02;
PORTG|=0x04;
PORTG|=0x01;
}
void lcd_printf(uint x)//LCD数据显示函数
{
uchar x1,x2,x3,x4;
x1=x/1000;
x2=x%1000/100;
x3=x%100/10;
x4=x%10;
write_lcdcom(0xc6);
write_lcddate(x1+0x30);//0x30是0的ascii码
write_lcddate(x2+0x30);
write_lcddate(x3+0x30);//0x30是0的ascii码
write_lcddate(x4+0x30);
if(change_flag==0)
{
write_lcddate('m');
write_lcddate('s');
}
else
{
write_lcddate('H');
write_lcddate('z');
}
}
void io_init(void)//端口初始化
{
DDRA=0xFF; //端口A输出
DDRC=0xFF; //端口C输出
DDRG=0xFF; //端口G输出
DDRD=0XFF;
DDRB=0XFF;
DDRF=0XFF;
PORTB&=0xFE; //PB0低电平
PORTC=0xFF;
}
void key()//波形发生按键
{
if(PINC==0XFE)// 波形转换
{
wave_flag++;
if(wave_flag>3)
wave_flag=0;
}
while(PINC==0XFE);
if(PINC==0XFD)//周期频率转换
{
show_number=1;
change_flag++;
if(change_flag>1)
change_flag=0;
}
while(PINC==0XFD);
if(PINC==0XFB)//加
{
counter++;
if(counter>254)
counter=255;
}
while(PINC==0XFB);
if(PINC==0XF7)//减
{
counter--;
if(counter<1)
counter=1;
}
while(PINC==0XF7);
}
void timer0_init(void)//中断初始化
{
TCNT0=0x7F;//5;
TIMSK|=(1<<toie0); 使能tc0溢出中断
TCCR0|=(1<<cs01); 8分频
}
ISR(TIMER0_OVF_vect)
{
TCNT0=0X7F;
// i++;
i=i+counter;
if(i>=255)
i=0;
if(wave_flag==0)//锯齿波
{
PORTA=i;
period=4000/(counter*5);
frequency=10000/(period);
}
else if(wave_flag==1)//正弦波
{
sine_wave=sin_tab[i];
PORTA=sine_wave;
period=4000/(counter*5);
frequency=10000/(period);
}
else if(wave_flag==2)//方波
{
if(i<127)
PORTA=0xFF;
else
PORTA=0x00;
period=4000/(counter*5);
frequency=10000/(period);
}
else if(wave_flag==3)//三角波
{
if(!flag)
{
PORTA=triangle++;
if(triangle==0)
{triangle=255;flag=1;}
}
else if(flag)
{
PORTA=triangle--;
if(triangle==255)
{triangle=1;flag=0;}
period=4000/(counter*5);
frequency=10000/(period);
}
}
}
/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/
int main (void) __attribute__((naked));
int main(void)
{
asm("cli"); //关总中断
io_init(); //端口初始化
timer0_init(); //中断初始化
lcd_init();
asm("sei"); //开总中断
display();
while(1)
{
if(change_flag==0)
{
if(show_number==1)
{
display();
show_number=0;
}
lcd_printf(period);
}
else
{
if(show_number==1)
{
display();
show_number=0;
}
lcd_printf(frequency);
}
key();
}
}
复制代码
作者:
急不可待
时间:
2016-11-20 11:49
回帖致敬。
作者:
luoshenmini
时间:
2017-10-9 19:34
观摩学习
作者:
zhwj0220127
时间:
2017-10-13 06:31
不错的资料很好
作者:
by64214
时间:
2017-10-15 07:55
谢谢分享 非常好的学习资料
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1