完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这几天在做LCD显示实验,仿真运行时,只显示左半屏或者只显示右半屏时,仿真没问题,可是屏幕需要同时显示左右半屏时,仿真时显示屏就会出现问题,显示屏最左边和最右边没问题,就是中间那部分出现乱码,而且有些乱码出现在其它页(未出现在预先设定的页上),仿真时LCD选用的是LGM12641BS1R,下面是部分代码:
uchar checkbusy() { lcdport=0xff; RW=1; DI=0; E=1; E=0; return BUSYSTATUS; } void WriteCMD(uchar uCMD) { while(checkbusy()); lcdport=0xff; RW=0; DI=0; lcdport=uCMD; E=1; E=0; } void WriteData(uchar uDAT) { while(checkbusy()); lcdport=0xff; RW=0; DI=1; lcdport=uDAT; E=1; E=0; } void DspOn() { CS1=1; CS2=1; WriteCMD(0x3f); } void ClearLCD() { WriteCMD(0x01); } void SetStartLine(uchar urow) //设置显示起始行 { WriteCMD(LCDSTARTROW+urow); } void SetPage(uchar upage) { WriteCMD(LCDPAGE+upage); } void SetColumn(uchar ucusor) { WriteCMD(LCDLINE+ucusor); } void Dsp(uchar p[16],uchar q) { uchar count,b[16]; if(q==1) { CS1=1; CS2=0; for(count=0;count<16;count++) { b[count]=*(p+count); WriteData(b[count]); } } else { CS1=0; CS2=1; for(count=0;count<16;count++) { b[count]=*(p+count); WriteData(b[count]); } } } void main() { E=1; DspOn(); ClearLCD(); while(1) { uchar i; SetStartLine(0); //设置从第0行开始显示 re_input: for(i=0;i<4;i++) { SetPage(0); //设置从第0页显示 SetColumn(i<<4); //显示一次,显示列位置向右移动16个单元 Dsp(QING_SHU_1[i],1); //输入“你好! 请”上半部分 Dsp(QING_SHU_1[i+4],2); //输入“输入密码”上半部分 delay(200); SetPage(1); SetColumn(i<<4); Dsp(QING_SHU_2[i],1); //输入“你好! 请”下半部分 通过CS1,CS2控制 Dsp(QING_SHU_2[i+4],2); //输入“输入密码”下半部分 通过CS1,CS2控制 delay(200); } for(i=0;i<4;i++) { SetPage(6); SetColumn(i<<4); Dsp(QING_CHU_1[i],1); //显示“‘C’清除“的上半部分 Dsp(QING_CHU_1[i+4],2); //显示”‘=’确认“的上半部分 delay(200); SetPage(7); SetColumn(i<<4); Dsp(QING_CHU_2[i],1); //显示“‘C’清除“的下半部分 Dsp(QING_CHU_2[i+4],2); //显示”‘=’确认“的上半部分 delay(200); } } 请问这是什么原因,与所选LCD器件有关还是程序有问题? 谢谢光临! |
|
相关推荐
2个回答
|
|
|
|
|
|
可以参考下面的程序,摘自http://read.pudn.com/downloads112/sourcecode/embed/467206/LGM12641BS1R.c__.htm
/******************************************************************************/ /** /** 模 块 名: -------------------LCD_Graph.C--------------------------------- /** -----------------图形液晶显示模块----------------------------*/ /** 功能描述: /** /** 创 建 人: huangtiexiong 日期:2006-11-28 */ /** 修 改 人: 日期:2006-11-28 */ /** 其他说明: 驱动芯片KS0108或兼容芯; /******************************************************************************/ //#include "Includes.h" //文件包含 /************************************************* 模块级变量申明 *************************************************/ static void LCD_SetX(int8u pageX); static void LCD_SetY(int8u colY); //static int8u LCD_ReadStatus(void); static void LCD_WriteCmd(int8u cmd); static void LCD_WriteDat(int8u dat); static void LCD_SetStartRow(int8u startRow); /************************************************* 子函数定义 *************************************************/ /******************************************************************************* *** 函 数 名: static void LCD_SetX(int8u pageX) *** 功能描述: 设置页面地址; *** 全局变量: NO ! *** 输 入: pageX; *** 输 出: NO !****/ static void LCD_SetX(int8u pageX) { pageX %= 8; LCD_WriteCmd(pageX | 0xb8); } static void LCD_SetY(int8u colY) { colY %= 64; LCD_WriteCmd(colY | 0x40); } //static int8u LCD_ReadStatus(void) //{ // int8u tmp; // LCD_EN = 0;// LCD_DATA = 0xff;// NOP(); // LCD_EN = 1;// LCD_RS = 0;// LCD_RW = 1; // tmp = LCD_DATA;// LCD_EN = 0;// return tmp; // } static void LCD_WriteCmd(int8u cmd) { // while(1) // { // if(!(LCD_ReadStatus() & 0x80)) break; // } LCD_EN = 1; LCD_RS = 0; LCD_RW = 0; LCD_DATA = cmd; NOP(); LCD_EN = 0; } static void LCD_WriteDat(int8u dat) { // while(1) // { // if(!(LCD_ReadStatus() & 0x80)) break; // } LCD_EN = 1; LCD_RS = 1; LCD_RW = 0; LCD_DATA = dat; NOP(); LCD_EN = 0; } static void LCD_SetStartRow(int8u startRow) { LCD_WriteCmd(startRow | 0xc0); } extern void LCD_Init(void) { LCD_RST = 0; Delay_Xus(100); LCD_RST = 1; Delay_Xms(100); // while(1) //是否上电复位完毕; // { // if(!(LCD_ReadStatus() & 0x10)) break; // } LCD_EN = 0; LCD_CS1 = 1; LCD_CS2 = 1; LCD_WriteCmd(0x3f); //开显示,指令码:0x3f; LCD_Clear(); //清屏; LCD_SetStartRow(0x00); } extern void LCD_Clear(void) { int8u i,j; for(i=0;i<8;i++){ LCD_SetX(i); //设置页地址; for(j=0;j<64;j++){LCD_WriteDat(0x00);} //显示RAM清零; }} extern void LCD_Display(int8u x,int8u y,int8u *disp_dat) { int8u i;int8u j; LCD_SetX(x);LCD_SetY(y); for(j=0;j<8;j++) {for(i=0;i<128;i++){ if(i>=64){LCD_CS1 = 1; LCD_CS2 = 0;} else {LCD_CS1 = 0; LCD_CS2 = 1;} LCD_SetX(j); LCD_SetY(i%64); LCD_WriteDat(disp_dat[j*128+i]); }}} /******************************************************************************* **** End Of File *******************************************************************************/ |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
277 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
368 浏览 0 评论
766 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
592 浏览 0 评论
879 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12037 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 04:29 , Processed in 0.595561 second(s), Total 71, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号