LCD12864显示乱码是什么原因

LCD12864显示乱码是什么原因,第1张

LCD12864, 有两种,一种是带字库的,另一种是不带字库的。

不带字库的,要自己用取模软件取出汉字点阵数据,然后编程才能显示汉字的。

还有,汉字取模方式有多种,如果方式不对,显示就是乱码。

买显示屏一般都会给演示程序,但却很少说明取模方式,那只好自己用取模软件试验了。如果能看懂显示程序,就会知道是什么取模方式了。

附属的程序可以复制到主程序的文件中

也可以把12864的驱动程序单独编一个源文件(c文件),添加到工程中

并用一个头文件(主要声明函数和变量)引导,主文件中包含头文件即可,编译链接不用你介入,都有是编译器的事

如我用STC12C单片机和液晶屏时:

#include<STC12C54H>

#include<EEPROMH>

#include<YEJING1602H>

把液晶屏 *** 作函数和EEPROM *** 作函数都单独制成源文件,用时在主文件中包含其头文件即可,头文件示例如下:

#ifndef __YEJING1602_H__

#define __YEJING1602_H__

#define uchar unsigned char

#define uint unsigned int

void write_com(uchar com);//液晶屏写命令

void write_date(uchar date);//液晶屏写数据

void init2();//液晶屏初始化

void Delay1ms(uint i);//延时

#endif

都是些子程序的声明,子程序的实体在源文件中

#include "reg52h"

#include "intrinsh"

sbit io_LCD12864_RS = P1^0 ;

sbit io_LCD12864_RW = P1^1 ;

sbit io_LCD12864_EN = P1^2 ;

#define io_LCD12864_DATAPORT P0

#define SET_DATA io_LCD12864_RS = 1 ;

#define SET_INC io_LCD12864_RS = 0 ;

#define SET_READ io_LCD12864_RW = 1 ;

#define SET_WRITE io_LCD12864_RW = 0 ;

#define SET_EN io_LCD12864_EN = 1 ;

#define CLR_EN io_LCD12864_EN = 0 ;

void v_Lcd12864CheckBusy_f( void ) //忙检测函数

{

unsigned int nTimeOut = 0 ;

SET_INC

SET_READ

CLR_EN

SET_EN

while( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ;

CLR_EN

SET_INC

SET_READ

}

void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令

{

v_Lcd12864CheckBusy_f() ;

SET_INC

SET_WRITE

CLR_EN

io_LCD12864_DATAPORT = byCmd ;

_nop_();

_nop_();

SET_EN

_nop_();

_nop_();

CLR_EN

SET_READ

SET_INC

}

void v_Lcd12864SendData_f( unsigned char byData ) //发送数据

{

v_Lcd12864CheckBusy_f() ;

SET_DATA

SET_WRITE

CLR_EN

io_LCD12864_DATAPORT = byData ;

_nop_();

_nop_();

SET_EN

_nop_();

_nop_();

CLR_EN

SET_READ

SET_INC

}

void v_DelayMs_f( unsigned int nDelay ) //延时

{

unsigned int i ;

for( ; nDelay > 0 ; nDelay-- )

{

for( i = 125 ; i > 0 ; i-- ) ;

}

}

void v_Lcd12864Init_f( void ) //初始化

{

v_Lcd12864SendCmd_f( 0x30 ) ; //基本指令集

v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x01 ) ; //清屏

v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x06 ) ; //光标右移

v_DelayMs_f( 50 ) ;

v_Lcd12864SendCmd_f( 0x0c ) ; //开显示

}

void v_Lcd12864SetAddress_f( unsigned char x, y ) //地址转换

{

unsigned char byAddress ;

switch( y )

{

case 0 : byAddress = 0x80 + x ;

break;

case 1 : byAddress = 0x90 + x ;

break ;

case 2 : byAddress = 0x88 + x ;

break ;

case 3 : byAddress = 0x98 + x ;

break ;

default :

break ;

}

v_Lcd12864SendCmd_f( byAddress ) ;

}

void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char pData )

{

v_Lcd12864SetAddress_f( x, y ) ;

while( pData != '\0' )

{

v_Lcd12864SendData_f( pData++ ) ;

}

}

void main( void )

{

v_Lcd12864Init_f() ;

v_Lcd12864PutString_f( 0,0, "快乐随行") ;

v_Lcd12864PutString_f( 2,1, "分都不给") ;

v_Lcd12864PutString_f( 0,2, "LCD12864ST7920") ;

v_Lcd12864PutString_f( 0,3, "辛苦回答了半天") ;

while( 1 ) ;

}

首先,你要确定LCD12864的电源是5V的,还是33V。你用在51单片机上正常显示,说明12864是5Ⅴ的,而你用STM32上时,LCD的正极接33V,是给LCD加33V的电源,那是不能工作的。

但是,给LCD加5V电源,与STM32引脚连接后,加到STM32引脚上有5V电压,这是不行的。

所以,STM32要配33V的液晶屏,重买一个吧。这个5V只能配51单片机了。

你设计的程序有问题:

1:每次执行while(1)时,v都会被重新定义一次,这样很不好,应该将变量定义放到while(1)外面。

2:case里面的 while(v==0x) v=keyscan();有问题,例如第一个case里面的while(v==0x41) v=keyscan(); ,你的意思是按一次键就加1,防止被加多次,但是你这个while语句退出的条件是下一个按键必须与当前按键不同,这与现实情况相符吗?主队不能连续得分吗?这个你自己考虑一下,也许你设置的比赛规则是这样的。

3:还是 while(v==0x) v=keyscan();这句,你的意思就是case语句退出的条件是检测到下一个按键必须与当前按键不同,但是你的while(1)循环第一句也是扫面键盘,这样就有可能出错。

建议你如下修改:

1:v的定义放到while(1)外面。

2:删除每一个case语句中的while(v==0x) v=keyscan();,在执行完case语句后,将v的值赋成0x00,或者一个不可能的键盘值即可,然后直接退出case语句。

case 0x41:

{

hpoint++; //主队加分

point_lcd(0x00,hpoint);

v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。

} //分数显示更新

break;

case 0x81:

{

hpoint--;

point_lcd(0x00,hpoint);

v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。

}

break;

case 0x12:

{

rpoint++; //客队加分

point_lcd(0x03,rpoint); //分数显示更新

v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。

}

break;

case 0x22:

{

rpoint--;

point_lcd(0x03,rpoint);

v = 0x00; 把v的值置成一个初值或者一个不可能的键盘值。

}

break;

以上就是关于LCD12864显示乱码是什么原因全部的内容,包括:LCD12864显示乱码是什么原因、51单片机实验,如何让LCD12864显示字符程序如何下载到单片机里面呢主要是Keil使用问题、跪求单片机C语言,主芯片为AT89C51,在LCD12864液晶显示中显示“快乐随行”四个字的程序怎么编等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9344765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存