现在有一个12864的屏,采用的是双595扩展的串口,单片机采用的是IAP15W4K61S4,选用的是内部24MHZ的晶振。调了两天没调出来,不知道哪里出了问题!还请大家帮忙看一下。12864采用的是不带字库的,RST脚没接
#include
#define uchar unsigned char
#define uint unsigned int
sbit EXP_CLK = P3^6;
sbit EXP_DATA = P3^7;
sbit KEY_D_ST1 = P3^4;
sbit KEY_C_ST1 = P3^5;
uchar Port;
void SendCommand(uchar command);
void WriteData(uchar dat);
void LcdDelay(uchar time);
void SetOnOff(uchar onoff);
void ClearScreen(uchar screen);
void SetLine(uchar line);
void SetColum(uchar colum);
void SetStartLine(uchar startline);
void SelectScreen(uchar screen);
void Show1616(uchar lin,uchar colum,uchar *address);
void InitLcd();
void Show_english(uchar lin,uchar colum,uchar *address);
void SendChrToPeriphery(uchar chr);
void SetKeyDisCT(bit bbit);
void delayms(uint ms);
void delayus(uint us);
void InitPort(void)
{
P0M1 = 0x00;
P0M0 = 0x00;
P0 = 0xe0;
P1M1 = 0xc0;
P1M0 = 0x00;
P1 = 0xeb;
P2M1 = 0x00;
P2M0 = 0x00;
P2 = 0xfa;
P3M1 = 0x00;
P3M0 = 0x00;
P3 = 0;
P4M1 = 0x00;
P4M0 = 0x00;
P4 = 0xe7;
P5M1 = 0x00;
P5M0 = 0x00;
P5 = 0xf9;
P6M1 = 0x00;
P6M0 = 0x00;
P6 = 0x7e;
P7M1 = 0x00;
P7M0 = 0x00;
P7 = 0xff;
WDT_CONTR = 0x35;
}
const uchar code hzk[] =
{
};
void main()
{
uchar i,line,colum,j ;
uchar *address ;
InitPort();
Port=0xff;
SendChrToPeriphery(Port); //ê1Äü
SetKeyDisCT(1);
WDT_CONTR = 0x35;
InitLcd();
while(1)
{
WDT_CONTR = 0x35;
line=1;
colum=0;
address=hzk;
SetOnOff(1);
for(i=0;i<14;i++)
{
if(i<8)
{
SelectScreen(0);
Show_english(line,colum,address);
address+=16;
colum+=8;
}
else if(i>=8)
{
if(i<13)
{
SelectScreen(1);
Show_english(line,colum,address);
address+=16;
colum+=8;
}
else
{
Show1616(line,colum,address);
address+=32;
colum+=16;
}
}
}
}
}
void SendChrToPeriphery(unsigned char chr)
{
unsigned char cthr;
for ( cthr = 0 ;cthr < 8;cthr ++ )
{
EXP_DATA = chr & 0x80;
chr <<= 1;
EXP_CLK = 1;
EXP_CLK = 0;
};
}
void SetKeyDisCT(bit bbit) //μØÖ·ê1Äü½Å
{
KEY_C_ST1 = bbit;
LcdDelay(5);
KEY_C_ST1=0;
}
void SetKeyDisDT(bit bbit) //êy¾Yê1Äü½Å
{
KEY_D_ST1 = bbit;
LcdDelay(5);
KEY_D_ST1=0;
}
void LcdDelay(uchar time)
{
while(time--);
}
void delayus(uint us)
{
uint m;
for(m=0;m
{
LcdDelay(24);
}
}
void delayms(uint ms)
{
uint m;
for(m=0;m
{
delayus(1000);
}
}
void SendCommand(uchar command) //·¢ËíÃüáî
{
Port&=0xe3;
SendChrToPeriphery(Port); //
SetKeyDisCT(1);
delayus(500);
SendChrToPeriphery(command);
SetKeyDisDT(1);
Port&=0xeb;
SendChrToPeriphery(0xeb); //ê1Äü
SetKeyDisCT(1);
Port&=0xeb;
SendChrToPeriphery(0xe3); //ê1Äü
SetKeyDisCT(1);
delayms(10);
}
void WriteData(uchar dat) //·¢Ëíêy¾Y
{
Port&=0xe7;
SendChrToPeriphery(0xe7);
SetKeyDisCT(1);
delayus(500);
SendChrToPeriphery(dat);
SetKeyDisDT(1);
Port&=0xef;
SendChrToPeriphery(0xef);
SetKeyDisCT(1);
LcdDelay(130);
Port&=0xe7;
SendChrToPeriphery(0xe7);
SetKeyDisDT(1);
delayms(10);
}
void SetOnOff(uchar onoff)
{
if(onoff==1)
{
SendCommand(0x3f);
}
else
{
SendCommand(0x3e);
}
}
void SetLine(uchar line)
{
line=line&0x07;
line=line|0xb8;
SendCommand(line);
}
void SetColum(uchar colum)
{
colum=colum&0x3f;
colum=colum|0x40;
SendCommand(colum);
}
void SetStartLine(uchar startline)
{
startline=startline&0x3f;
startline=startline|0xc0;
SendCommand(startline);
}
void SelectScreen(uchar screen) //Ñ¡ÔñÆá
{
switch(screen)
{
case 0:
Port&=0xfd;
SendChrToPeriphery(Port);
SetKeyDisCT(1);
break;
case 1:
Port&=0xfe;
SendChrToPeriphery(Port);
SetKeyDisCT(1);
break;
case 2:
Port&=0xfc;
SendChrToPeriphery(Port);
SetKeyDisCT(1);
break;
}
}
void Show1616(uchar lin,uchar colum,uchar *address) //ÏÔê¾oo×Ö
{
uchar i;
SetLine(lin);
SetColum(colum);
for(i=0;i<16;i++)
{
WriteData(*address);
address++;
}
SetLine(lin+1);
SetColum(colum);
for(i=0;i<16;i++)
{
WriteData(*address);
address++;
}
}
void Show_english(uchar lin,uchar colum,uchar *address) //ÏÔê¾ó¢ÎÄ
{
uchar i;
SetLine(lin);
SetColum(colum);
for(i=0;i<8;i++)
{
WriteData(*address);
address++;
}
SetLine(lin+1);
SetColum(colum);
for(i=0;i<8;i++)
{
WriteData(*address);
address++;
}
}
void ClearScreen(uchar screen) //ÇåÆá
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{
SetLine(i);
SetColum(0);
for(j=0;j<64;j++)
{
WriteData(0);
}
}
}
void InitLcd()
{
SetOnOff(0);
ClearScreen(2);
SetLine(0);
SetColum(0);
SetStartLine(0);
SetOnOff(1);
}
-
调试1286,先把读写程序写完,往液晶发送数据,看可以不,不行就要考虑时序了,完了再写其他,这两个不能保证,写再多也没用
595没必要,12864有串行模式,想做更快捷的可以用spi操作。
这种型号的12864只有并口的,而且单片机的串口不够,
恩,是的现在就是缩小了很多,可还是不行的
不知道什么原因,RST通过203电阻接的高电平,不测忙,只通过延时函数
我也从来不测忙,关键你这不通用,没法替你调试,有逻辑分析仪没,看看你的595出来的数据好着没,或者接点led也可以。建议你从头重新写个看看,都2天了,万一哪个坑是你一直没发现的就白浪费时间了
如果是只写,R/W脚可不可以一直是低电平?复位脚通过203电阻直接接VCC可以吧?
额。。。。。。一步步来吧,体会过那种好几天卡住的感受,最好让旁边的人帮你看下,这种情况很大可能是自己掉坑了
主要是也急,现在搞得心都乱了。而且后面还有其他的,这个整不好,下面就没法进行
这个时候,你要丢掉之前的所有思维,以一个旁观者的角度,把他当成是别人的设计,重新走一遍,从原理到代码,
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