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

📄 zlg7290.lst

📁 数码管 按键芯片zlg7290的atmega128 的c语言程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0058 EFCF      LDI	R28,0xFF
    0059 E1D0      LDI	R29,0x10
    005A BFCD      OUT	P3D,R28
    005B BFDE      OUT	P3E,R29
    005C 51C0      SUBI	R28,0x10
    005D 40D0      SBCI	R29,0
    005E EA0A      LDI	R16,0xAA
    005F 8308      STD	R16,0+Y
    0060 2400      CLR	R0
    0061 E1E4      LDI	R30,0x14
    0062 E0F1      LDI	R31,1
    0063 E011      LDI	R17,1
    0064 31E4      CPI	R30,0x14
    0065 07F1      CPC	R31,R17
    0066 F011      BEQ	0x0069
    0067 9201      ST	R0,Z+
    0068 CFFB      RJMP	0x0064
    0069 8300      STD	R16,0+Z
    006A E9EC      LDI	R30,0x9C
    006B E0F0      LDI	R31,0
    006C E0A0      LDI	R26,0
    006D E0B1      LDI	R27,1
    006E E010      LDI	R17,0
    006F 3BE0      CPI	R30,0xB0
    0070 07F1      CPC	R31,R17
    0071 F021      BEQ	0x0076
    0072 95C8      LPM
    0073 9631      ADIW	R30,1
    0074 920D      ST	R0,X+
    0075 CFF9      RJMP	0x006F
    0076 940E031A  CALL	_main
_exit:
    0078 CFFF      RJMP	_exit
_delay:
  x                    --> R20
  y                    --> R22
  z                    --> R16
    0079 940E0365  CALL	push_gset2
FILE: E:\PQ-1A\我的AVR\zlg7290\TWI.C
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) #include "TWI.h"
(0005) 
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) #define Page_size 8
(0009) #define Page_mask Page_size-1
(0010) //#pragma data:code 
(0011) //const 
(0012) char   table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 
(0013) char    table1[8]={0,0,0,0,0,0,0,0};
(0014) void delay(uint z)
(0015) {
(0016)   uint x,y;
(0017)   for(x=z;x>0;x--)
    007B 01A8      MOVW	R20,R16
    007C C00A      RJMP	0x0087
(0018)    for(y=1100;y>0;y--);
    007D E46C      LDI	R22,0x4C
    007E E074      LDI	R23,4
    007F C002      RJMP	0x0082
    0080 5061      SUBI	R22,1
    0081 4070      SBCI	R23,0
    0082 3060      CPI	R22,0
    0083 0767      CPC	R22,R23
    0084 F7D9      BNE	0x0080
    0085 5041      SUBI	R20,1
    0086 4050      SBCI	R21,0
    0087 3040      CPI	R20,0
    0088 0745      CPC	R20,R21
    0089 F799      BNE	0x007D
(0019) }
    008A 940E0375  CALL	pop_gset2
    008C 9508      RET
(0020) 
(0021) 
(0022) /*
(0023) 函数:TWI_init()
(0024) 功能:I2C总线初始化,使总线处于空闲状态
(0025) 说明:在main()函数的开始处,通常应当要执行一次本函数
(0026) */
(0027) void TWI_init()
(0028) {
(0029)     TWBR=0X22;
_TWI_init:
    008D E282      LDI	R24,0x22
    008E 93800070  STS	R24,0x70
(0030) 	TWSR=0;
    0090 2422      CLR	R2
    0091 92200071  STS	R2,0x71
(0031) 	TWCR=0X44; 
    0093 E484      LDI	R24,0x44
    0094 93800074  STS	R24,0x74
(0032) }
    0096 9508      RET
(0033) 
(0034) /*
(0035) 函数:TWI_start()
(0036) 功能:产生I2C总线的起始状态
(0037) 说明:
(0038) 	本函数也可以用来产生重复起始状态
(0039) 	本函数执行后,I2C总线处于忙状态
(0040) */
(0041) uchar TWI_start(void)
(0042) {
(0043)     TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_TWI_start:
    0097 EA84      LDI	R24,0xA4
    0098 93800074  STS	R24,0x74
(0044) 	while(!(TWCR&(1<<TWINT)));
    009A 90200074  LDS	R2,0x74
    009C FE27      SBRS	R2,7
    009D CFFC      RJMP	0x009A
(0045) 	return 1;
    009E E001      LDI	R16,1
    009F 9508      RET
(0046) }
(0047) 
(0048) void TWI_stop(void)
(0049) {
(0050)     TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_TWI_stop:
    00A0 E984      LDI	R24,0x94
    00A1 93800074  STS	R24,0x74
(0051) }
    00A3 9508      RET
_TWI_writeB:
  ack                  --> R20
  c                    --> R16
    00A4 940E034E  CALL	push_gset1
