⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ocm4x8c.c

📁 在DSP上实现I2C的时序
💻 C
字号:

//******************************************************//
//FILE: ocm4x8c.c
// 液晶显示程序

#include "DSP281x_Device.h" 
#include "DSP281x_Examples.h"    
#include "DSP281x_GlobalPrototypes.h" 


#define BF  GpioDataRegs.GPBDAT.bit.GPIOB7       
#define RS  GpioDataRegs.GPBDAT.bit.GPIOB8      //H=data; L=command
#define RW  GpioDataRegs.GPBDAT.bit.GPIOB9      //H=read; L=write
#define EN  GpioDataRegs.GPBDAT.bit.GPIOB10     //input enable
#define RESET_LCD GpioDataRegs.GPEDAT.bit.GPIOE2 //Reset Signal 低电平有效
#define COMM  0   //command
#define DATA  1   //data


// Prototype statements for functions found within this file.
void Gpio_select(void);
void InitSystem(void);
void InitLcd(void);
void Wr_lcd(Uchar data_comm,Uchar data);//写指令或数据

void Chn_Disp(Uchar *chn); //OK

void Img_Dispfull(Uchar *img);//全屏显示图形 OK
void Img_Disp(int x,int y,Uint16 height,Uint16 width,Uchar *img);//区域显示图形 OK
void Img_clr(int x,int y,Uint16 height,Uint16 width);//清除图形 OK

void Con_Disprow(int row);//反白显示  OK
void con_disp(Uchar data1,Uchar data2,int x0,int y0,int x1,int y1);
void Con_disparea(int x, int y, int height,int width);

void lat_disp(Uchar data1,Uchar data2); //data1=data2=0x00--clear screen
                                           
void origin_cur(void);
void cur_disp(Uchar data1,Uchar data2,Uchar x,Uchar y); //光标显示
void Move_cur(int dir);
void OnOff_cur(Uchar cur_con,Uchar cur_on);

void Chk_Busy(void);//测试忙状态
void Clr_ram(void);//Clear Scream/DDRam
Uchar Read_lcd(void);
void delay (int delay);
void delay_s(int ss);
int Max(int x,int y);
int Min(int x,int y);

Uchar addr[]={0x80,0x90,0x88,0x98};

Uchar tab1[]={
"本系列中文模块ke"
"任意位置反白显sh"
"置二级字库,可在"
"使用更方便更灵活"
};

/*Uchar tab2[]={
"金鹏科技有限公司"
"Golden Palm TECH"
"奥可拉液晶显示器"
"TEL:0758-2263858"
};*/
Uchar tab3[]={
"    科技有限    "
"                "
"TEL:0758-2263858"
"0x00,0x000x000x00,0x00"
};


