fpaisheng 发表于 2011-8-23 18:20:34

弱弱问一下用DSP2808做LCD12864的问题!

用DSP2808做LCD12864,LCD的型号是QC12864!写了几次都不行,特来网上发帖!
情况是这样子的,全速运行就不行,但是单步可以!在程序中延时很多都不行!有时行了,一延时就不行!
现在贴出程序:(程序中的延时是为了单步调试才删除的!)之所以所有IO都一个一个来操作是因为之前写过一起操作的,发现一起操作不行,会有些数据位呈现是脉冲的状况,我在另外一个帖子上已经有提问(http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4985163&bbs_page_no=1&bbs_id=1002)!
那位大侠有用过2808操作过LCD12864,给点意见!现在对2808的IO口操作很纠结!
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_670466R4SZ6U.png
电路原理图1 (原文件名:搜狗截图_2011-08-23_18-27-08.png)

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_670467GUE3QO.png
电路原理图2 (原文件名:搜狗截图_2011-08-23_18-27-22.png)

#include "DSP280x_Device.h"   
#include "DSP280x_Examples.h"

// 宏定义
#define CODE 0
#define DATA 1
#define          SetRS                GpioDataRegs.GPBSET.bit.GPIO34=1
#define          ClrRS                GpioDataRegs.GPBCLEAR.bit.GPIO34=1
#define          SetRW                GpioDataRegs.GPASET.bit.GPIO17=1
#define          ClrRW                GpioDataRegs.GPACLEAR.bit.GPIO17=1
#define          SetE                GpioDataRegs.GPASET.bit.GPIO16=1
#define          ClrE                GpioDataRegs.GPACLEAR.bit.GPIO16=1

// 函数声明
    void Delays(Uint16 number);// 延时子程序
    void Init_LCD(void);// LCD初始化子程序
        void Busy_mark(void);// 判忙子程序
        void Write_LCD(unsigned int code_data,unsigned int content);// 写数据和指令函数
        void Clear_LCD(void);// LCD清屏函数
        void Display_x_y(unsigned int y, unsigned int x);//指定要显示字符的坐标
        void Display_String(unsigned char *str);//显示字符串子程序
        void Display_Chara(unsigned char Chara);//显示字子程序

/***********************************************************/
// 主函数
/***********************************************************/
        void main(void)
        {
                /* 以下为系统初始化*********************************/
                /* 第一步:初始化系统控制:**************************/
             InitSysCtrl();                                // 初始化系统时钟
                  
          /* 第二步: 初始化系统GPIO:*************************/
                   InitGpio();                      // GPIO初始化

          /* 第三: 清除所有的中断和初始化PIE矢量表:*********/
                   DINT;                                                  // 关中断
                   InitPieCtrl();                                // 初始化PIE模块到一个已知状态
                   IER = 0x0000;                                // 禁止CPU中断
                   IFR = 0x0000;                            // 清除CPU中断标志
             InitPieVectTable();                        // 初始化PIE向量表
             // 初始化系统用到的中断矢量表
                      EALLOW;
             // 要用到的中断指向相应的中断处理函数
         EDIS;   

          /* 第四步:初始化所有设备外设:**********************/
                   Init_LCD();

             
                /* 第五步: 用户特定的代码,使能中断:*****************/
                   // 使能组1的中断(CPU中断控制器)
                   IER |= M_INT1;
                   // 开全局中断
                   EINT;   // Enable Global interrupt INTM
                   ERTM;   // Enable Global realtime interrupt DBGM

                  
                        Display_x_y(3,1);
                        Display_Chara('7');



                for(;;)
                {

               }
        }


/******************************************************/
// 延时子程序,延时时间为delayi*1US
/******************************************************/
   void Delays(Uint16 number)
   {
        Uint16 delayi;
        Uint16 delayj;
        for(delayi=0;delayi<number;delayi++)
        {
       for(delayj=0;delayj<100;delayj++)
          {
               asm("          NOP");
          }
    }
   }

