This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP28335 与LCD12864通信

我看28335的例程里面只配置了12864的控制引脚,为什么没有配置并行数据输出引脚?还有LCD12864的数据引脚应该和DSP的哪些引脚相连呢?

  • 你好,你说的例程具体在哪里方便说明一下吗?
    连接方式建议你参考这款显示器的说明手册。我之前的项目经验,MCU是通过SPI与显示屏通讯的,但是中间好像还用了74HC595芯片串行转并行芯片转换。
  • 你这个是第三方的例程吧?
    12864LCD应该是支持iic或者SPI通信的,如果你要使用并行的8位数据管脚控制的话,这个只是普通的IO翻转,所以只要是GPIO都可以
  • //###########################################################################
    //
    // FILE: lab7-LCD
    //
    // TITLE: LCD12864显示实验
    //
    //
    // 根据在RAM中调试的需要,这个项目配置成"boot to SARAM".2833x引导模式
    // 表如下显示. 常用的还有"boot to Flash"模式,当程序在RAM调试完善后就
    // 可以将代码烧进Flash中并使用"boot to Flash"引导模式.
    //
    // $Boot_Table:
    //
    // GPIO87 GPIO86 GPIO85 GPIO84
    // XA15 XA14 XA13 XA12
    // PU PU PU PU
    // ==========================================
    // 1 1 1 1 Jump to Flash
    // 1 1 1 0 SCI-A boot
    // 1 1 0 1 SPI-A boot
    // 1 1 0 0 I2C-A boot
    // 1 0 1 1 eCAN-A boot
    // 1 0 1 0 McBSP-A boot
    // 1 0 0 1 Jump to XINTF x16
    // 1 0 0 0 Jump to XINTF x32
    // 0 1 1 1 Jump to OTP
    // 0 1 1 0 Parallel GPIO I/O boot
    // 0 1 0 1 Parallel XINTF boot
    // 0 1 0 0 Jump to SARAM <- "boot to SARAM"
    // 0 0 1 1 Branch to check boot mode
    // 0 0 1 0 Boot to flash, bypass ADC cal
    // 0 0 0 1 Boot to SARAM, bypass ADC cal
    // 0 0 0 0 Boot to SCI-A, bypass ADC cal
    // Boot_Table_End$
    //
    // 功能描述:
    //
    // 程序编译下载成功后,运行程序时LCD12864显示数据
    //
    //
    //###########################################################################
    // 释放日期: 2017.4.10
    //###########################################################################
    #include "DSP2833x_Device.h" // DSP2833x 头文件
    #include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件#include"DSP2833x_Device.h"

    /**************************************宏定义************************************************/
    #define LCD_DATA_BUS (*((volatile Uint16 *)0x4000)) //宏定义LCD的地址
    #define EN GpioDataRegs.GPBDAT.bit.GPIO54 //宏定义
    #define RW GpioDataRegs.GPBDAT.bit.GPIO56 //宏定义
    #define RS GpioDataRegs.GPBDAT.bit.GPIO57 //宏定义
    #define uchar unsigned char //宏定义
    /**********************************************************************************************/

    /**************************************变量定义************************************************/
    extern uchar menu1[]={"选择电机定时设置"};
    extern uchar menu2[]={"开步进电机A"};
    extern uchar menu3[]={"开步进电机B"};
    extern uchar menu4[]={"开步进电机C"};
    /**********************************************************************************************/

    /**************************************函数声明************************************************/
    void LCDInit(void); //LCD初始化
    void Write_order(Uint16 order); //LCD写函数
    void Write_data(Uint16 data); //LCD写函数
    void delay(Uint16 t); //延时函数
    void configio(void); //LCD控制脚的GPIO配置
    void InitXintf(void); //总线初始化
    void display(uchar *hz); //显示函数
    /**********************************************************************************************/

    void LCD_DATA(uchar d) //把数据传给总线
    {
    LCD_DATA_BUS = d; //把要显示的值赋给总线
    }
    void LCDInit(void) //LCD初始化
    {
    DELAY_US(5000);
    Write_order(0x30);//功能设定:基本指令动作
    DELAY_US(50); //延时
    Write_order(0x0c);//显示状态:开
    DELAY_US(50); //延时
    Write_order(0x01);//清屏
    DELAY_US(60); //延时
    Write_order(0x02);//地址归位:AC=0x00
    DELAY_US(40); //延时
    }

    void Write_order(Uint16 order) //LCD12864写指令函数
    {
    RS=0;delay(1); //指令
    EN=1;delay(1); //允许
    LCD_DATA(order); //赋值
    EN=0;delay(1); //允许
    }

    void Write_data(Uint16 data) //LCD12864写数据函数
    {
    RS=1;delay(1); //指令
    EN=1;delay(1); //允许
    LCD_DATA(data); //赋值
    EN=0;delay(1); //允许
    }
    void delay(Uint16 t) //延时函数
    {
    Uint16 i; //定义变量
    while(t--) //while循环
    {
    for(i=0;i<500;i++);//FOR循环
    }
    }

    void configio(void) // LCD屏读写、使能和时钟GPIO配置
    {
    EALLOW;
    GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; // GPIO复用为GPIO功能
    GpioCtrlRegs.GPBDIR.bit.GPIO54 = 1; // GPIO设置为输出
    GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0; // GPIO复用为GPIO功能
    GpioCtrlRegs.GPBDIR.bit.GPIO56 = 1; // GPIO设置为输出
    GpioCtrlRegs.GPBMUX2.bit.GPIO57= 0; // GPIO复用为GPIO功能
    GpioCtrlRegs.GPBDIR.bit.GPIO57 = 1; // GPIO设置为输出
    EDIS;
    }

    void display(uchar *hz) //显示函数
    {
    while(*hz!='\0') //While循环
    {
    Write_data(*hz);
    hz++;
    DELAY_US(250); //延时
    }
    }

    /****************************************主程序******************************************************/
    void main(void)
    {
    // 初始化系统控制:
    // 设置PLL, WatchDog, 使能外设时钟
    // 下面这个函数可以从DSP2833x_SysCtrl.c文件中找到..
    InitSysCtrl();
    // Xintf总线配置和初始化
    InitXintf();
    InitXintf16Gpio();
    // 清除所有中断初始化中断向量表:
    // 禁止CPU全局中断
    DINT;
    // 初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
    // 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
    // 这个函数放在了DSP2833x_PieVect.c源文件里面.
    InitPieCtrl();
    // 禁止CPU中断和清除所有CPU中断标志
    IER=0x0000;
    IFR=0x0000;
    // LCD屏读写、使能和时钟GPIO配置
    configio();

    RS=0; //初始化RS电平
    delay(5); //延时
    RW=0; //初始化RS电平
    delay(5); //延时
    EN=0; //初始化RS电平
    LCDInit();//LCD初始化
    delay(5); //延时
    Write_order(0x80);//第一行数据指针地址
    delay(5); //延时
    display(menu1); //显示menu1的内容

    Write_order(0x91);//第二行数据指针地址
    delay(5); //延时
    display(menu2); //显示menu2的内容

    Write_order(0x89);//第三行数据指针地址
    delay(5); //延时
    display(menu3); //显示menu3的内容

    Write_order(0x99);//第四行数据指针地址
    delay(5); //延时
    display(menu4); //显示menu4的内容

    while(1); //While循环
    }

    //
    //===========================================================================
    // No more.
    //===========================================================================

    这个是例程,从里面看不出来LCD的8根数据线怎么接。正好您做过项目问下您,是SPI的输出如果是16位数据,还需要通过运算变成浮点数,并在LCD上显示出来,该怎么实现呢

  • 你好 请问如果是小数该怎么通过GPIO输出呢?要给每一个GPIO分别置位吗?