基于ATmega16单片机 波形发生器 程序源代码
2016-01-05 22:47
441 查看
/*ATmega16波形发生器*/ //设计了三个按键用于设置输出方波的频率,在数码管显示,T/C1工作在输出比较模式 #include<avr/io.h> #include<avr/interrupt.h> #include<avr/signal.h> #include<util/delay.h> #define uint unsigned int #define uchar unsigned char #define con 1000 #define flag=0; uchar table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar data[4]={0,0,0,1};//显示初值:0,0,0,0 uchar key1_flag,key2_flag,key3_flag;//定义键盘标志 SIGNAL(SIG_OUTPUT_COMPARE1A) { PORTD=~PORTD; } void display(uchar *p) {uchar i,sel=0x01; for(i=0;i<4;i++) { PORTC=sel; PORTA=table[p[i]]; _delay_ms(1); sel=sel<<1; } } void key_process(uchar *p) { uchar i,j,k; while((PINB&0x01)==0) {display(data); key1_flag=1;} while((PINB&0x02)==0) {display(data); key2_flag=1;} while((PINB&0x04)==0) {display(data); key3_flag=1;} if(key1_flag==1)//处理频率个位 {p[3]++; if(p[3]==10) p[3]=0; key1_flag=0;} if(key2_flag==1)//处理频率十位 {p[2]++; if(p[2]==10) p[2]=0; key2_flag=0;} if(key3_flag==1)//处理频率百位 {p[1]++; if(p[1]==10) p[1]=0; key3_flag=0;} } void set_process(void)//设置输出比较寄存器值 {uint i,j; i=data[0]*1000+data[1]*100+data[2]*10+data[3]; j=500/i; OCR1AH=j>>8; OCR1AL=j&0x00ff; } void init_io(void) {DDRA=0xff; PORTA=0xff; DDRC=0xff; PORTC=0xff; DDRB=0x00; PORTB=0x00; DDRD=0xff; PORTD=0xff; } void init_timer1(void)// { TIMSK=TIMSK|0x10;//输出比较使能 TCCR1B=0x0a; TCNT1H=0x00; TCNT1L=0x00; set_process();//OCR1A.OCR1B置初值 sei(); } void main() { init_io(); PORTA=0xff; PORTC=0x00; init_timer1(); _delay_ms(300); PORTC=0xff; while(1) { key_process(data); set_process(); display(data);//动态扫描显示 } }
相关文章推荐
- C 语言学习 —— 《明解C语言》
- Java笔记——IO流分类
- 深入java虚拟机(四)
- Eclipse中Android工程下布局文件无法正常预览
- python知识-python操作MySQL数据库
- 单例模式 c#
- 删除重复节点
- C#静态变量、静态方法、静态类
- PYTHON 奇怪现象 记录下 WindowsError: [Error 2]
- C#中如何判断一个文件是否存在
- 第六章(函数)编程题一
- 自学java SessionFactory的创建
- 基于ATmega16单片机 程控滤波器程序源代码
- 二、Python-----用户交互
- python 装饰器
- C++11新特性应用--实现延时求值(std::function和std::bind)
- Spring AOP 详解
- C++11新特性应用--实现延时求值(std::function和std::bind)
- python学习之一:如何解决 lxml中找不到etree等问题
- JAVA访问数据库之概述