本帖最后由 ddllxxrr 于 2014-9-8 08:37 编辑
自发自收,就是用一个按键每键一个加1把这个数发出,自己中断收,再在显示屏上显示数字。
以下是编译通过的截图:
以下是程序:
/*
* GccApplication14.c
*
* Created: 2014-9-5 19:14:17
* Author: Administrator
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
//定义LED与端口的连接
#define c1 4//PORTD.4
#define c2 5//PORTD.5
#define button 2//PORTD.2
#define UDRE 5
#define FE 4
#define PE 2
#define DOR 3
uchar count;
uchar cnt,cnt1;
uchar counth,countl;
uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //共阳极LED 0~F的段码
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void delay(void) //LED数码管切换时间函数
{
uint i;
for(i=0;i<10;i++);
}
void display(void) //LED数码管显示函数
{
counth=count/10; //十位分离
countl=count%10; //个位分离
PORTC=tab[counth]; //送十位的段码值到PORTC
PORTD |= _BV(c1); //显示LED数码管的十位
delay(); //保持一定时间
PORTD &=~_BV(c1); //不显示LED数码管的十位
PORTC=tab[countl]; //送个位的段码值到PORTC
PORTD |= _BV(c2); //显示LED数码管的个位
delay(); //保持一定时间
PORTD &=~_BV(c2); //不显示LED数码管的个位
}
//interrupt [EXT_INT0] void int0_isr(void)//按键次数统计
ISR(INT0_vect)
{
if (cnt==20)
{
cnt=0;
}
else
{
cnt++;
}
}
//interrupt [USART_RXC] void usart_rx_isr(void)//USART串行接收中断
ISR(USART_RXC_vect)
{
uchar status,data;
status=UCSRA;
data=UDR;
if((status&((1<<FE)|(1<<PE)|(1<<DOR)))==0)
{
count=data;
}
display();
}
void USART_Transmit(char dat)
{
while( !(UCSRA & (1 << UDRE)) ); //只有数据寄存器为空时才能发送数据
UDR = dat;
}
int main(void)
{
DDRC=0xFF;
PORTC=0xFF;
DDRD=0xFA;
PORTD=0xFF;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0;
UBRRL=25; //系统时钟8MHz,波特率为9600bps
MCUCR=0x02; //INT0为下降沿时产生中断请求
GICR=0x40; //允许INT0产生中断
//#asm("sei")
sei();
while(1)
{
USART_Transmit(cnt1);
cnt1=cnt;
}
}
|