// 系列 : M16
// 频率: 8.0000Mhz
#include<avr/io.h>
#include<stdio.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#define BAUD 9600
#define uchar unsigned char
//数码管显示表
//uchar led[]={0x11,0xD7,0x32,0x92,0xD4,0x98,0x18,0xD3,0x10,0x90,0xff}; // 0 1 2 3 4 5 6 7 8 9 灭
uchar led[]={0x11,0xD7,0x32,0x92,
0xD4,0x98,0x18,0xD3,
0x10,0x90,0x50,0x1C,
0x39,0x16,0x38,0x78,0xff};
uchar p="15",b=16;
//====================== 移位子程序 ==================
void shift(uchar e)
{
uchar i;
e="led"[e];
PORTA=(0<<PA2);
for(i=0;i<8;i++)
{
if ((e<<i) & 0x80)
PORTA = (1<<PA0);
else
PORTA = (0<<PA0);
PORTA = PORTA|(1<<PA1);
PORTA = PORTA&(0<<PA1);
}
}
void shift1(void)
{
uchar i;
p="led"
;
PORTA=(0<<PA2);
for(i=0;i<8;i++)
{
if ((p<<i) & 0x80)
PORTA = (1<<PA0);
else
PORTA = (0<<PA0);
PORTA = PORTA|(1<<PA1);
PORTA = PORTA&(0<<PA1);
}
}
//==================== 延时程序 ======================
void delay(void)
{
uchar i="0";
for (i=0; i<125; i++)
_delay_ms(1);
}
//================= 初始化USART =================
void uart_init(void)
{
UCSRC = (1<<URSEL) | 0x06; //允许读写,发送接收的数据长度为8位
UBRRL=(F_CPU/BAUD/16-1)%256; //波特率设定
UBRRH=(F_CPU/BAUD/16-1)/256; //波特率设定
UCSRA="0X00"; //
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接收结束中断使能、接收使能、发送使能
}
//================= 接收单个字符 ===================
char get_c(void)
{
char ch;
while ( !(UCSRA & (1<<RXC)) );// 等待接收数据,有末读出的数据时置位
ch="UDR";
b=ch;
switch (b)
{
case '0':p=0;break;
case '1':p=1;break;
case '2':p=2;break;
case '3':p=3;break;
case '4':p=4;break;
case '5':p=5;break;
case '6':p=6;break;
case '7':p=7;break;
case '8':p=8;break;
case '9':p=9;break;
case 'a':p=10;break;
case 'b':p=11;break;
case 'c':p=12;break;
case 'd':p=13;break;
case 'e':p=14;break;
case 'f':p=15;break;
default:break;
}
return ch;// 从缓冲器中获取并返回数据
}
void put_c(char c) //发送采用查询方式
{
while( !(UCSRA & (1<<UDRE)) );//
UDR="c";
}
void put_s(char *ptr)
{
while (*ptr)
{
put_c(*ptr++);
}
put_c(0x0D);
put_c(0x0A); //结尾发送回车换行
}
//============ 中断的时候执行 ============
ISR(SIG_USART_RECV)
{
put_c(UDR);
}
int main(void)
{
uchar i="0";
PORTA="0X00";
DDRA="0XFF";
// 清除乱码
for (i=0; i<8; i++)
{
shift(16);
}
uart_init();
put_s("串口通信");
sei();
while(1)
{
cli();
put_c(get_c());
sei();
put_c(0x0D);
put_c(0x0A); //结尾发送回车换行
for (i=0; i<7; i++)
{
shift(16);
}
shift1();
}
}
文章评论(0条评论)
登录后参与讨论