(0052) 
(0053) /*
(0054) 函数:TWI_writeB()
(0055) 功能:向I2C总线写1个字节的数据
(0056) 返回:
(0057)       0: 从机无应答
(0058) 	  1:从机应答
(0059) 参数:
(0060) 	c:要写到总线上的数据
(0061) */
(0062) uchar TWI_writeB(uchar c)
(0063) {
(0064)     uchar ack=1;
    00A6 E041      LDI	R20,1
(0065) 	TWDR=c;
    00A7 93000073  STS	R16,0x73
(0066) 	TWCR=(1<<TWINT)|(1<<TWEN);
    00A9 E884      LDI	R24,0x84
    00AA 93800074  STS	R24,0x74
(0067) 	while(!(TWCR&(1<<TWINT)));
    00AC 90200074  LDS	R2,0x74
    00AE FE27      SBRS	R2,7
    00AF CFFC      RJMP	0x00AC
(0068) 	if((TWSR&0xF8)!=SLA_W_ACK)
    00B0 91800071  LDS	R24,0x71
    00B2 7F88      ANDI	R24,0xF8
    00B3 3188      CPI	R24,0x18
    00B4 F009      BEQ	0x00B6
(0069) 	  ack=0;
    00B5 2744      CLR	R20
(0070) 	return ack;
    00B6 2F04      MOV	R16,R20
    00B7 940E0351  CALL	pop_gset1
    00B9 9508      RET
(0071) }
(0072) 
(0073) /*
(0074) 函数:TWI_readB()
(0075) 功能:从从机读取1个字节的数据
(0076) 返回:读取的一个字节数据
(0077) 说明:ack=0; 不应答
(0078)       ack=1;  应答
(0079) */
(0080) uchar TWI_readB(uchar ack)
(0081) {
(0082)    if(ack)
_TWI_readB:
  ack                  --> R16
    00BA 2300      TST	R16
    00BB F021      BEQ	0x00C0
(0083)       TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN); 
    00BC EC84      LDI	R24,0xC4
    00BD 93800074  STS	R24,0x74
    00BF C003      RJMP	0x00C3
(0084)    else
(0085)       TWCR=(1<<TWINT)|(1<<TWEN);
    00C0 E884      LDI	R24,0x84
    00C1 93800074  STS	R24,0x74
(0086)    while(!(TWCR&(1<<TWINT)));
    00C3 90200074  LDS	R2,0x74
    00C5 FE27      SBRS	R2,7
    00C6 CFFC      RJMP	0x00C3
(0087)    return(TWDR);
    00C7 91000073  LDS	R16,0x73
    00C9 9508      RET
_TWI_page_write:
  i                    --> R20
  arr                  --> R22
  n                    --> R10
  addr                 --> R20
  devadd               --> R12
    00CA 940E036D  CALL	push_gset4
    00CC 2F42      MOV	R20,R18
    00CD 2EC0      MOV	R12,R16
    00CE 84A8      LDD	R10,8+Y
    00CF 856A      LDD	R22,10+Y
    00D0 857B      LDD	R23,11+Y
(0088) }
(0089) 
(0090) /*
(0091) 函数:TWI_page_write()
(0092) 功能:I2C总线综合发送函数,向从机发送多个字节的数据,整页发送
(0093) 参数:
(0094) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0095) 	addr:从机的子地址
(0096) 	*arr:要发送的数据
(0097) 	   n:数据的字节数
(0098) 返回:
(0099) 	1:发送成功
(0100) 	0:在发送过程中出现异常
(0101) 说明:
(0102) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0103) 	当从机没有子地址时,参数addr任意
(0104) */
(0105) uchar TWI_page_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
(0106) {
(0107)     uchar i;
(0108) 	TWI_start();
    00D1 DFC5      RCALL	_TWI_start
(0109) 	TWI_writeB(devadd);
    00D2 2D0C      MOV	R16,R12
    00D3 DFD0      RCALL	_TWI_writeB
(0110) 	TWI_writeB(addr);
    00D4 2F04      MOV	R16,R20
    00D5 DFCE      RCALL	_TWI_writeB
(0111) 	for(i=1;i<=n;i++)
    00D6 E041      LDI	R20,1
    00D7 C006      RJMP	0x00DE
(0112) 	 {
(0113) 	   //TWI_writeB(i);
(0114) 	   //table[i]=i;
(0115) 	   TWI_writeB(*arr);
    00D8 01FB      MOVW	R30,R22
    00D9 8100      LDD	R16,0+Z
    00DA DFC9      RCALL	_TWI_writeB
(0116) 	   arr++;
    00DB 5F6F      SUBI	R22,0xFF
    00DC 4F7F      SBCI	R23,0xFF
    00DD 9543      INC	R20
    00DE 16A4      CP	R10,R20
    00DF F7C0      BCC	0x00D8
(0117) 	 }
(0118) 	TWI_stop();
    00E0 DFBF      RCALL	_TWI_stop
(0119) 	delay(80);
    00E1 E500      LDI	R16,0x50
    00E2 E010      LDI	R17,0
    00E3 DF95      RCALL	_delay
(0120) }
    00E4 940E037B  CALL	pop_gset4
    00E6 9508      RET
