代码:
/*
《AVR专题精选》随书例程
2.编程技巧
项目:不对变量进行初始化
文件:main.c
说明:演示不对变量进行默认初始化的方法。
在proteus仿真例程中,按下按键,就可以看到两个变量
输出结果的变化。
作者:邵子扬
时间:2012年12月12日
*/
// 串口波特率
#define BAUDRATE 9600UL
// 系统时钟频率
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
// 变量cnt1声明noinit属性,不会进行初始化
char cnt1 __attribute__ ((section (".noinit")));
// 变量cnt2会进行初始化
char cnt2;
// 串口输出缓冲区
char s[20];
// 串口读写
#define UART_read() UDR
#define UART_write(dat) UDR = dat
// 串口初始化
void UART_init()
{
unsigned int UBRRREG;
UBRRREG = F_CPU / ( 8 * BAUDRATE ) - 1;
UBRRH = UBRRREG / 256;
UBRRL = UBRRREG % 256;
UCSRA = ( 1 << U2X );
UCSRB = ( 1 << TXEN );
UCSRC = (1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
}
void UART_puts( char *s )
{
while( *s )
{
UART_write( *s );
s++;
while( !( UCSRA & (1 << TXC )) );
UCSRA |= ( 1 << TXC );
}
}
int main()
{
UART_init();
PORTD = (1 << PD2);
while(1)
{
_delay_ms(500); // 延时
// 将两个变量的值转换为字符串
sprintf(s, "%02X, %02X\n\r", cnt1, cnt2);
// 输出到串口
UART_puts(s);
// 变量递增
cnt1++;
cnt2++;
// 如果按键按下
if (!(PIND & ( 1 << PD2)))
{
// 等待释放按键,防止抖动和重复进入
while(!(PIND & ( 1 << PD2)));
// 跳转到0x0000, 相当于软复位
// 对应的proteus仿真图中,还有RESET复位按键可以对比
// 效果是一样的
(*((void(*)(void))(0)))();
}
}
return 0;
}
仿真效果图;