jiangkeqin_sy 发表于 2015-12-15 20:21

新手求助,用DSP直接驱动lcd1602


//写指令        输入        RS=L,R/W=L,D0-D7=指令码,E=高脉冲        输出        无
//读数据        输入        RS=H,R/W=H,E=H        输出        D0-D7=数据
//写数据        输入        RS=H,R/W=L,D0-D7=数据,E=高脉冲        输出        无




#include"DSP28_Device.h"


#define lcd_rs GpioDataRegs.GPADAT.bit.GPIOA8
#define lcd_rw GpioDataRegs.GPADAT.bit.GPIOA9
#define lcd_ep GpioDataRegs.GPADAT.bit.GPIOA10
#define D0 GpioDataRegs.GPADAT.bit.GPIOA0
#define D1 GpioDataRegs.GPADAT.bit.GPIOA1
#define D2 GpioDataRegs.GPADAT.bit.GPIOA2
#define D3 GpioDataRegs.GPADAT.bit.GPIOA3
#define D4 GpioDataRegs.GPADAT.bit.GPIOA4
#define D5 GpioDataRegs.GPADAT.bit.GPIOA5
#define D6 GpioDataRegs.GPADAT.bit.GPIOA6
#define D7 GpioDataRegs.GPADAT.bit.GPIOA7



void Lcd_Init(void);//初始化LCD

void delay_1ms(unsigned int );//延时1m
void delay_40us(unsigned int);//延时40us

void lcd_write_command(unsigned int);//写命令函数
void lcd_write_data(unsigned char);//写数据函数

int lcd_check_busy(void);//检查忙信号。
void lcd_display_pose(unsigned int, unsigned int);//显示位置函数。
unsigned char dis1[]={"jiangkeqin"};//第一行要显示数据。
unsigned char dis2[]={"18995947988"};//第二行要显示数据。


void main()
{
   unsigned int i;
   InitSysCtrl();                                          //初始化系统函数。
   DINT;                                                
   IER=0X0000;                                             //禁止所有CPU中断。
   IFR=0x0000;                                          //清楚所有CPU中断   
   InitPieCtrl();                                       //初始化中断向量。
   InitPieVectTable();                                    //初始化中断向量表。
   InitPeripherals();                                     //初始化中断CPU定时器模块。
   InitGpio();                                          //初始化GPIIO口。

   EINT;                                                 //使能全局中断。
   
   ERTM;                                                   //使能实时中断。
   
   Lcd_Init();//初始化LCD。
   delay_1ms(10);
   lcd_display_pose(0,0);//设计第一行显示位置。
   for(i=0;dis1!='\0';i++)//第一行显示数据。
   {
      while(lcd_check_busy());//检查忙信号。
                lcd_write_data(dis1);//写第i个字符。
   }
   delay_1ms(10);

   lcd_display_pose(4,1);//从第二行第5个开始写。
   for(i=0;dis2!='\0';i++)//第二行显示数据。
   {
      while(lcd_check_busy());
                lcd_write_data(dis2);
   }
   while(1);




}


int lcd_check_busy()//检查忙信号。忙返回1,不忙返回0.
{
   int result;
   lcd_rs=0;
   lcd_rw=1;
   lcd_ep=1;
   result=D7;
// ep=0;///?读数据和读状态ep=H;
   delay_40us(1);//命令执行时间为40us.

   return result;



}




void lcd_write_command(unsigned int com)//写指令函数。
{
    lcd_rs=0;//
        lcd_rw=0;//
        lcd_ep=1;//容许 下降沿触发1-0;
    D0=com&0x0001;         //把8位数据写到16位的串口的低8位中去A0~A7中,保留高8位数据。例如把0x38写进去。
        D1=(com>>1)&0x0001;
        D2=(com>>2)&0x0001;
        D3=(com>>3)&0x0001;
        D4=(com>>4)&0x0001;
        D5=(com>>5)&0x0001;
        D6=(com>>6)&0x0001;
        D7=(com>>7)&0x0001;
        lcd_ep=0;//下降沿触发1---0???
        delay_40us(1);            //写指令所要时间为40us
       
}

void lcd_write_data(unsigned char data)//写数据函数。
{
   while(lcd_check_busy());
       lcd_rs=1;
       lcd_rw=0;
       lcd_ep=1;
       D0=data&0x0001;         //把8位数据写到16位的串口的低8位中去A0~A7中,保留高8位数据。例如把0x38写进去。
       D1=(data>>1)&0x0001;
       D2=(data>>2)&0x0001;
       D3=(data>>3)&0x0001;
       D4=(data>>4)&0x0001;
       D5=(data>>5)&0x0001;
       D6=(data>>6)&0x0001;
       D7=(data>>7)&0x0001;
       lcd_ep=0;
       delay_40us(1);

}

void lcd_display_pose(unsigned int x,unsigned int y)
{
   unsigned int address;
       
              if(y==1)
                    address=0x80+x;
              else
                    address=0xc0+x;
        while(lcd_check_busy());
        lcd_write_command(address);
          
       
}

//初始化LCD程序。

void Lcd_Init()
{
    delay_1ms(15);
        lcd_write_command(0x38);
    delay_1ms(5);
        lcd_write_command(0x38);
        delay_1ms(5);
        lcd_write_command(0x38);



    while(lcd_check_busy());//判断LCD忙信号。
        lcd_write_command(0x38);

    while(lcd_check_busy());//判断LCD忙信号。
        lcd_write_command(0x08);//显示关闭。

    while(lcd_check_busy());//判断LCD忙信号。
        lcd_write_command(0x01);//显示清屏
    delay_40us(41);//清屏执行时间为1.64ms。

    while(lcd_check_busy());//判断LCD忙信号。
        lcd_write_command(0x06);//显示光标移动设置。

    while(lcd_check_busy());//判断LCD忙信号。
        lcd_write_command(0x0C);//显示开及光标设置


}


void delay_1ms(unsigned int t1)//延时d1ms*1ms.
{

unsigned int k1,j1;
while(t1>0)
{
   for(k1=0;k1<1000;k1++)//延时1ms
       {
             for(j1=0;j1<150;j1++){}

          
       }


      t1--;
   }




}


void delay_40us(unsigned int t2)
{
   unsigned int k2;
   while(t2>0)
   {
         
         for(k2=0;k2<6000;k2++){}//延时40us。
               t2--;
        }

}



那个大神帮我看看,哪儿有问题啊

zhangmangui 发表于 2015-12-15 21:19

没看出来       确认一下你得延时量吧

jiangkeqin_sy 发表于 2015-12-16 08:53

延时量,是延时时间不对吗?我的用的是150MHz的。第一个延时1ms,第二个延时40个us,不是lcd的很多命令执行要40us吗,求大神帮忙分析一下啊
页: [1]
查看完整版本: 新手求助,用DSP直接驱动lcd1602