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

📄 zlg7290.lst

📁 周立功的zlg7290键盘和LED驱动芯片的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  ZLG7290                                                                07/01/2008 10:48:12 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE ZLG7290
OBJECT MODULE PLACED IN .\zlg7290.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\zlg7290.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <reg52.h>
   2          #include <intrins.h>
   3          #include <absacc.h>
   4          #include <stdio.h>
   5          #include <math.h>
   6          
   7          #define uint  unsigned int
   8          #define uchar unsigned char
   9          #define x     0x80
  10          #define y     0x80
  11          #define comm  0
  12          #define dat1   1
  13          
  14          #define ZLG7290_I2C_ADDR    0x38 //ZLG7290的IIC地址
  15          #define ZLG7290_Key			0x01		//键值寄存器
  16          #define I2C_DELAY_VALUE		12
  17          #define I2C_STOP_WAIT_VALUE	120
  18          sbit 	I2C_SDA=P1^3;            //模拟I2C数据传送位
  19          sbit    I2C_SCL=P1^4;            //模拟I2C时钟控制位
  20                     
  21           
  22          #define  _Nop()  _nop_()        //定义空指令
  23          volatile bit flagint0 = 0;
  24          sbit rs = P1^1;   //H=data; L=command;
  25          sbit rw = P1^0;   //H=read; L=write;
  26          sbit  e = P1^7;   //input enable;
  27          sbit busy=P0^7;   //lcd busy bit
  28          
  29          void wr_lcd (uchar dat_comm,uchar content);
  30          void chk_busy (void);
  31          void delay (uint us);
  32          //I2C总线初始化,使总线处于空闲状态
  33          
  34          void I2C_Stop();
  35          
  36          
  37          //I2C总线综合发送函数,向从机发送多个字节的数据
  38           void I2C_Delay();
  39          void I2C_Start();
  40          void I2C_Write(uchar dat);
  41          char I2C_Read();
  42          bit I2C_GetAck();
  43          void I2C_PutAck(bit ack);
  44          
  45          //I2C总线综合接收函数,从从机接收多个字节的数据
  46          bit I2C_Gets(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,uchar *dat,unsigned char Si
             -ze);
  47          
  48          
  49          bit ZLG7290_ReadReg(unsigned char RegAddr, uchar *dat);
  50          
  51          void chn_disp (uchar code *chn);
  52          void init_lcd (void);
  53          void clrram (void);
  54          void wr_lcd (uchar dat_comm,uchar content);
C51 COMPILER V6.12  ZLG7290                                                                07/01/2008 10:48:12 PAGE 2   

  55          void chk_busy (void);
  56          void delay (uint us);
  57           void del(uchar i,uchar *p);
  58          uchar code tab1[]={
  59          "输入值:"};
  60          
  61          uchar code tab2[]={
  62          "输出值:"};
  63          
  64          unsigned char data I2C_Delay_t;
  65          
  66          /*
  67          宏定义:I2C_Delay()
  68          功能:延时,模拟I2C总线专用
  69          */
  70          void I2C_Delay()
  71          {
  72   1      	I2C_Delay_t=(I2C_DELAY_VALUE);
  73   1      	while (--I2C_Delay_t!=0);
  74   1      }
  75          /*
  76          函数:I2C_Init()
  77          功能:I2C总线初始化,使总线处于空闲状态
  78          说明:在main()函数的开始处,通常应当要执行一次本函数
  79          */
  80          /*void I2C_Init()
  81          {
  82          	I2C_SCL =1;
  83          	I2C_Delay();
  84          	I2C_SDA =1;
  85          	I2C_Delay();
  86          }
  87          /*
  88          函数:I2C_Start()
  89          功能:产生I2C总线的起始状态
  90          说明:
  91          	SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
  92          	不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
  93          	本函数也可以用来产生重复起始状态
  94          	本函数执行后,I2C总线处于忙状态
  95          */
  96          void I2C_Start()
  97          {
  98   1      	I2C_SDA=1;
  99   1      	I2C_Delay();
 100   1      	I2C_SCL=1;
 101   1      	I2C_Delay();
 102   1      	I2C_SDA =0;
 103   1      	I2C_Delay();
 104   1      	I2C_SCL=0;
 105   1      	I2C_Delay();
 106   1      }
 107          /*
 108          函数:I2C_Write()
 109          功能:向I2C总线写1个字节的数据
 110          参数:
 111          	dat:要写到总线上的数据
 112          */
 113          void I2C_Write(uchar dat)
 114          {
 115   1      	unsigned char t=8;
 116   1      	do
C51 COMPILER V6.12  ZLG7290                                                                07/01/2008 10:48:12 PAGE 3   

 117   1      	{
 118   2      		I2C_SDA=(bit)(dat&0x80);
 119   2      		dat <<=1;
 120   2      		I2C_SCL=1;
 121   2      		I2C_Delay();
 122   2      		I2C_SCL=0;
 123   2      		I2C_Delay();
 124   2      	} while (--t!=0);
 125   1      }
 126          /*
 127          函数:I2C_Read()
 128          功能:从从机读取1个字节的数据
 129          返回:读取的一个字节数据
 130          */
 131          char I2C_Read()
 132          {
 133   1      	uchar dat;
 134   1      	unsigned char t=8;
 135   1      	I2C_SDA=1;	
 136   1      	do
 137   1      	{
 138   2      		I2C_SCL=1;
 139   2      		I2C_Delay();
 140   2      		dat<<=1;
 141   2      		if (I2C_SDA)dat|=0x01;
 142   2      		I2C_SCL=0;
 143   2      		I2C_Delay();
 144   2      	} while(--t!=0);
 145   1      	return dat;
 146   1      }
 147          /*函数:I2C_GetAck()
 148          功能:读取从机应答位
 149          返回:
 150          	0:从机应答
 151          	1:从机非应答
 152          说明:
 153          	从机在收到每个字节的数据后,要产生应答位
 154          	从机在收到最后1个字节的数据后,一般要产生非应答位
 155          */
 156          bit I2C_GetAck()
 157          {
 158   1      	bit ack;
 159   1      	I2C_SDA = 1;
 160   1      	I2C_Delay();
 161   1      	I2C_SCL = 1;
 162   1      	I2C_Delay();
 163   1      	ack = I2C_SDA;
 164   1      	I2C_SCL = 0;
 165   1      	I2C_Delay();
 166   1      	return ack;
 167   1      }
 168          /*
 169          函数:I2C_PutAck()
 170          功能:主机产生应答位或非应答位
 171          参数:
 172          	ack=0:主机产生应答位
 173          	ack=1:主机产生非应答位
 174          说明:
 175          	主机在接收完每一个字节的数据后,都应当产生应答位
 176          	主机在接收完最后一个字节的数据后,应当产生非应答位
 177          */
 178          void I2C_PutAck(bit ack)