_TWI_write:
  n_tmp                --> R14
  arr                  --> R20
  n                    --> R22
  addr                 --> R10
  devadd               --> R12
    00E7 940E0371  CALL	push_gset5
    00E9 2EA2      MOV	R10,R18
    00EA 2EC0      MOV	R12,R16
    00EB 9724      SBIW	R28,4
    00EC 856E      LDD	R22,14+Y
    00ED 8948      LDD	R20,16+Y
    00EE 8959      LDD	R21,17+Y
(0121) 
(0122) /*
(0123) 函数:TWI_page_write()
(0124) 功能:I2C总线综合发送函数,向从机发送多个字节的数据
(0125) 参数:
(0126) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0127) 	addr:从机的子地址
(0128) 	*arr:要发送的数据
(0129) 	   n:数据的字节数
(0130) 返回:
(0131) 	1:发送成功
(0132) 	0:在发送过程中出现异常
(0133) 说明:
(0134) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0135) 	当从机没有子地址时,参数addr任意
(0136) */
(0137) uchar TWI_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
(0138) {
(0139)     uchar n_tmp;
(0140) 	n_tmp=Page_size-(uchar)(addr&Page_mask);
    00EF 2D8A      MOV	R24,R10
    00F0 2799      CLR	R25
    00F1 7087      ANDI	R24,7
    00F2 7090      ANDI	R25,0
    00F3 E098      LDI	R25,0x8
    00F4 2EE9      MOV	R14,R25
    00F5 1AE8      SUB	R14,R24
(0141) 	if((n>n_tmp)&&(n_tmp!=0))
    00F6 16E6      CP	R14,R22
    00F7 F4E0      BCC	0x0114
    00F8 20EE      TST	R14
    00F9 F0D1      BEQ	0x0114
(0142) 	 {
(0143) 	   TWI_page_write(devadd,addr,n_tmp,arr);//
    00FA 834A      STD	R20,2+Y
    00FB 835B      STD	R21,3+Y
    00FC 82E8      STD	R14,0+Y
    00FD 2D2A      MOV	R18,R10
    00FE 2D0C      MOV	R16,R12
    00FF DFCA      RCALL	_TWI_page_write
(0144) 	   addr+=n_tmp;
    0100 0CAE      ADD	R10,R14
(0145) 	   n-=n_tmp;
    0101 196E      SUB	R22,R14
(0146) 	   arr+=n_tmp;
    0102 2C2E      MOV	R2,R14
    0103 2433      CLR	R3
    0104 0D42      ADD	R20,R2
    0105 1D53      ADC	R21,R3
(0147) 	 }
    0106 C00D      RJMP	0x0114
(0148) 	while(n>=Page_size)
(0149) 	 {
(0150) 	   TWI_page_write(devadd,addr,Page_size,arr);//
    0107 834A      STD	R20,2+Y
    0108 835B      STD	R21,3+Y
    0109 E088      LDI	R24,0x8
    010A 8388      STD	R24,0+Y
    010B 2D2A      MOV	R18,R10
    010C 2D0C      MOV	R16,R12
    010D DFBC      RCALL	_TWI_page_write
(0151) 	   addr+=Page_size;
    010E 2D8A      MOV	R24,R10
    010F 5F88      SUBI	R24,0xF8
    0110 2EA8      MOV	R10,R24
(0152) 	   n-=Page_size;
    0111 5068      SUBI	R22,0x8
(0153) 	   arr+=Page_size;
    0112 5F48      SUBI	R20,0xF8
    0113 4F5F      SBCI	R21,0xFF
    0114 3068      CPI	R22,0x8
    0115 F788      BCC	0x0107
(0154) 	 }
(0155) 	if(n!=0)
    0116 2366      TST	R22
    0117 F031      BEQ	0x011E
(0156) 	   TWI_page_write(devadd,addr,n,arr);//
    0118 834A      STD	R20,2+Y
    0119 835B      STD	R21,3+Y
    011A 8368      STD	R22,0+Y
    011B 2D2A      MOV	R18,R10
    011C 2D0C      MOV	R16,R12
    011D DFAC      RCALL	_TWI_page_write
(0157) }
    011E 9624      ADIW	R28,4
    011F 940E037E  CALL	pop_gset5
    0121 9508      RET