//bmp图2:小的太阳
//Uchar tab4[]={
/*--  调入了一幅图像:C:\Documents and Settings\mirror\桌面\bmp\www.imagebt.bmp  --*/
/*--  宽度x高度=64x64  --*/
/*0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xF7,0xFF,
0xFF,0xCF,0xFF,0x7F,0xF7,0xFF,0xE3,0xFF,0xFF,0xE7,0xFF,0x7F,0xF7,0xFF,0xE7,0xFF,
0xFF,0xF7,0xFF,0x3F,0xF7,0xFF,0xCF,0xFF,0xFF,0xF3,0xFF,0xBF,0xF7,0xFF,0x8F,0xFF,
0xFF,0xF9,0xFF,0xBF,0xF7,0xFF,0x9F,0xFF,0xFF,0xFD,0xFF,0xBF,0xF7,0xFF,0x3F,0xFF,
0xFF,0xFC,0xFF,0x9F,0xF7,0xFE,0x3F,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,
0xFF,0xFF,0x7F,0xFF,0xFF,0xFC,0xFF,0xFF,0xF7,0xFF,0x3F,0xFF,0xFF,0xF9,0xFF,0xFF,
0xE3,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xF8,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0x9F,
0xFC,0x7F,0xFF,0x80,0x00,0xFF,0xFF,0x1F,0xFE,0x3F,0xFE,0x00,0x00,0x3F,0xFE,0x3F,
0xFF,0x1F,0xF8,0x00,0x00,0x0F,0xFC,0xFF,0xFF,0xBF,0xE0,0x00,0x00,0x07,0xFF,0xFF,
0xFF,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x7F,0xFF,
0xFF,0xFC,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x1F,0xFF,
0xFF,0xF8,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x0F,0xFF,
0xFF,0xF0,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x07,0xFF,
0xFF,0xF0,0x00,0x00,0x00,0x78,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x00,0xFC,0x07,0xFF,
0xFF,0xE0,0x78,0x00,0x00,0xFC,0x03,0xFF,0xFF,0xE0,0xFC,0x00,0x00,0xFC,0x03,0xFF,
0xFF,0xE0,0xFE,0x00,0x00,0xFC,0x03,0xFF,0xFF,0xC0,0xFE,0x00,0x00,0xFC,0x03,0xFF,
0xFF,0xC0,0xFE,0x00,0x00,0x10,0x03,0xFF,0xFF,0xC0,0xFC,0x00,0x00,0x00,0x03,0xFF,
0xFF,0xC0,0x38,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x03,0xFF,
0xFF,0xE0,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x01,0xFF,0x03,0xFF,
0xFF,0xE0,0x00,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xFF,0x07,0xFF,
0xFF,0xF0,0xFF,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,
0xFF,0xF8,0x7F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x1F,0xFF,
0xFF,0xFC,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xE0,0x3F,0xFF,
0xFF,0xFE,0x07,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0x80,0x7F,0xFF,
0xFF,0xFF,0x80,0x7F,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xC0,0x07,0xF0,0x01,0xFF,0xFF,
0xFF,0xFF,0xE0,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x0F,0xFF,0xFF,
0xFF,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
*/
////////////////////////////////////////////////////////////////////
//fuction:显示汉字或字符->第二行反白显示->全屏显示图形->清除图形->
//->显示图形->
/*void main()
{
  //Uchar i;
  InitSystem();
  DINT;
  IER = 0x0000;
  IFR = 0x0000;
// Initialize Pie Control Registers To Default State:
  InitPieCtrl();
  InitPieVectTable();	
  Gpio_select();
  RESET_LCD = 0;
  delay(1500);
  RESET_LCD = 1;
  InitLcd();
  delay(3000);
    Chn_Disp(tab2);
    delay_s(5);  
    Con_Disprow(1);
    delay_s(5);  
    Clr_ram();
    Img_Dispfull(tab5);
    delay_s(3);
    Img_Disp(10,10,64,64,tab4);
    delay_s(5);
    Img_clr(0,0,20,20);
  for(;;)
  {}

}*/
// 子程序
/*void Gpio_select(void)
{
	EALLOW;
    GpioMuxRegs.GPBMUX.all = 0x0;   
    GpioMuxRegs.GPEMUX.all = 0x0; 	
										
    GpioMuxRegs.GPBDIR.all = 0xFFFF;	// GPIO Ports---- output
    GpioMuxRegs.GPEDIR.all = 0xFFFF;	// GPIO PORT  as input//IOE2--/RST

    GpioMuxRegs.GPBQUAL.all = 0x0;
    GpioMuxRegs.GPEQUAL.all = 0x0;
    EDIS;
} */  