C51 COMPILER V6.12  ZLG7290                                                                07/01/2008 10:48:12 PAGE 4   

 179          {
 180   1      	I2C_SDA = ack;
 181   1      	I2C_Delay();
 182   1      	I2C_SCL = 1;
 183   1      	I2C_Delay();
 184   1      	I2C_SCL = 0;
 185   1      	I2C_Delay();
 186   1      }
 187          
 188          /*
 189          函数:I2C_Stop()
 190          功能:产生I2C总线的停止状态
 191          说明:
 192          	SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
 193          	不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
 194          	本函数执行后,I2C总线处于空闲状态
 195          */
 196          void I2C_Stop()
 197          {
 198   1      	unsigned int t = I2C_STOP_WAIT_VALUE;
 199   1      	I2C_SDA = 0;
 200   1      	I2C_Delay();
 201   1      	I2C_SCL = 1;
 202   1      	I2C_Delay();
 203   1      	I2C_SDA = 1;
 204   1      	I2C_Delay();
 205   1      	while ( --t != 0 );		//在下一次产生Start之前,要加一定的延时
 206   1      }
 207          /*
 208          函数:I2C_Puts()
 209          功能:I2C总线综合发送函数,向从机发送多个字节的数据
 210          参数:
 211          	SlaveAddr:从机地址(7位纯地址,不含读写位)
 212          	SubAddr:从机的子地址
 213          	SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
 214          	*dat:要发送的数据
 215          	Size:数据的字节数
 216          返回:
 217          	0:发送成功
 218          	1:在发送过程中出现异常
 219          说明:
 220          	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
 221          	当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
 222          */
 223          /*bit I2C_Puts
 224          (
 225          	unsigned char SlaveAddr,
 226          	unsigned int SubAddr,
 227          	unsigned char SubMod,
 228          	char *dat,
 229          	unsigned int Size
 230          )
 231          {
 232          //定义临时变量
 233          	unsigned char i;
 234          	char a[3];
 235          //检查长度
 236          	if ( Size == 0 ) return 0;
 237          //准备从机地址
 238          	a[0] = (SlaveAddr << 1);
 239          //检查子地址模式
 240          	if ( SubMod > 2 ) SubMod = 2;
C51 COMPILER V6.12  ZLG7290                                                                07/01/2008 10:48:12 PAGE 5   

 241          //确定子地址
 242          	switch ( SubMod )
 243          	{
 244          	case 0:
 245          		break;
 246          	case 1:
 247          		a[1] = (char)(SubAddr);
 248          		break;
 249          	case 2:
 250          		a[1] = (char)(SubAddr >> 8);
 251          		a[2] = (char)(SubAddr);
 252          		break;
 253          	default:
 254          		break;
 255          	}
 256          //发送从机地址,接着发送子地址(如果有子地址的话)
 257          	SubMod++;
 258          	I2C_Start();

⌨️ 快捷键说明

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