/********************************************/
// LCD初始化子程序
/********************************************/
        void Init_LCD(void)
        {
          EALLOW;
      // 设置所有在LCD中用到的引脚作为通用IO使用
                // 设置所有在LCD用到的引脚上拉电阻使能
                GpioCtrlRegs.GPBPUD.bit.GPIO34 =0;
                GpioCtrlRegs.GPAPUD.bit.GPIO6=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO7=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO8=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO9=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO10=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO11=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO18=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO19=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO16=0;
                GpioCtrlRegs.GPAPUD.bit.GPIO17=0;

                GpioDataRegs.GPASET.bit.GPIO6 = 1;
                GpioDataRegs.GPASET.bit.GPIO7 = 1;
                GpioDataRegs.GPASET.bit.GPIO8 = 1;
                GpioDataRegs.GPASET.bit.GPIO9 = 1;
                GpioDataRegs.GPASET.bit.GPIO10 = 1;
                GpioDataRegs.GPASET.bit.GPIO11 = 1;
                GpioDataRegs.GPASET.bit.GPIO18 = 1;
                GpioDataRegs.GPASET.bit.GPIO19 = 1;
                GpioDataRegs.GPASET.bit.GPIO16 = 1;
                GpioDataRegs.GPBSET.bit.GPIO34 = 1;
                GpioDataRegs.GPACLEAR.bit.GPIO17=1;
      
                GpioCtrlRegs.GPAMUX1.bit.GPIO6 =0;
                GpioCtrlRegs.GPAMUX1.bit.GPIO7 =0;
                GpioCtrlRegs.GPAMUX1.bit.GPIO8 =0;
                GpioCtrlRegs.GPAMUX1.bit.GPIO9 =0;
                GpioCtrlRegs.GPAMUX1.bit.GPIO10 =0;
                GpioCtrlRegs.GPAMUX1.bit.GPIO11 =0;
                GpioCtrlRegs.GPAMUX2.bit.GPIO16 =0; // E
                GpioCtrlRegs.GPAMUX2.bit.GPIO17 =0; // RW
                GpioCtrlRegs.GPAMUX2.bit.GPIO18 =0; //
                GpioCtrlRegs.GPAMUX2.bit.GPIO19 =0; //
                GpioCtrlRegs.GPBMUX1.bit.GPIO34 =0; // RS
                // 设置所有在LCD中用到的引脚初始化为输出,故在读数据时需设置为输入
                GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO10 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO17 = 1;
                GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
                EDIS;
                Write_LCD(CODE,0x30);
                Write_LCD(CODE,0x01);
                Write_LCD(CODE,0x06);
                Write_LCD(CODE,0x0c);
        }

//********************************
// 判忙子程序
//********************************

        void Busy_mark(void)
        {
          Uint32        Temp = 0x80000;
//                Uint16Busyi;
                EALLOW;
          GpioCtrlRegs.GPADIR.bit.GPIO6 = 0;
                GpioCtrlRegs.GPADIR.bit.GPIO7 = 0;
                GpioCtrlRegs.GPADIR.bit.GPIO8 = 0;
               GpioCtrlRegs.GPADIR.bit.GPIO9 = 0;
                GpioCtrlRegs.GPADIR.bit.GPIO10 = 0;
                GpioCtrlRegs.GPADIR.bit.GPIO11 = 0;
                GpioCtrlRegs.GPADIR.bit.GPIO18 = 0;
                GpioCtrlRegs.GPADIR.bit.GPIO19 = 0;
                EDIS;
                asm("          NOP");
                ClrRS;
                asm("          NOP");
                SetRW;
//                for(Busyi=0;Busyi<5000;Busyi++)
//                {
                asm("          NOP");
//                }
                while(Temp)
                {
                        SetE;
//                        for(Busyi=0;Busyi<5000;Busyi++)
//                        {
                        asm("          NOP");
//                        }
                        Temp =(GpioDataRegs.GPADAT.all)&0x80000;
//                        for(Busyi=0;Busyi<5000;Busyi++)
//                        {
                        asm("          NOP");
//                        }
                        ClrE;
//                        for(Busyi=0;Busyi<5000;Busyi++)
//                        {
                        asm("          NOP");
//                        }
                }
        }

//********************************
// 写数据和指令函数
// 根据dat_comm的值得判断是写的是指令还是数据,如果是指令(数据)就产生相应的时序,
//********************************

        void Write_LCD(unsigned int code_data,unsigned int content)
        {
//                Uint16Write_LCDi;
                content=content & 0x00FF;
          Busy_mark();
                asm("          NOP");
                EALLOW;
          GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;
               GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO10 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;
                GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
                EDIS;
                asm("          NOP");                             
           if(code_data)
          {
          SetRS;   //data
//                for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
//                {
                asm("          NOP");
//                }
          ClrRW;   //write
//                for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
//                {
                asm("          NOP");
//                }
          }
           else
          {
             ClrRS;   //command
//               for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
//               {
               asm("          NOP");
//               }
             ClrRW;   //write
//             for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
//               {
               asm("          NOP");
//               }
          }

                   GpioDataRegs.GPADAT.bit.GPIO6 = (content&0x01);
                GpioDataRegs.GPADAT.bit.GPIO7 = ((content>>1)&0x01);
                GpioDataRegs.GPADAT.bit.GPIO8 = ((content>>2)&0x01);
                GpioDataRegs.GPADAT.bit.GPIO9 = ((content>>3)&0x01);
                GpioDataRegs.GPADAT.bit.GPIO10 = ((content>>4)&0x01);
                GpioDataRegs.GPADAT.bit.GPIO11 = ((content>>5)&0x01);
                GpioDataRegs.GPADAT.bit.GPIO18 = ((content>>6)&0x01);
                GpioDataRegs.GPADAT.bit.GPIO19 = ((content>>7)&0x01);
//                for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
//               {
               asm("          NOP");
//               }       
                SetE;
//      for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
//               {
               asm("          NOP");
//               }
          ClrE;
//                for(Write_LCDi=0;Write_LCDi<5000;Write_LCDi++)
//               {
               asm("          NOP");
//               }
           }
