#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”,变量和寄存器如图: 实在不知道是怎么回事。。球问各位大师呀。。
您需要 登录 才可以下载或查看,没有账号?注册
收藏0 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
等级类勋章
发帖类勋章
时间类勋章
6
8
3
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号