/*void InitSystem(void)
{
   	Uint16 i;
   	EALLOW;
    // 禁止看门狗模块
   	SysCtrlRegs.WDCR= 0x0068;		
   	//初始化锁相环
   SysCtrlRegs.PLLCR.bit.DIV = 10;	// 配置处理器锁相环,倍频系数为5 
   	//等待锁相环稳定
   	for(i=0;i<5000;i++){}	
   	
   	SysCtrlRegs.HISPCP.all = 0x0001; // Setup Highspeed Clock Prescaler to divide by 2 (75MHz)
   	SysCtrlRegs.LOSPCP.all = 0x0002; // Setup Lowspeed CLock Prescaler to divide by 4 (37.5MHz)
      	
   	// Peripheral clock enables set for the selected peripherals.   
   	SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
   	SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
   	SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
   	SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
   	SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
   	EDIS;
}  
*/
//LCD初始化子程序
void InitLcd(void)
{  RESET_LCD=1;
   Wr_lcd (COMM,0x30);  /* 30---基本指令动作 */
   delay(1500);
   Wr_lcd (COMM,0x01);  /* 清除显示,DDRAM地址指针指向00H */
   delay(1500);
   Wr_lcd (COMM,0x06);  /* 光标右移 */
   delay(1500);
   Wr_lcd (COMM,0x0c);  /* 开显示,关光标 */
}

/*---------------显示汉字或字符----------------*/
void Chn_Disp(Uchar *chn)
{
  Uchar i,j;
  Wr_lcd(COMM,0x30);
  Wr_lcd(COMM,0x80);
  for (i=0;i<4;i++)
  {
    for (j=0;j<16;j++)
    Wr_lcd(DATA,chn[i*16+j]);
  }
}
/****************************************************/

/*----------------显示图形-----------------*/
//显示的步骤:
//1. 先将垂直的字节坐标(Y)写入绘图RAM 地址。
//2. 再将水平的字节坐标(X)写入绘图RAM 地址。
//3. 将D15~D8 写入到RAM 中(写入第一个Bytes)。
//4. 将D7~D0 写入到RAM 中(写入第二个Bytes)。
void Img_Dispfull(Uchar *img)
{
  Uchar i,j,k=0;
  //上半屏
  for(i=0;i<32;i++)
  {
    for(j=0;j<8;j++)
    {
      Wr_lcd(COMM,0x34); //扩充指令  绘图显示
      Wr_lcd(COMM,0x80+i); //设定绘图地址80H~FFH
      Wr_lcd(COMM,0x80+j);//80H~87H
      Wr_lcd(COMM,0x30); //变更指令集
      Wr_lcd(DATA,img[k]);    //一个字节
      Wr_lcd(DATA,img[k+1]);  //一个字节
      k=k+2;
    }
  }
 //下半屏
  for(i=32;i<64;i++)
  {
    for(j=0;j<8;j++)
    {
      Wr_lcd(COMM,0x34); //
      Wr_lcd(COMM,0x80+i-32);
      Wr_lcd(COMM,0x88+j);
      Wr_lcd(COMM,0x30);
      Wr_lcd(DATA,img[k]);  //D15-D8
      Wr_lcd(DATA,img[k+1]); //D7-D0
      k=k+2;
    }
  }
  Wr_lcd(COMM,0x36); //送显示图形指令 
}

//显示图形:起点(x,y) width X height
void Img_Disp(int x,int y,Uint16 height,Uint16 width,Uchar *img)
{
  Uchar i,j,m,n,k;
  //if(x<0||x>31||y<0||height%16!=0||width%16!=0)return;
    for(i=x;i<Min(x+height,64);i++) //row
    {
      for(j=y;j<Min(y+width,128);j+=16) //col
      {
		  if (i>=32) 
		     {    m = i-32;
			  n=j/16;  //0x80
		 	  k=1; }  

		  else
		     {m=i;
		      n=j/16;
		      k=0;}
        Wr_lcd(COMM,0x34);//扩展指令
        Wr_lcd(COMM,0x80+m);
        Wr_lcd(COMM,0x80+0x08*k+n);
        Wr_lcd(COMM,0x30);
        Wr_lcd(DATA,img[(i-x)*width/8+(j-y)/8]);  //image i,j---点阵表示
        Wr_lcd(DATA,img[(i-x)*width/8+(j-y)/8+1]);//
       }
    }
   Wr_lcd(COMM,0x36);//显示图形
}
//清除图形:起点(x,y) width X height
void Img_clr(int x,int y,Uint16 height,Uint16 width)
{
  Uchar i,j,m,n,k;
  //if(x<0||x>31||y<0||height%16!=0||width%16!=0)return;
  for(i=x;i<Min(x+height,64);i++) //row
    {
      for(j=y;j<Min(y+width,128);j+=16) //col
      {
		  if (i>=32) 
		     {m = i-32;
			  n=j/16;  //0x80
			  k=1; }  
		  else
		     {m=i;
		      n=j/16;
		      k=0;}
        Wr_lcd(COMM,0x34);//扩展指令,关闭图形
        Wr_lcd(COMM,0x80+m);
        Wr_lcd(COMM,0x80+0x08*k+n);//设地址
        Wr_lcd(COMM,0x30);//基本指令
        Wr_lcd(DATA,0x0);
        Wr_lcd(DATA,0x0);
        }
  }
   Wr_lcd(COMM,0x36);//显示图形
}
/*---------------反白显示---------------------------*/
//ocm4x8c 的一三行为反白选择的第一行,二四行为反白选择的第二行
//Function1:
//某一行反白显示  04H~07H
void Con_Disprow(int row)
{
  if(row<0||row>4)return;
  Wr_lcd(COMM,0x34); //扩展指令 关闭图形
  row&=0x03; 
  Wr_lcd(COMM,0x04+row);//
  Wr_lcd(COMM,0x30); //基本指令
}

