📄 uart.c.bak
字号:
#include <iom128.h>
#include <macros.h>
//LED 开关定义
#define Red_LED_on PORTB&~BIT(0)
#define Red_LED_off PORTB|(1<<0)
#define Green_LED_on PORTB&(~(1<<1))
#define Green_LED_off PORTB|(1<<1)
#define Yellow_LED_on PORTB&(~(1<<2))
#define Yellow_LED_off PORTB|(1<<2)
//UART
unsigned char Rx_counter = 0;
unsigned char Tx_counter = 0;
unsigned char Tx_data_buf[] = {222,111,100,50,20,10,5,2,1,22};
unsigned char Tx_data;
unsigned char Rx_data_buf[12];
unsigned char Rx_data;
unsigned char UART0_TX_flag = 1;
unsigned char UART0_RX_flag = 1;
unsigned char Type_flag = 4;
//Display
unsigned char number_bai;
unsigned char number_shi;
unsigned char number_ge ;
unsigned char Display_type;
unsigned char Display_value;
unsigned char LED_table[]=
{
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
};
//use for test;
unsigned char m;
//define Interrupt Vactor
#pragma interrupt_handler UART0_TX_INT:21 //外部中断0
#pragma interrupt_handler UART0_RX_INT:19 //外部中断1
#pragma interrupt_handler External_INT_0:2 //外部中断0
#pragma interrupt_handler External_INT_1:3 //外部中断1
#pragma interrupt_handler External_INT_2:4 //外部中断2
//pre_define
void Port_initialize(void);
void INT_initialize(void);
void UART_initialize(void);
void UART0_TX_INT(void);
void UART0_RX_INT(void);
void External_INT_0(void);
void External_INT_1(void);
void External_INT_2(void);
void LED_Display(unsigned char Type,unsigned char Data);
void DATA_to_NUM(unsigned char data);
void Delay(void);
void main(void)
{
unsigned char i;
Port_initialize();
UART_initialize();
INT_initialize();
for (; ; )
{
switch (Type_flag)
{
case 0: //发送的数值
{
Display_type = 0;
Display_value = Tx_data;
}break;
case 1: //发送计数
{
Display_type = 1;
Display_value = Tx_counter;
}break;
case 2: //接收的数值
{
Display_type = 2;
Display_value = Rx_data;
}break;
case 3: //接收计数
{
Display_type = 3;
Display_value = Rx_counter;
}break;
default:
{
Display_type = 0x0f;
}break;
}
LED_Display(Display_type,Display_value); //数码管显示
if (UART0_TX_flag == 0)
{
PORTB = Red_LED_on;
for (i=0;i<10 ;i++ )
{
Delay();
}
UART0_TX_flag = 1;
}
else
{
PORTB = Red_LED_off;
}
if (UART0_RX_flag == 0)
{
PORTB = Green_LED_on;
for (i=0;i<10 ;i++ )
{
Delay();
}
UART0_RX_flag = 1;
}
else
{
PORTB = Green_LED_off;
}
}
}
void Port_initialize(void)
{
DDRA = 0xFF;
DDRB = 0xFF;
DDRD = 0x00;
PORTB = 0xFF;
}
void INT_initialize(void)
{
EICRA = 0xaa; //fall edge trigger
EICRB = 0x00; //no influence
EIMSK = 0x0f;
SEI();
}
void UART_initialize(void)
{
CLI();
UBRR0H = 0x00;
UBRR0L = 0x67; //波特率9600bps
UCSR0A = 0x00;
UCSR0B = 0x98; //11011000接收与发送使能
UCSR0C = 0x26; //00100110帧格式: 8bits,1stop bit,P 校验
SEI();
}
void Delay(void)
{
unsigned int i;
for ( i = 0; i < 6000; i++ )
{
NOP();
}
}
void UART0_TX_INT(void)
{
UART0_TX_flag = 0;
if (Tx_counter<10)
{
Tx_counter += 1;
}
else
{
Tx_counter = 1;
}
Tx_data = Tx_data_buf[Tx_counter-1];
UDR0 = Tx_data; //data to transmit
UCSR0B &=0xbf ; //1011 1111关闭发送中断
while ( !( UCSR0A & (1<<UDRE0)) ) //等待发送缓冲区空
{
}
UCSR0B |= 0x80;
}
void UART0_RX_INT(void)
{
Rx_data = UDR0;
UART0_RX_flag = 0;
if (Rx_counter < 10)
{
Rx_counter += 1;
}
else
{
Rx_counter = 1;
}
Rx_data_buf[Rx_counter - 1] = Rx_data;
PORTB = Green_LED_on;
}
void External_INT_0(void)
{
UCSR0B |= 0x40;
UCSR0B &= ~(0x80);
}
void External_INT_1(void)
{
if (Type_flag < 4 )
{
Type_flag += 1;
}
else
{
Type_flag = 0;
}
}
void External_INT_2(void)
{
if(m < 12)
{
m += 1;
}
else
{
m = 1;
}
Display_type = 0x0f;
Display_value = Rx_data_buf[m-1];
}
void LED_Display(unsigned char Type,unsigned char Data)
{
DATA_to_NUM(Data);
PORTA = LED_table[number_ge];
PORTB = (PORTB|0xf0)&0x7F;
Delay();
PORTA = LED_table[number_shi];
PORTB = (PORTB|0xf0)&0xBF;
Delay();
PORTA = LED_table[number_bai];
PORTB = (PORTB|0xf0)&0xDF;
Delay();
PORTA = LED_table[Type];
PORTB = (PORTB|0xf0)&0xEF;
Delay();
}
void DATA_to_NUM(unsigned char data)
{
number_bai = data/100;
number_shi = (data%100)/10;
number_ge = (data%100)%10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -