以下是C51下12864并行模式的主要驱动,不用判忙用延迟完全没问题,后面还附上STM32上的程序,一样的逻辑写的,死活不行,好郁闷!
/*void busy7920()
{
rs=0;rw=1;en=1;
gpio7920=0xff;
while((gpio7920&0x80)==0x80);//忙则等待
en=0;
}*/
void cmd7920(uchar cmd)
{
// busy7920();
rs=0;rw=0;en=1;
gpio7920=cmd;
delayms(1);//delayus2x(5);
en=0;
//delayus2x(5);
}
void dat7920(uchar dat)
{
// busy7920();
rs=1;rw=0;en=1;
gpio7920=dat;
delayms(1);//delayus2x(5);
en=0;
//delayus2x(5);
}
void clear()
{
cmd7920(0x01);
delayms(15);
}
void init7920()
{
delayms(1);//delayms(40);
psb=1; //8bit并口模式
delayms(1);
res=0;
delayms(1);
res=1;
delayms(1);//delayms(10);
cmd7920(0x30); //基本指令集
delayms(1);//delayus2x(50); //延迟大于100us
cmd7920(0x30); //8bit数据流
delayms(1);//delayus2x(20); //大于37us
cmd7920(0x0c); //开显示,模式
delayms(1);//delayus2x(50);
cmd7920(0x01); //清零,地址00h
delayms(1);//delayms(15);
cmd7920(0x06);
delayms(1);//delayus2x(50);
}
void sTo7920(uchar x,y,uchar *p)
{
switch(y)
{
case 0:cmd7920(0x80+x);break;
case 1:cmd7920(0x90+x);break;
case 2:cmd7920(0x88+x);break;
case 3:cmd7920(0x98+x);break;
default:break;
}
while(*p>0)
{
dat7920(*p);
p++;delayus2x(50);
}
}
下面是stm32下12864并行驱动
void Check_Busy()
{
Reset(RS_st7920);
Set(RW_st7920);
Set(EN_st7920);
GPIO_Write(GPIO_st7920,GPIO_ReadOutputData(GPIO_st7920)|0x0080);
while(Get(BUSY_st7920));
Reset(EN_st7920);
}
void write_cmd7920(uint8_t cmd)
{
delay_ms(1);Check_Busy();
Reset(RS_st7920);
Reset(RW_st7920);
Set(EN_st7920);
GPIO_WriteLow(GPIO_st7920,cmd);
delay_ms(1);
Reset(EN_st7920);
}
void write_dat7920(uint8_t dat)
{
delay_ms(1);Check_Busy();
Set(RS_st7920);
Reset(RW_st7920);
Set(EN_st7920);
GPIO_WriteLow(GPIO_st7920,dat);
delay_us(30);
Reset(EN_st7920);
}
void LCDst7920_init(void)
{
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStrcture;
RCC_APB2PeriphClockCmd(RCC_st7920,ENABLE);
GPIO_InitStrcture.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStrcture.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStrcture.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIO_st7920,&GPIO_InitStrcture);
//LCD初始化
delay_ms(100);
Set(PSB_st7920);delay_ms(1); //PSB=1,并行数据模式
Reset(RES_st7920);delay_ms(1);
Set(RES_st7920);delay_ms(1);
write_cmd7920(0x30);delay_ms(1); //基本指令集,8位数据模式
write_cmd7920(0x30);delay_ms(1); //基本指令集,8位数据模式
write_cmd7920(0x0c);delay_ms(1); //开显示,无游标,不反白
write_cmd7920(0x01);delay_ms(1); //清楚显示,DDRAM_AC=0
write_cmd7920(0x06);delay_ms(1); //DDRAM_AC++,地址自动+1模式
}
void clear_st7920(void)
{
write_cmd7920(0x01);
delay_ms(10);
}
void sTo7920(uint8_t x,uint8_t y,uint8_t *p)
{
switch(y)
{
case 0: write_cmd7920(0x80+x);break;
case 1: write_cmd7920(0x90+x);break;
case 2: write_cmd7920(0x88+x);break;
case 3: write_cmd7920(0x98+x);break;
}
while(*p>0)
{
write_dat7920(*p);
p++;delay_us(100);
}
}
有啥毛病??
一周热门 更多>