显示汉字乱码的,找不到原因了,代码如下
#define F_CPU 8000000UL
#include <avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#include<avr/eeprom.h>
#include<avr/pgmspace.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define RS_CLR PORTG &= ~(1<<2) //指令操作
#define RS_SET PORTG |= (1<<2) //数据操作
#define RW_CLR PORTG &= ~(1<<3) //写操作
#define RW_SET PORTG|= (1<<3)//读操作
#define E_CLR PORTG &=~(1<<4) //使能操作
#define E_SET PORTG|= (1<<4) //禁止操作
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
#define FUN_MODE 0x30 //工作模式:8位
#define DISPLAY_ON 0x0c //显示开,游标关
#define DISPLAY_OFF 0x08 //显示关
#define wei_zhi 0x02 //位址归位
#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
PROGMEM const uchar flash[]="danpianji";
// 端口初始化函数
void port_init()
{
//数据端口
PORTD= 0xFF;
DDRD = 0xFF;
//控制端口
PORTG|=(1<<1); //8位并口方式
DDRG= 0xFF;
}
// 忙检测函数
void Check_Busy()
{
DDRD = 0x00; //PD口置为输入口,准备读取数据
RS_CLR;
RW_SET;
E_SET;
while(0x80 & PIND); //监测忙信号,直到忙信号为0,才能进行读写操作
E_CLR;
DDRD = 0xFF; //PB口置为输出口,准备向端口发送数据
}
// 写命令函数
void LCD_write_com ( uchar com )
{
Check_Busy();
RS_CLR;
RW_CLR;
E_SET;
PORTD = com;
_delay_ms(5);
E_CLR;
}
// 写数据函数
void LCD_write_data(uchar data)
{
Check_Busy();
RS_SET;
RW_CLR;
E_SET;
PORTD = data;
_delay_ms(5);
E_CLR;
}
// 清屏函数
void LCD_clear()
{
LCD_write_com( 0x01 );
_delay_ms(5);
}
// 显示字库函数
void DisplayCgrom(char addr , char *content)
{
Check_Busy();
LCD_write_com(addr);
Check_Busy();
while( *content )
{
LCD_write_data( *content );
content++;
_delay_ms(5);
Check_Busy();
}
}
// 要显示的内容函数
void LCD_Display()
{
DisplayCgrom(0x80,"第一");
DisplayCgrom(0x88,"第三");
DisplayCgrom(0x90,"第二");
DisplayCgrom(0x98,"第四");
}
// LCD初始化函数
void LCD_init()
{
DDRD = 0xFF;
DDRG=0XFF;
LCD_write_com( FUN_MODE ); //显示模式设置
_delay_ms( 5 );
// LCD_write_com( FUN_MODE ); //显示模式设置
_delay_ms( 5 );
LCD_write_com( DISPLAY_ON ); //显示开
_delay_ms(5);
LCD_write_com( wei_zhi ); //位址归位
_delay_ms(5);
LCD_write_com( CLEAR_SCREEN ); //清屏
_delay_ms(20);
}
// 主函数
int main (void)
{
port_init();
_delay_ms(100);//显示模式设置前延时>40ms
LCD_init();
LCD_clear();
_delay_ms(5);
while(1)
{
LCD_Display();
}
}
|