共2条
1/1 1 跳转至页
12232C,16 12232C液晶现实,前16列乱码.....
问
/*=====================================================================
HY-12232C9显示驱动程序
于2006年十一黄金周期间创作于天津
编译环境为KEILC UV2. MCU-AT89C52
参考www.21ic.com论坛上众多高手作品
======================================================================
HY-12232C9引脚说明
1--GND:
2--VCC:
3--GND:
4--RS: 为H,表示D0-D7为数据
为L,表示D0-D7为指令
5--E1: 读写使能信号(master).
6--E2: 读写使能信号(slaver).
7--R/W: 读写选择信号。
为H,读数据。
为L,写数据。
8--DB0:
. .
. .
15--DB7:
16--RST: 复位信号,上升沿复位,
复位后电平保持为高.
17--LEDA:接LCD外接驱动电源:0-+5V
或0--5V.这里接+5V。
-----------------------------------------------------------------------
接线说明
|DB0----P1.0| |DB1----P1.1| |DB2----P1.2|
|DB3----P1.3| |DB4----P1.4| |DB5----P1.5|
|DB6----P1.6| |DB7----P1.7| |RS ----P2.6|
|E1 ----P2.5| |E2 ----P2.4| |R_W----P2.3|
|RST----P2.2| |LEDA---VCC |
=====================================================================*/
#include <reg52.h>
#include <intrins.h>
//---------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned char
sbit RS = P2^6;
sbit E1 = P2^5;
sbit E2 = P2^4;
sbit R_W = P2^3;
sbit RST = P2^2;
sbit led = P2^7; //外接指示灯,用于测试?
//---------------------------------------------------------------------
void delay(uint i); // 函数声明
//---------------------------------------------------------------------
void wr_m_i(uchar i) // 写指令到master.
{
do // 判忙
{
E1=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E1=0;RS=0;R_W=0;P1=i;E1=1;
_nop_();_nop_();
E1=0;
}
void wr_m_d(uchar i) // 写数据到master.
{
do // 判忙
{
E1=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E1=0;RS=1;R_W=0;P1=i;E1=1;
_nop_();_nop_();
E1=0;
}
//---------------------------------------------------------------------
void wr_s_i(uchar i) // 写指令到slaver.
{
do // 判忙
{
E2=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E2=0;RS=0;R_W=0;P1=i;E2=1;
_nop_();_nop_();
E2=0;
}
void wr_s_d(uchar i) // 写数据到slaver.
{
do
{
E2=0;RS=0;R_W=1;E2=1; // 判忙
}while(P1&0x80);
E2=0;RS=1;R_W=0;P1=i;
E2=1;
_nop_();_nop_();
E1=0;
}
//----------------------------------------------------------------
void lcd_display(void) // 显示测试程序:左半屏为数据全
{uchar page,line,i; // 为0F.右半屏全为F0.
for(page=0;page<4;page++)
/*-----------------------------------------------------------------
{wr_m_i(0xb8|page);wr_s_i(0xb8|page);
wr_m_i(0x00);wr_s_i(0x00); // 此部分程序为最初写的.显示不
for(line=0;line<64;line++) // 正常.右半屏乱码
{ // 后改为下边程序;每一页先写左
wr_m_d(0x0f); // 半屏,再写右半屏后,正常.
wr_s_d(0xf0);
}
}
------------------------------------------------------------------*/
{wr_m_i(0xb8|page);wr_s_i(0xb8|page);
wr_m_i(0x00);wr_s_i(0x00);
for(line=0;line<61;line++)wr_m_d(0x0f);
for(line=0;line<61;line++)wr_s_d(0xf0);
}
for(i=0;i<100;i++)delay(50);
led=~led;
}
//---------------------------------------------------------------------
void delay(uint i) // 延时子函数.
{
uint j;
for(j=0;j<i;j++);
}
//---------------------------------------------------------------------
void clr_ram(void) // 清屏函数.
{
uchar page,line;
for(page=0;page<4;page++)
{wr_m_i(0xb8|page);wr_s_i(0xb8|page);
wr_m_i(0x00);wr_s_i(0x00);
for(line=0;line<61;line++)wr_m_d(0x00);
for(line=0;line<61;line++)wr_s_d(0x00);
}
}
//---------------------------------------------------------------------
void lcd_init(void) // 液晶模块初始化
{delay(100);
RST=0; // 调试程序时偶然发现在RST=0;RST=1之
RST=1; // 间如果加入多个NOP后(足够多,10Q多
// 个),不显示.WHY????????
wr_m_i(0xaf);
wr_s_i(0xaf);
wr_m_i(0xc0);
wr_s_i(0xc0);
wr_m_i(0xa4);
wr_s_i(0xa4);
wr_m_i(0x00);
wr_s_i(0x00);
wr_m_i(0xa9);
wr_s_i(0xa9);
wr_m_i(0xa0);
wr_s_i(0xa0);
wr_m_i(0xba);
wr_s_i(0xba);
wr_m_d(0x0f);
wr_s_d(0x0f);
}
//---------------------------------------------------------------------
char rd_m_d(void) // 从master读RAM数据.
{char i;
do
{
E1=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E1=0;RS=1;R_W=1;E1=1;
_nop_();_nop_();
i=P1;
return(i);
}
//---------------------------------------------------------------------
void mov_ram(void) // 从master第一页中取出几列数据送slaver
{ // 用于测试目的.
uchar i,buff[8];
wr_m_i(0xb8|0);wr_m_i(0x00); // 第一页的第一列开始
for(i=0;i<4;i++)buff[i]=rd_m_d();
wr_s_i(0xb8|0);wr_s_i(0x03);
for(i=0;i<4;i++)wr_s_d(buff[i]);
}
//---------------------------------------------------------------------
void test_prog(void) // 测试程序. 分别在master\slaver的第一页
{ // 的前几列写数据.
char i;
wr_m_i(0xb8|0); // ????此处很奇怪,见下边陈述
wr_m_i(0xb8|0);
_nop_();
wr_m_i(0x00);
for(i=0;i<4;i++)wr_m_d(0xaa); // ????此处显示也很奇怪
wr_s_i(0xb8|0);wr_s_i(0x02);
for(i=0;i<4;i++)wr_s_d(0x55);
}
//---------------------------------------------------------------------
void main(void)
{
lcd_init();
lcd_display();
clr_ram();
lcd_display();
// mov_ram;
test_prog();
for(;;);
}
1.开始只写了左边,右边没有处理(没有在初始化程序中写slaver的工作方式,也没有对RAM做任何操作.)对左边的RAM清零后,只写一次.
但是,左边的前16列是乱码,反复上电,偶尔能正常显示....这时右半边没有显示.
上电先后延时一段时间后在复位液晶模块,不行.
后来又改为上边所帖程序(反复写RAM),不行.
小弟没有调试经验,刚刚开始写程序,所以到这里没有办法了...
2.把所有的对左半边的操作,均改为右边边.现象一样.左边没有显示.
3.在初始化程序中加上对左边的操作,对左右两边都清零,都写RAM.如所帖程序.
左边前16列乱码,但是右边都是乱码!!!!!!!
4分别注释掉led_display中的wr_m_d,wr_s_d后,乱码,但现象还不同.
答 1: 个人见解1 读忙状态前应该浮置总线,否则依LZ的程序没有超时判断,很容易造成死机
P1 = 0xFF;
do { E2=0; RS=0; R_W=1; E2=1; }while(P1&0x80);
2 写数据或命令,在写信号沿之前,应该有一段稳定时间,检查时间是否足够
P1=i; E2=1; _nop_(); _nop_(); E2=0;
是不是应该改为
P1=i; _nop_();_nop_(); E2=1; E2=0;
3 LCD控制器是否有超时要求,如果在读写时超时是否会出现乱码,可考虑加入关中断的操作,
EA=0; P1=i; _nop_();_nop_(); E2=1; E2=0; EA=1;
答 2: 10.5日调试进展昨天乱码现象今天有所改观.但想不明白为什么??
把lcd_display()改为先写每一页左半屏,再写每一页右半屏后,昨天的3和4现象消失,但左右半屏的前面十几列都是乱码.
在模块初始化中,改为从左到右显示后,1和2现象消失.为什么跟现实方式还有关系??
但今天又出现问题:
1,在test_prog()中,把左半屏的第一页的前4列写数据AA,把右半屏第一页的第3列开始的4列写55.
但显示情况是:左半屏第一页前4列显示数据为AA.右半屏的第一页的3\4\5列显示数据为55,少的一列在左半屏的第5列........
如果只写右半屏的话,那么右边还是少一列,但是左边没有显示.......
2,加上test_prog()测试后,反复上电,左半屏的几列有时在第四页显示.
后在加一个写页地址子程序wr_m_i(0xb8|0),显示正常.WHY??不明白
答 3: 谢谢zg17903别的都显示正常了,读忙应该没有问题了吧.
回去再试试. 答 4: 还是喜欢串行接法,用SPI
HY-12232C9显示驱动程序
于2006年十一黄金周期间创作于天津
编译环境为KEILC UV2. MCU-AT89C52
参考www.21ic.com论坛上众多高手作品
======================================================================
HY-12232C9引脚说明
1--GND:
2--VCC:
3--GND:
4--RS: 为H,表示D0-D7为数据
为L,表示D0-D7为指令
5--E1: 读写使能信号(master).
6--E2: 读写使能信号(slaver).
7--R/W: 读写选择信号。
为H,读数据。
为L,写数据。
8--DB0:
. .
. .
15--DB7:
16--RST: 复位信号,上升沿复位,
复位后电平保持为高.
17--LEDA:接LCD外接驱动电源:0-+5V
或0--5V.这里接+5V。
-----------------------------------------------------------------------
接线说明
|DB0----P1.0| |DB1----P1.1| |DB2----P1.2|
|DB3----P1.3| |DB4----P1.4| |DB5----P1.5|
|DB6----P1.6| |DB7----P1.7| |RS ----P2.6|
|E1 ----P2.5| |E2 ----P2.4| |R_W----P2.3|
|RST----P2.2| |LEDA---VCC |
=====================================================================*/
#include <reg52.h>
#include <intrins.h>
//---------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned char
sbit RS = P2^6;
sbit E1 = P2^5;
sbit E2 = P2^4;
sbit R_W = P2^3;
sbit RST = P2^2;
sbit led = P2^7; //外接指示灯,用于测试?
//---------------------------------------------------------------------
void delay(uint i); // 函数声明
//---------------------------------------------------------------------
void wr_m_i(uchar i) // 写指令到master.
{
do // 判忙
{
E1=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E1=0;RS=0;R_W=0;P1=i;E1=1;
_nop_();_nop_();
E1=0;
}
void wr_m_d(uchar i) // 写数据到master.
{
do // 判忙
{
E1=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E1=0;RS=1;R_W=0;P1=i;E1=1;
_nop_();_nop_();
E1=0;
}
//---------------------------------------------------------------------
void wr_s_i(uchar i) // 写指令到slaver.
{
do // 判忙
{
E2=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E2=0;RS=0;R_W=0;P1=i;E2=1;
_nop_();_nop_();
E2=0;
}
void wr_s_d(uchar i) // 写数据到slaver.
{
do
{
E2=0;RS=0;R_W=1;E2=1; // 判忙
}while(P1&0x80);
E2=0;RS=1;R_W=0;P1=i;
E2=1;
_nop_();_nop_();
E1=0;
}
//----------------------------------------------------------------
void lcd_display(void) // 显示测试程序:左半屏为数据全
{uchar page,line,i; // 为0F.右半屏全为F0.
for(page=0;page<4;page++)
/*-----------------------------------------------------------------
{wr_m_i(0xb8|page);wr_s_i(0xb8|page);
wr_m_i(0x00);wr_s_i(0x00); // 此部分程序为最初写的.显示不
for(line=0;line<64;line++) // 正常.右半屏乱码
{ // 后改为下边程序;每一页先写左
wr_m_d(0x0f); // 半屏,再写右半屏后,正常.
wr_s_d(0xf0);
}
}
------------------------------------------------------------------*/
{wr_m_i(0xb8|page);wr_s_i(0xb8|page);
wr_m_i(0x00);wr_s_i(0x00);
for(line=0;line<61;line++)wr_m_d(0x0f);
for(line=0;line<61;line++)wr_s_d(0xf0);
}
for(i=0;i<100;i++)delay(50);
led=~led;
}
//---------------------------------------------------------------------
void delay(uint i) // 延时子函数.
{
uint j;
for(j=0;j<i;j++);
}
//---------------------------------------------------------------------
void clr_ram(void) // 清屏函数.
{
uchar page,line;
for(page=0;page<4;page++)
{wr_m_i(0xb8|page);wr_s_i(0xb8|page);
wr_m_i(0x00);wr_s_i(0x00);
for(line=0;line<61;line++)wr_m_d(0x00);
for(line=0;line<61;line++)wr_s_d(0x00);
}
}
//---------------------------------------------------------------------
void lcd_init(void) // 液晶模块初始化
{delay(100);
RST=0; // 调试程序时偶然发现在RST=0;RST=1之
RST=1; // 间如果加入多个NOP后(足够多,10Q多
// 个),不显示.WHY????????
wr_m_i(0xaf);
wr_s_i(0xaf);
wr_m_i(0xc0);
wr_s_i(0xc0);
wr_m_i(0xa4);
wr_s_i(0xa4);
wr_m_i(0x00);
wr_s_i(0x00);
wr_m_i(0xa9);
wr_s_i(0xa9);
wr_m_i(0xa0);
wr_s_i(0xa0);
wr_m_i(0xba);
wr_s_i(0xba);
wr_m_d(0x0f);
wr_s_d(0x0f);
}
//---------------------------------------------------------------------
char rd_m_d(void) // 从master读RAM数据.
{char i;
do
{
E1=0;RS=0;R_W=1;E1=1;
}while(P1&0x80);
E1=0;RS=1;R_W=1;E1=1;
_nop_();_nop_();
i=P1;
return(i);
}
//---------------------------------------------------------------------
void mov_ram(void) // 从master第一页中取出几列数据送slaver
{ // 用于测试目的.
uchar i,buff[8];
wr_m_i(0xb8|0);wr_m_i(0x00); // 第一页的第一列开始
for(i=0;i<4;i++)buff[i]=rd_m_d();
wr_s_i(0xb8|0);wr_s_i(0x03);
for(i=0;i<4;i++)wr_s_d(buff[i]);
}
//---------------------------------------------------------------------
void test_prog(void) // 测试程序. 分别在master\slaver的第一页
{ // 的前几列写数据.
char i;
wr_m_i(0xb8|0); // ????此处很奇怪,见下边陈述
wr_m_i(0xb8|0);
_nop_();
wr_m_i(0x00);
for(i=0;i<4;i++)wr_m_d(0xaa); // ????此处显示也很奇怪
wr_s_i(0xb8|0);wr_s_i(0x02);
for(i=0;i<4;i++)wr_s_d(0x55);
}
//---------------------------------------------------------------------
void main(void)
{
lcd_init();
lcd_display();
clr_ram();
lcd_display();
// mov_ram;
test_prog();
for(;;);
}
1.开始只写了左边,右边没有处理(没有在初始化程序中写slaver的工作方式,也没有对RAM做任何操作.)对左边的RAM清零后,只写一次.
但是,左边的前16列是乱码,反复上电,偶尔能正常显示....这时右半边没有显示.
上电先后延时一段时间后在复位液晶模块,不行.
后来又改为上边所帖程序(反复写RAM),不行.
小弟没有调试经验,刚刚开始写程序,所以到这里没有办法了...
2.把所有的对左半边的操作,均改为右边边.现象一样.左边没有显示.
3.在初始化程序中加上对左边的操作,对左右两边都清零,都写RAM.如所帖程序.
左边前16列乱码,但是右边都是乱码!!!!!!!
4分别注释掉led_display中的wr_m_d,wr_s_d后,乱码,但现象还不同.
答 1: 个人见解1 读忙状态前应该浮置总线,否则依LZ的程序没有超时判断,很容易造成死机
P1 = 0xFF;
do { E2=0; RS=0; R_W=1; E2=1; }while(P1&0x80);
2 写数据或命令,在写信号沿之前,应该有一段稳定时间,检查时间是否足够
P1=i; E2=1; _nop_(); _nop_(); E2=0;
是不是应该改为
P1=i; _nop_();_nop_(); E2=1; E2=0;
3 LCD控制器是否有超时要求,如果在读写时超时是否会出现乱码,可考虑加入关中断的操作,
EA=0; P1=i; _nop_();_nop_(); E2=1; E2=0; EA=1;
答 2: 10.5日调试进展昨天乱码现象今天有所改观.但想不明白为什么??
把lcd_display()改为先写每一页左半屏,再写每一页右半屏后,昨天的3和4现象消失,但左右半屏的前面十几列都是乱码.
在模块初始化中,改为从左到右显示后,1和2现象消失.为什么跟现实方式还有关系??
但今天又出现问题:
1,在test_prog()中,把左半屏的第一页的前4列写数据AA,把右半屏第一页的第3列开始的4列写55.
但显示情况是:左半屏第一页前4列显示数据为AA.右半屏的第一页的3\4\5列显示数据为55,少的一列在左半屏的第5列........
如果只写右半屏的话,那么右边还是少一列,但是左边没有显示.......
2,加上test_prog()测试后,反复上电,左半屏的几列有时在第四页显示.
后在加一个写页地址子程序wr_m_i(0xb8|0),显示正常.WHY??不明白
答 3: 谢谢zg17903别的都显示正常了,读忙应该没有问题了吧.
回去再试试. 答 4: 还是喜欢串行接法,用SPI
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |