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

📄 text1.c

📁 用Keil写的LPC938I2C通讯程序
💻 C
字号:
#include <REG938.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
#define _Nop()  _nop_()
#define GENERATE_STOP        0x54     /* 置位 STO, 复位 STA 、 SI          */
#define RELEASE_BUS_ACK      0x44     /* 复位 STO,STA,SI 并置位  AA (ack)  */
#define RELEASE_BUS_NOACK    0x40     /* 复位 STO,STA,SI 并置位 AA (noack) */
#define RELEASE_BUS_STA      0x64     /* 起动总线/重新起动总线, 置位 STA   */


//定义变量
sbit rt12864_sid = P1^1;	//数据
sbit rt12864_clk = P1^0;	//时钟

extern uchar byte[20];

//void display(uchar *put);
bit RcvByte(uchar *c);
void rt12864_initialization(void);
void dally_timer1(uint data ms);
void rt12864_write1(uchar data TMP1);
void rt12864_write(uchar data LCD_COMMAND,uchar data LCD_TMP);
void rt12864_initialization(void);
void lcd12232_zfc(uchar row,uchar tier,uchar *puts);
void rt12864_clear(void);


uchar code AC_TABLE[]={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      //第一行汉字位置
												0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,      //第二行汉字位置
												0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,      //第三行汉字位置
												0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f};	    //第四行汉字位置

uchar code lcd_tab[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
										    0x41,0x42,0x43,0x44,0x45,0x46};


/********************************************************************
使用定时器1延时n毫秒
********************************************************************/
void dally_timer1(uint data ms)
{
	uint i;
 	TR1=1;//启动定时器T1
  for(i=ms*25;i>0;i--)
  {
		while(TF1==0)
    {
      _Nop();
    };
    TF1=0;//清除T1溢出标志TF1
  }
  TR1=0;//关闭定时器T1
}

/****************************************************************************
* 名称:rt12864_write()
* 功能:LCD读写子程序。
* 入口参数:LCD_COMMAND, LCD_DATA
* 出口参数:无
****************************************************************************/
/**------------------------------------------------------------------------**/
void rt12864_write1(uchar data TMP1)
{
	uchar data i,TMP;
	for(i=8;i>0;i--)
	{
		TMP=(TMP1&(0x01<<(i-1)))>>(i-1);//取数据第7-0位
		if(TMP==0)
		{
			rt12864_sid = 0;		//第i位为0,lcd数据为0
		}
		if(TMP==1)
		{
			rt12864_sid = 1;		//第i位为1,lcd数据为1	
		}	
		rt12864_clk = 0;			//lcd时钟产生一个上升沿
		_Nop();
		_Nop();
		rt12864_clk = 1;			
	}
}
	

/**-----------------------------------------------------------------------**/
void rt12864_write(uchar data LCD_COMMAND,uchar data LCD_TMP)
{
	uchar data TMP1;
  TMP1=LCD_COMMAND;                  //发送lcd指令
  rt12864_write1(TMP1);
  TMP1=LCD_TMP&0xF0;                //发送lcd指令或数据高4位
  rt12864_write1(TMP1);
  TMP1=(LCD_TMP&0x0F)<<4;           //发送lcd指令或数据低4位
  rt12864_write1(TMP1);
}

/****************************************************************************
* 名称:LCDInit()
* 功能:LCD初始化子程序。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void rt12864_initialization(void)
{
	rt12864_write(0xf8,0x01);		//清屏命令
	dally_timer1(40);
	rt12864_write(0xf8,0x30);		//基本指令集
	dally_timer1(40);
	rt12864_write(0xf8,0x02);		//游标归零命令
	dally_timer1(40);
	rt12864_write(0xf8,0x04);		//
	dally_timer1(40);
	rt12864_write(0xf8,0x0c);		//
	dally_timer1(40);
	rt12864_write(0xf8,0x01);		//
	dally_timer1(40);
	rt12864_write(0xf8,0x80);		//
	dally_timer1(40);
}

void lcd12232_zfc(uchar row,uchar tier,uchar *puts)
{
	uchar data tmp;
	tmp = AC_TABLE[8*row+tier];
	rt12864_write(0xf8,tmp);
	while(*puts != '\0')									//等待传送结束
	{
		rt12864_write(0xfa,*puts);							//
		puts++;
	}
}

/***************************************************************
*							接收字节函数
* 功能:读取总线传来的字节数据并发送应答位,正常接收返回1。
* 入口参数:c		此时读入的数据变量的地址
* 出口参数:接收到总线结束信号或重新启动总线信号时返回0
***************************************************************/
bit RcvByte(uchar *c)
{ 
	I2CON = RELEASE_BUS_ACK;     		/* 清除标志位				*/
  while( SI==0 );   				/* 放开总线,等待接收		*/
  if(I2STAT==0xA0)				/* 接收到停止位或重新启动位 */
  { 
		I2CON = RELEASE_BUS_ACK;		/* 先放开总线,再返回0		*/
    return(0);
  }
  *c = I2DAT;       				/* 取数据					*/
  return(1);
}


void intermit ()interrupt 7
{ 
	uchar byte[10]="";
	bit tmp;
	do
	{
 		tmp=RcvByte(byte);
  }while(!tmp);

	lcd12232_zfc(0,0,byte);
	I2CON=I2CON&0xF8;//清除中断标志
  return;
}

void main()
{
	uchar byte1[]="扬州电力设备修造";
  P0M1=0x00;
  P0M2=0x00;
  P1M1=0x0C;//P1.2,P1.3配置为开漏,其他为双向I/O口
  P1M2=0x0C;
  P3M1=0x00;
  P3M2=0x00;

  P0=0xff;
  P1=0xff;
  P3=0xff;

  SP=0x7F;

  TMOD=0x20;//T1工作方式2
  TAMOD=0x00;
  TL1=0x6C;//装入T1初值
  TH1=0x6C;

  I2CON=0x44;//从接收器模式初始化
  I2STAT=0;
  I2ADR=0x70;//从机地址为70h
	I2SCLH=0x0E;//数据波特率为123Kbit/s
  I2SCLL=0x0E;
	
	rt12864_initialization();
  dally_timer1(40);
	
	IEN0=0x80;//开总中断
	IEN1=0x01;//开I2C中断
   
  while(1)
	{
		lcd12232_zfc(1,0,byte1);
		dally_timer1(40);
	}
  
}











⌨️ 快捷键说明

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