/*******************************************************/
// LCD清屏函数
/********************************************************/
        void Clear_LCD(void)
        {
       Write_LCD(CODE,0x01);/*清屏,DDRAM地址指针指向00H*/
        }

//********************************
//指定要显示字符的坐标
//********************************

        void Display_x_y(unsigned int y, unsigned int x)
        {
                x--;
                switch(y)
                        {
                        case 1:
                        Write_LCD(CODE,0x80|x);
                        break;
                        case 2:
                Write_LCD(CODE,0x90|x);
                        break;
                        case 3:
                        Write_LCD(CODE,(0x80|x)+8);
                        break;
                        case 4:
                Write_LCD(CODE,(0x90|x)+8);
                        break;
                        }
        }

//**********************************
//显示字符串子程序
//**********************************
                void Display_String(unsigned char *str)
                {
                        while(*str!='\0')
                        {
                                Write_LCD(DATA,*str);
                                str++;
                        }
                }

//**********************************
//显示字子程序
//**********************************
                void Display_Chara(unsigned char Chara)
                {
               Write_LCD(DATA,Chara);
                }

fpaisheng 发表于 2011-8-23 18:24:09

补充问一下,那些延时要怎么延时才是合理的啊!

fpaisheng 发表于 2011-8-23 22:07:46

./emotion/em103.gif

19BUS 发表于 2011-8-24 09:05:18

我对 12864操作的时候也有问题
        EALLOW;
        GpioCtrlRegs.GPAPUD.all &=~0xfc0;       
//        GpioCtrlRegs.GPAMUX1.all &=~0xfc0;       
        GpioCtrlRegs.GPADIR.all |=0xc0;       
        GpioCtrlRegs.GPAPUD.all &=~0xf0000;       
//        GpioCtrlRegs.GPAMUX1.all &=~0xf0000;       

如果把这两句话保留,,就影响我 EPWM3B口的发波状态,,我只能把它删除以后EPWM3B发波很好,,也不知道原因,,

fpaisheng 发表于 2011-8-24 09:32:22

我不知道是不是因为IO的低16位和高16位操作之间的问题!是不是2808的IO口低16位和高16位操作之间存在区别或者问题呢!

3333 发表于 2011-8-24 09:49:47

如果把这两句话保留,,就影响我 EPWM3B口的发波状态,,我只能把它删除以后EPWM3B发波很好,,也不知道原因,,


就影响EPWM2B   



EPWM1AEPWM1BEPWM2A这三个口的状态很正常

3333 发表于 2011-8-24 09:50:26

我做全桥移相的 ,,,4路 PWM发玻

3333 发表于 2011-8-24 09:51:59

ddddddddddddd

19BUS 发表于 2011-8-24 10:01:19

我对 12864操作的时候也有问题
EALLOW;
GpioCtrlRegs.GPAPUD.all &=~0xfc0;
// GpioCtrlRegs.GPAMUX1.all &=~0xfc0;
GpioCtrlRegs.GPADIR.all |=0xc0;
GpioCtrlRegs.GPAPUD.all &=~0xf0000;
// GpioCtrlRegs.GPAMUX1.all &=~0xf0000;

如果把这两句话保留,,就影响我 EPWM2B口的发波状态,,我只能把它删除以后EPWM2B发波很好,,也不知道原因,,

我做的是全桥移向,,, EPWM1AEPWM1BEPWM2A   发玻都正常

fpaisheng 发表于 2011-8-24 17:12:40

会不会是内部上拉的问题!

fstncom 发表于 2011-8-24 17:13:28

支持!

libiho 发表于 2011-9-17 11:45:49

回复【楼主位】fpaisheng
-----------------------------------------------------------------------

#define   SetRS GpioDataRegs.GPBSET.bit.GPIO34=1
#define   ClrRS GpioDataRegs.GPBCLEAR.bit.GPIO34=1
#define   SetRW GpioDataRegs.GPASET.bit.GPIO17=1
#define   ClrRW GpioDataRegs.GPACLEAR.bit.GPIO17=1
#define   SetE GpioDataRegs.GPASET.bit.GPIO16=1
#define   ClrE GpioDataRegs.GPACLEAR.bit.GPIO16=1

这里宏定义写0写1不清楚
页: [1]
查看完整版本: 弱弱问一下用DSP2808做LCD12864的问题!