我用mini板的stm32来制作ks0108的驱动程序,结果完全没有效果。连一个点都没有显示。请问我的程序哪里出错了。
附上程序。
#include"12864.h"
void lcd_rcc(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0x00000000;
GPIOB->CRL|=0xBBBBBBBB;
GPIOB->CRH&=0xFFF00000;
GPIOB->CRH|=0x000BBBBB;
// GPIOB->ODR|=0x000FFFFF;
}
void db7_rcc(void)
{
GPIOB->CRH&=0xFFFFF0FF;
GPIOB->CRH|=0x00000400;
}
//等待lcd忙标志结束。
void Checkbusy(void)
{
db7_rcc();
do{
EN=0;RS=0;RW=1;
DB0=1;DB1=1;DB2=1;DB3=1;DB4=1;DB5=1;DB6=1;
EN=1;delay_ms(1);EN=0;
}
while(IDB7);
GPIOB->CRH&=0xFFFFF0FF;
GPIOB->CRH|=0x00000B00;
}
//写指令
void Wcmd(uchar cmd)
{
Checkbusy();
RS=0;
RW=0;
/* DB0=cmd%2;
DB1=cmd/2%2;
DB2=cmd/4%2;
DB3=cmd/8%2;
DB4=cmd/16%2;
DB5=cmd/32%2;
DB6=cmd/64%2;
DB7=cmd/128%2; */
cmd=cmd<<3;
GPIOB->ODR|=cmd;
EN=1;
delay_ms(1);
EN=0;
}
//页设置
void Setpage(uchar page)
{
page=0xb8|page;
Wcmd(page);
}
//列设置
void Setx(uchar x)
{
x=0xc0|x; //1100 0000
Wcmd(x);
}
//行设置
void Sety(uchar y)
{
y=y&0x3f; //0=<column<=63
y= 0x40|y; //01xx xxxx
Wcmd(y);
}
//显示开/关:0关闭显示,1打开显示;
void SetOnOff(uchar onoff)
{
onoff=0x3e|onoff; //0011 111x,onoff
Wcmd(onoff);
}
//写数据
void Writedata(uchar dat)
{
Checkbusy();
RS=1;
RW=0;
/* DB0=dat%2;
DB1=dat/2%2;
DB2=dat/4%2;
DB3=dat/8%2;
DB4=dat/16%2;
DB5=dat/32%2;
DB6=dat/64%2;
DB7=dat/128%2; */
dat=dat<<3;
GPIOB->ODR|=dat;
EN=1;
delay_ms(1);
EN=0;
}
//选择屏幕
void SelectScreen(uchar screen)
{
switch(screen)
{ case 0: cs1=0;
delay_ms(1);
cs2=0;
delay_ms(1);
break;
case 1: cs1=0;
delay_ms(1);
cs2=1;
delay_ms(1);
break;
case 2: cs1=1;
delay_ms(1);
cs2=0;
delay_ms(1);
break;
}
}
void ClearScreen(uchar screen)
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{
Setpage(i);
Sety(0);
for(j=0;j<64;j++)
{
Writedata(0x00);
}
}
}
void InitLCD()
{
Checkbusy();
lcd_rcc();
SelectScreen(0);
SetOnOff(0);
SelectScreen(0);
SetOnOff(1);
SelectScreen(0);
ClearScreen(0);
Setx(0);
}
void Display(uchar ss,uchar page,uchar y,uchar number,uchar *Hzk)
{
int i;
SelectScreen(ss);
y=y&0x3f;
Setpage(page);
Sety(y);
for(i=0;i<16;i++)
{
Writedata(Hzk[i+32*number]);
}
Setpage(page+1);
Sety(y);
for(i=0;i<16;i++)
{
Writedata(Hzk[i+32*number+16]); //i+32*number+16
}
}
|