//当data1=0xFF,data2=0xFF时,在x0,y0处反白显示16x1*y1.
//当data1=0xff,data2=0x00时,在x0,y0处前半反白显示8x1*y1.
//当data1=0x00,data2=0xff时,在x0,y0处后半反白显示8x1*y1.
void con_disp(Uchar data1,Uchar data2,int x0,int y0,int x1,int y1)
{
  Uchar i,j;
  for(j=0;j<y1;j++)
  {
    for(i=0;i<x1;i++)
    {
      Wr_lcd(COMM,0x34);
      Wr_lcd(COMM,y0+j); 
      Wr_lcd(COMM,x0+i);
      Wr_lcd(COMM,0x30);
      Wr_lcd(DATA,data1);
      Wr_lcd(DATA,data2);
    }
  }
   Wr_lcd (COMM,0x36); // 绘图显示
}

//某一区域反白显示
void Con_disparea(int x, int y, int height,int width)
{
	Uchar i,j,m,n,k,data1,data2;
    if(y<0||y>15||x<0||x>31||0!=(height%16)||0!=(width%16)) return;
    for(i=x;i<Max(x+height,64);i++)
    {
		for(j=y;j<Max(y+width,128);j+=16)
		{
			if (i>=32) 
			   {m=i-32;
			    n=j/16;
			    k=1;}
			else{m=i;
				 n= j/16;
				 k=0;}
			Wr_lcd(COMM,0x34);//扩展指令,关闭图形
			Wr_lcd(COMM,0x80+m);
			Wr_lcd(COMM,0x80+0x08*k+n);//设地址
			Wr_lcd(COMM,0x30);//基本指令
			data1= Read_lcd();
		    data2= Read_lcd();
			Wr_lcd(DATA,data1^0xFF);  //
		    Wr_lcd(DATA,data2^0xFF);
		}
    }
	Wr_lcd(COMM,0x36);//显示图形
}
/*--------------显示点阵----------------*/
// data1=0x00,data2=0x00-----clear screen
void lat_disp(Uchar data1,Uchar data2)
{
  Uchar i,j;
  //上半屏
  for(i=0;i<32;i++)
  {
    for(j=0;j<8;j++)
    {
      Wr_lcd(COMM,0x34); //扩充指令  绘图显示
      Wr_lcd(COMM,0x80+i); //设定绘图地址80H~FFH
      Wr_lcd(COMM,0x80+j);//
      Wr_lcd(COMM,0x30); //变更指令集
      Wr_lcd(DATA,data1);  
      Wr_lcd(DATA,data1);
    }
  }
 //下半屏
  for(i=32;i<64;i++)
  {
    for(j=0;j<8;j++)
    {
      Wr_lcd(COMM,0x34); //
      Wr_lcd(COMM,0x80+i-32);
      Wr_lcd(COMM,0x88+j);
      Wr_lcd(COMM,0x30);
      Wr_lcd(DATA,data2);  //D15-D8
      Wr_lcd(DATA,data2); //D7-D0
    }
  }
  Wr_lcd(COMM,0x36); //送显示图形指令 
}

