程序是挺大众的USART0的通信程序,片子是128。串口线是好用的。通信的时候用串口调试助手给板子发数据,用仿真器看UDR0的值一直为0,奇怪的是temp还会显示一个数(错误的),最后在1602上显示错误。程序如下:
#define uchar unsigned char
#define uint unsigned int
#define UDRE 5
#define RXC 7
//+++++++++1602_LCD功能引脚宏定义+++++++++++++++
#define LCD_DATA PORTB
#define LCD_RS PORTA_Bit4
#define LCD_RW PORTA_Bit5
#define LCD_EN PORTA_Bit6
//+++++++++++++++++通讯引脚宏定义++++++++++++++++++
#define TXDIN DDRD=DDRD|0x02 // TXD 设置为输出
#define RXDIN DDRD=DDRD&0xFE;PORTD=PORTD|0x01 // RXD 设置为输入,且内部上拉有效
void LCD_init();
void write_com(uchar com);
void write_data(uchar data);
void delay(uint z);
/***************************************/
void port_init(void)//I/O口初始化
{
PORTA = 0xFF;
DDRA = 0xff;
PORTB = 0xFF;
DDRB = 0xFF;
TXDIN; // TXD 设置为输出
RXDIN; // RXD 设置为输入,且内部上拉有效
//PORTD = 0xFF;
//DDRD = 0x02;
}
/**************************************/
void uart0_init(void) //uart 初始化
{
UCSR0B = 0x00;
UCSR0A = 0x00;
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//异步模式(默认) 无校验位 一位停止位 接收数据长度为8
//UCSR0C = 0x06;//异步模式(默认) 无校验位 一位停止位 接收数据长度为8
UBRR0L = 51; //波特率为 9600
UBRR0H = 0x00;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);//接收允许 发送允许
//UCSR0B = 0x18;
}
void init_devices(void)
{
__disable_interrupt();
port_init();
uart0_init();
}
/********************************/
void uart0_send(unsigned char i)//数据发送
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=i;
}
/************************************************/
unsigned char uart0_receive(void) //数据接收
{
while(!(UCSR0A&(1<<RXC0)));
return UDR0;
}
/******************************************/
void main(void)
{
unsigned char temp=0;
delay(50);
init_devices();
LCD_init();
while(1)
{
temp=uart0_receive(); //接收数据
write_com(0x80+0x06);
write_data(temp); //1602液晶显示
uart0_send(temp);//数据发送
}
}
void LCD_init()
{
LCD_RW=0;
LCD_EN=0;
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
write_com(0x80);
}
void write_com(uchar com)
{
LCD_RS=0; //选择写命令模式
LCD_DATA=com; //将要写的命令送到数据总线上
delay(5); //稍作延时以待数据稳定
LCD_EN=1; //时能端给以高脉冲,因为初始化函数中已经将lcden置0
delay(5); //稍作延时
LCD_EN=0; //将使能端置0已完成高脉冲
LCD_RS=1;
}
void write_data(uchar data)
{
LCD_RS=1;
LCD_DATA=data;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
LCD_RS=0;
}
void delay(uint z) //晶振8M
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<1141;y++);
}
用串口调试助手往里发数字“1”,变量和寄存器如图:
实在不知道是怎么回事。。球问各位大师呀。。
|