打印

请教12864的问题

[复制链接]
831|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiqh1976|  楼主 | 2017-9-17 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
显示汉字乱码的,找不到原因了,代码如下
#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();

        }

}

相关帖子

沙发
jiqh1976|  楼主 | 2017-9-17 11:20 | 只看该作者
如果把显示的字改成英文就可以的正常显示

使用特权

评论回复
板凳
changle11sdo5| | 2017-9-17 18:05 | 只看该作者
要么12864不带中文字库,要么删除“三”字就可以

使用特权

评论回复
地板
jiqh1976|  楼主 | 2017-9-17 19:50 | 只看该作者
带中文字库的,哪个三字,编译成功的

使用特权

评论回复
5
xyz549040622| | 2017-9-17 20:17 | 只看该作者
jiqh1976 发表于 2017-9-17 19:50
带中文字库的,哪个三字,编译成功的

汉字的底层处理的问题,还有就是和有的汉字的区位码有关了。

使用特权

评论回复
6
NE5532| | 2017-9-17 22:47 | 只看该作者
呵呵,你的“”能显示么?这个是当中文还是当英文?中文只能在偶数位置开始显示,是这个问题不?并且建议找不到问题,就直接送GBK码过去,必要在程序里写汉字,这样自己都不知道编译器是怎么编译的。

使用特权

评论回复
7
czdpj| | 2017-9-19 15:13 | 只看该作者
AVR太烦了,不如STC方便。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

33

帖子

1

粉丝