/*-------------------光标显示---------------------------*/
//当data1=0xff,data2=0x00时,在x,y处显示前半光标.
//当data1=0x00,data2=0xff时,在x,y处显示后半光标.
//当data1=0x00,data2=0x00时,在x,y处不显示光标.
//y0=0x8f or y0=0x9f.
void cur_disp(Uchar data1,Uchar data2,Uchar x,Uchar y)
{
  Wr_lcd (COMM,0x34);
  Wr_lcd (COMM,y);
  Wr_lcd (COMM,x);
  Wr_lcd (COMM,0x30);
  Wr_lcd (DATA,data1);
  Wr_lcd (DATA,data2);
  Wr_lcd (COMM,0x36);
}

 //光标回到原点---地址归位
void origin_cur(void)
{
    Wr_lcd (COMM,0x30);
    Wr_lcd (COMM,0x02);
    Wr_lcd (COMM,0x06);
}

//、显示状态 开/关(08H/0CH/ODH/0EH/0FH)
void OnOff_cur(Uchar cur_con,Uchar cur_on)
{ Uchar data;
  if((cur_con==0)&&(cur_on==0))data=0x0C;  //
  if((cur_con==1)&&(cur_on==0))data=0x0D; // 
  if((cur_con==0)&&(cur_on==1))data=0x0E; // show&&not-con
  if((cur_con==1)&&(cur_on==1))data=0x0F; //con&&show
  Wr_lcd(COMM,data);
}

void Move_cur(int dir)  //dir=1/0
{ Uchar data;
  if(dir==1)data=0x14;
  if(dir==0)data=0x10;
  Wr_lcd(COMM,data);
}

//write command or data
void Wr_lcd(Uchar data_comm,Uchar data)
{   Uchar m;
    Chk_Busy();
    RS=data_comm; 
    delay(1500);
    RW=0; 
    delay(1500);
    GpioMuxRegs.GPBDIR.all=0x00;
    m=GpioDataRegs.GPBDAT.all;
    m&=0xFF00;   
    data&=0x00FF; 
    GpioMuxRegs.GPBDIR.all=0xFFFF;
    GpioDataRegs.GPBDAT.all=m|data;
    delay(1500);
    EN=1 ; 
    delay(1500);
    EN=0 ;    
}

//---------------------------------------

Uchar Read_lcd(void)
{   
    Uchar data;
    Chk_Busy();
    RS=1;
    delay(1500);
    RW=1;
    delay(1500);
    data=GpioDataRegs.GPBDAT.all; 
    return data;
}

/*清DDRAM--清屏子程序*/
void Clr_ram(void)
{
  Wr_lcd(COMM,0x30);
  Wr_lcd(COMM,0x01);
  delay(1500);
}

void Chk_Busy(void)
{  
    RS=0;   //
	delay(1500);
    RW=1;   //Read  
	delay(1500);
	EN=1;
	EALLOW;
	GpioMuxRegs.GPBDIR.bit.GPIOB7 = 0;
	EDIS;
    if(BF==1){}
    EALLOW;
	GpioMuxRegs.GPBDIR.bit.GPIOB7 =1;
	EDIS;
    EN=0;
}

//延时,取大取小子程序
void delay (int delay)   //delay time
{
	while(delay--); 
}
 //延时秒程序
void delay_s(int ss)
{ int i;
  while(ss--)
  {i=40;
   do
   {delay(30000);}
   while(i--);
  }
}

int Max(int x,int y)
{
 int max;
 if(x>=y)max=x;
 else max=y;
 return max;
}

int Min(int x,int y)
{
 int min;
 if(x<=y)min=x;
 else min=y;
 return min;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -