打印

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

[复制链接]
1344|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiangkeqin_sy|  楼主 | 2015-12-15 20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

//写指令        输入        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[i]!='\0';i++)//第一行显示数据。
   {
        while(lcd_check_busy());//检查忙信号。
                lcd_write_data(dis1[i]);//写第i个字符。
   }
   delay_1ms(10);

   lcd_display_pose(4,1);//从第二行第5个开始写。
     for(i=0;dis2[i]!='\0';i++)//第二行显示数据。
   {
        while(lcd_check_busy());
                lcd_write_data(dis2[i]);
   }
   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吗,求大神帮忙分析一下啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

33

帖子

1

粉丝