12864在C51上成功,转到STM32不成功,附上程序!

2019-07-21 08:09发布

以下是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);
        }
}


有啥毛病??
0条回答

一周热门 更多>