_TWI_read:
  i                    --> R20
  arr                  --> R22
  n                    --> R10
  addr                 --> R12
  devadd               --> R20
    0122 940E036D  CALL	push_gset4
    0124 2EC2      MOV	R12,R18
    0125 2F40      MOV	R20,R16
    0126 84A8      LDD	R10,8+Y
    0127 856A      LDD	R22,10+Y
    0128 857B      LDD	R23,11+Y
(0158) 
(0159) /*
(0160) 函数:TWI_read()
(0161) 功能:I2C总线综合接收函数,从从机接收多个字节的数据
(0162) 参数:
(0163) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0164) 	addr:从机的子地址
(0165) 	*arr:要发送的数据
(0166) 	   n:数据的字节数
(0167) 返回:
(0168) 	1:接收成功
(0169) 	0:在接收过程中出现异常
(0170) 说明:
(0171) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0172) 	当从机没有子地址时,参数addr任意
(0173) */
(0174) uchar TWI_read(uchar devadd,uchar addr,uchar n,uchar *arr)
(0175) {
(0176)     uchar i;
(0177) 	TWI_start();
    0129 DF6D      RCALL	_TWI_start
(0178) 	TWI_writeB(devadd);
    012A 2F04      MOV	R16,R20
    012B DF78      RCALL	_TWI_writeB
(0179) 	TWI_writeB(addr);
    012C 2D0C      MOV	R16,R12
    012D DF76      RCALL	_TWI_writeB
(0180) 	TWI_start();
    012E DF68      RCALL	_TWI_start
(0181) 	TWI_writeB(devadd|1);
    012F 2F04      MOV	R16,R20
    0130 6001      ORI	R16,1
    0131 DF72      RCALL	_TWI_writeB
(0182) 	for(i=1;i<=n-1;i++)
    0132 E041      LDI	R20,1
    0133 C007      RJMP	0x013B
(0183) 	 {
(0184) 	  *arr= TWI_readB(1);
    0134 E001      LDI	R16,1
    0135 DF84      RCALL	_TWI_readB
    0136 01FB      MOVW	R30,R22
    0137 8300      STD	R16,0+Z
(0185) 	   arr++;
    0138 5F6F      SUBI	R22,0xFF
    0139 4F7F      SBCI	R23,0xFF
    013A 9543      INC	R20
    013B 2D8A      MOV	R24,R10
    013C 5081      SUBI	R24,1
    013D 1784      CP	R24,R20
    013E F7A8      BCC	0x0134
(0186) 	 }
(0187) 	  *arr= TWI_readB(0);
    013F 2700      CLR	R16
    0140 DF79      RCALL	_TWI_readB
    0141 01FB      MOVW	R30,R22
    0142 8300      STD	R16,0+Z
(0188) 	  TWI_stop();
    0143 DF5C      RCALL	_TWI_stop
(0189) }
    0144 940E037B  CALL	pop_gset4
    0146 9508      RET
_ZLG7290_WriteReg:
  dat                  --> Y+6
  dat                  --> Y+6
  RegAddr              --> R20
    0147 933A      ST	R19,-Y
    0148 932A      ST	R18,-Y
    0149 940E034E  CALL	push_gset1
    014B 2F40      MOV	R20,R16
    014C 9724      SBIW	R28,4
FILE: E:\PQ-1A\我的AVR\zlg7290\zlg7290.c
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) //#include <stdio.h>
(0005) #include "TWI.C"
(0006) #include "zlg7290.h"
(0007) 
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010) 
(0011) 
(0012) /*
(0013) 函数:ZLG7290_WriteReg()
(0014) 功能:向ZLG7290的某个内部寄存器写入数据
(0015) 参数:
(0016) 	RegAddr:ZLG7290的内部寄存器地址
(0017) 	dat:要写入的数据
(0018) 返回:
(0019) 	1:正常
(0020) 	0:访问ZLG7290时出现异常
(0021) */
(0022) void ZLG7290_WriteReg(uchar RegAddr, uchar dat)
(0023) {
(0024)   TWI_write(ZLG7290_I2C_ADDR,RegAddr,1,&dat);
    014D 01CE      MOVW	R24,R28
    014E 9606      ADIW	R24,6
    014F 838A      STD	R24,2+Y
    0150 839B      STD	R25,3+Y
    0151 E081      LDI	R24,1
    0152 8388      STD	R24,0+Y
    0153 2F24      MOV	R18,R20
    0154 E700      LDI	R16,0x70
    0155 DF91      RCALL	_TWI_write
(0025) }
    0156 9624      ADIW	R28,4
    0157 940E0351  CALL	pop_gset1
    0159 9622      ADIW	R28,2
    015A 9508      RET
_ZLG7290_ReadReg:
  dat                  --> R22
  RegAddr              --> R20
    015B 940E0365  CALL	push_gset2
    015D 01B9      MOVW	R22,R18

⌨️ 快捷键说明

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