OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3136|回复: 0

自制ARM板做LCD串口驱动疑问

[复制链接]

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2016-8-13
在线时间
9 小时
发表于 2016-9-10 17:16:16 | 显示全部楼层 |阅读模式
5金钱
在做串口测试LCD的程序,接口定义见#define,但是在用J-LINK下载之后,液晶屏只有背光亮,数据端进不去,编译没有错误不知道什么原因,希望有人能稍微看下。
液晶屏略有特殊,带字库,然后起始需要同步信号,5位高电平同步信号后跟一个低电平跟0/1(取决数据/命令方向)跟0,然后后16位每个8位中的高四位传输数据,低四位为零。

#include "stm32f10x.h"
#include "stm32_eval.h"
#include <stdio.h>
#define SID                GPIOE_Pin_11
#define CS                GPIOE_Pin_7
#define SCLK        GPIOD_Pin_14       
#define PSB                GPIO_ResetBits(GPIOD,GPIO_Pin_9)

static u8 fac_us=0;//ms延时倍乘数
static u16 fac_ms=0;

void IO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//使能PORTB时钟
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_11;                                                                //端口配置, 推挽输出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                          //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                                
        GPIO_Init(GPIOE, &GPIO_InitStructure);                                                               //根据设定参数初始化
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_14;                                                                //端口配置, 推挽输出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                          //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                        
        GPIO_Init(GPIOD, &GPIO_InitStructure);                                                               //根据设定参数初始
                                    

}

void DelayInit()
{
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8
        fac_us=SystemCoreClock/8000000;        //为系统时钟的1/8  
        fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
}

void DelayUs(unsigned long nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us; //时间加载                           
        SysTick->VAL=0x00;        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数         
        do
        {
                temp=SysTick->CTRL;
        }
        while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
        SysTick->VAL =0X00;       //清空计数器         
}

void sendbyte(unsigned char zdata)
{
        unsigned int i;
        for(i=0; i<8; i++)
        {
                if((zdata << i) & 0x80)
                { GPIO_SetBits(GPIOE,GPIO_Pin_12);
                        //SID = 1;
                }
                else
                {
                        GPIO_ResetBits(GPIOE,GPIO_Pin_12);
                        //SID = 0;
                }
                GPIO_ResetBits(GPIOD,GPIO_Pin_14);
                GPIO_SetBits(GPIOD,GPIO_Pin_14);
                //SCLK = 0;
                //SCLK = 1;
        }
}

void write_com(unsigned char cmdcode)
{GPIO_SetBits(GPIOE,GPIO_Pin_7);
        //CS = 1;
        sendbyte(0xf8);
        sendbyte(cmdcode & 0xf0);
        sendbyte((cmdcode << 4) & 0xf0);
        DelayUs(20);
}

void write_data(unsigned char Dispdata)
{
        GPIO_SetBits(GPIOE,GPIO_Pin_7);
        //CS = 1;
        sendbyte(0xfa);
        sendbyte(Dispdata & 0xf0);
        sendbyte((Dispdata << 4) & 0xf0);
        DelayUs(20);
}

void lcdinit()
{  
        DelayUs(200000);
        write_com(0x30);
        DelayUs(500);
        write_com(0x0c);
        DelayUs(500);
}

void L12864_num(unsigned char hang,unsigned char lie,char sign)
{
switch(hang)
     {
          case 1: write_com(0x80+lie);break;
          case 2: write_com(0x90+lie);break;
          case 3: write_com(0x88+lie);break;
          case 4: write_com(0x98+lie);break;
      default:break;
         }
    write_data(sign+48);

}

void L12864_char(unsigned char hang,unsigned char lie,char sign)
{
switch(hang)
     {
          case 1: write_com(0x80+lie);break;
          case 2: write_com(0x90+lie);break;
          case 3: write_com(0x88+lie);break;
          case 4: write_com(0x98+lie);break;
      default:break;
         }
    //write_data(00);
    write_data(sign);

}

void L12864_string(unsigned char hang,unsigned char lie,unsigned char *p)
{
switch(hang)
     {
          case 1: write_com(0x80+lie);break;
          case 2: write_com(0x90+lie);break;
          case 3: write_com(0x88+lie);break;
          case 4: write_com(0x98+lie);break;
      default:break;
         }
        while(*p>0)
   {
      write_data(*p);
      p++;
   }
}

int main(void)
{
   DelayInit();
   IO_Init();        
        DelayUs(100);
         lcdinit();                     //LCD初始化
         DelayUs(100);
    L12864_string(1,0,"串行口传输方式:");
    L12864_string(2,0,"Today is LED-234");
    L12864_num(3,3,9);       

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 12:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表