汉字出来了,终于找到原因了,原来是缺少必要的延时程序!我就记得这种带字库的液晶显示器操作没那么麻烦的(不带字库的会麻烦一点),这次我以为程序里面已经有了判断液晶是否忙碌的操作,就不再需要额外延时程序了,没想到还是需要(液晶显示器在处理每条MCU指令、数据时都需要必要的时间,常规操作72us左右)。
/******* 12864液晶及相关显示操作 *******/
//底层驱动函数
//写入一字节指令/数据
/***********************************************************
函数名: lcd_w_char()
功 能: 向12864液晶写入一字节指令/数据
参 数: cd --- 写入指令/数据选择标志(0=指令,1=数据)
cdata --- 写入指令/数据内容
返回值: 无
/**********************************************************/
void lcd_w_char(uchar cd, uchar cdata)
{
if(cd == 0) //选择写入"指令"
{
PD_ODR &= (~0x04); //RS=0,选择写"指令"
}
if(cd == 1) //选择写入"数据"
{
PD_ODR |= 0x04; //RS=1,选择写"数据"
}
PD_ODR &= (~0x08); //RW=0,选择"写"操作
PG_ODR = cdata; //加载指令/数据内容
PD_ODR |= 0x10; //E=1,开始写入指令/数据
delay_us(1); //延时,等待液晶端口读入指令/数据内容
PD_ODR &= (~0x10); //E=0,写入完成
}
//写入一串字符数据
/***********************************************************
函数名: lcd_w_word()
功 能: 向12864液晶写入一串字符数据(最长64字符: 8个汉字或16个数字/英文字符)
(注: ST7920主控IC的12864液晶内部已集成汉字库,程序可直接写入汉字字符)
参 数: str --- 字符串内容
返回值: 无
***********************************************************/
void lcd_w_word(uchar *str)
{
while(*str != '\0') //字符串未结束
{
lcd_w_char(1,*str++); //写入每个字符串数据内容
delay_us(80); //延时,等待液晶操作完成(注: 此处必须延时)
}
*str = 0;
}
//初始化函数
/***********************************************************
函数名: Lcd_Init()
功 能: 12864液晶初始化
参 数: 无
返回值: 无
/**********************************************************/
void Lcd_Init(void)
{
lcd_w_char(0,0x30); //写入指令,选择8位界面,基本指令集,绘图显示关
delay_us(80); //液晶处理指令时间72us
lcd_w_char(0,0x0c); //显示开,光标关闭
delay_us(80); //液晶处理指令时间72us
lcd_w_char(0,0x01); //清屏
delay_ms(5); //液晶处理指令时间4.6ms
}
//主函数
void main()
{
Clk_Init(); //系统时钟初始化
Port_Init(); //端口初始化
Lcd_Init(); //12864液晶初始化
lcd_w_char(0,0x80); //设置液晶显示开始地址
delay_us(80);
lcd_w_char(1,0x04+0x30);
delay_us(80);
lcd_w_char(1,0x05+0x30);
delay_us(80);
lcd_w_word("你好!");
delay_us(80);
while(1)
{
}
}
|