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

📄 eeprom.lst

📁 使用ICCAVR编写的AT24C16的读写函数
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    005C EFCF      LDI	R28,0xFF
    005D E1D0      LDI	R29,0x10
    005E BFCD      OUT	0x3D,R28
    005F BFDE      OUT	0x3E,R29
    0060 51C0      SUBI	R28,0x10
    0061 40D0      SBCI	R29,0
    0062 EA0A      LDI	R16,0xAA
    0063 8308      STD	Y+0,R16
    0064 2400      CLR	R0
    0065 E2EC      LDI	R30,0x2C
    0066 E0F1      LDI	R31,1
    0067 E011      LDI	R17,1
    0068 32EC      CPI	R30,0x2C
    0069 07F1      CPC	R31,R17
    006A F011      BEQ	0x006D
    006B 9201      ST	R0,Z+
    006C CFFB      RJMP	0x0068
    006D 8300      STD	Z+0,R16
    006E E8EC      LDI	R30,0x8C
    006F E0F0      LDI	R31,0
    0070 E0A0      LDI	R26,0
    0071 E0B1      LDI	R27,1
    0072 E010      LDI	R17,0
    0073 3BE8      CPI	R30,0xB8
    0074 07F1      CPC	R31,R17
    0075 F021      BEQ	0x007A
    0076 95C8      LPM
    0077 9631      ADIW	R30,1
    0078 920D      ST	R0,X+
    0079 CFF9      RJMP	0x0073
    007A 940E02FA  CALL	_main
_exit:
    007C CFFF      RJMP	_exit
FILE: E:\icc\eeprom\lcd_init.h
(0001) /*
(0002) LCD12864液晶驱动模块
(0003) */
(0004) /*
(0005) PG0---RS---4
(0006) PG1---R/W--5
(0007) PG2---EN---6    
(0008) PA0---DB0---7
(0009) PA1---DB1---8
(0010) PA2---DB2---9
(0011) PA3---DB3---10
(0012) PA4---DB4---11
(0013) PA5---DB5---12
(0014) PA6---DB6---13
(0015) PA7---DB7---14
(0016) 
(0017) */
(0018) #include <iom128v.h>
(0019) #include <macros.h> 
(0020) 
(0021) 
(0022) /*命令或是数据选择*/
(0023) /*RS = 0命令,RS = 1数据*/
(0024) #define RS_CLR PORTG&=~(1<<0)  
(0025) #define RS_SET PORTG|=(1<<0)   
(0026) /*读取或写入选择*/
(0027) /*RW = 1读,RW = 0写*/
(0028) #define RW_CLR PORTG&=~(1<<1)
(0029) #define RW_SET PORTG|=(1<<1)
(0030) /*读写使能信号*/
(0031) /*下降沿有效*/
(0032) #define EN_CLR PORTG&=~(1<<2)
(0033) #define EN_SET PORTG|=(1<<2)
(0034) /*芯片复位脚*/
(0035) /*高电平复位
(0036) #define RST_CLR PORTD&=~(1<<PD7)
(0037) #define RST_SET PORTD|=(1<<PD7)*/
(0038) //延时函数
(0039) void delay (unsigned int n)
(0040) {
(0041) while(n--);
_delay:
  n                    --> R16
    007D 0118      MOVW	R2,R16
    007E 5001      SUBI	R16,1
    007F 4010      SBCI	R17,0
    0080 2022      TST	R2
    0081 F7D9      BNE	0x007D
    0082 2033      TST	R3
    0083 F7C9      BNE	0x007D
    0084 9508      RET
(0042) }
(0043) void chk_busy(void)
(0044) {
(0045)  PORTA=0XFF;
_chk_busy:
    0085 EF8F      LDI	R24,0xFF
    0086 BB8B      OUT	0x1B,R24
(0046)  RS_CLR;
    0087 91800065  LDS	R24,0x65
    0089 7F8E      ANDI	R24,0xFE
    008A 93800065  STS	0x65,R24
(0047)  RW_SET;
    008C 91800065  LDS	R24,0x65
    008E 6082      ORI	R24,2
    008F 93800065  STS	0x65,R24
(0048)  
(0049)  DDRA=0X00;
    0091 2422      CLR	R2
    0092 BA2A      OUT	0x1A,R2
(0050)  
(0051)  EN_SET;
    0093 91800065  LDS	R24,0x65
    0095 6084      ORI	R24,4
    0096 93800065  STS	0x65,R24
(0052)  while(PINA&0X80);
    0098 99CF      SBIC	0x19,7
    0099 CFFE      RJMP	0x0098
(0053)  EN_CLR;
    009A 91800065  LDS	R24,0x65
    009C 7F8B      ANDI	R24,0xFB
    009D 93800065  STS	0x65,R24
(0054)  DDRA=0XFF;
    009F EF8F      LDI	R24,0xFF
    00A0 BB8A      OUT	0x1A,R24
    00A1 9508      RET
_LCD_write_code:
  code                 --> R20
    00A2 940E036F  CALL	push_gset1
    00A4 2F40      MOV	R20,R16
(0055) }
(0056) //显示屏命令写入函数
(0057) void LCD_write_code(unsigned char code)
(0058) {
(0059) chk_busy();
    00A5 DFDF      RCALL	_chk_busy
(0060) RS_CLR;
    00A6 91800065  LDS	R24,0x65
    00A8 7F8E      ANDI	R24,0xFE
    00A9 93800065  STS	0x65,R24
(0061) RW_CLR;
    00AB 91800065  LDS	R24,0x65
    00AD 7F8D      ANDI	R24,0xFD
    00AE 93800065  STS	0x65,R24
(0062) PORTA=code;
    00B0 BB4B      OUT	0x1B,R20
(0063) EN_SET;
    00B1 91800065  LDS	R24,0x65
    00B3 6084      ORI	R24,4
    00B4 93800065  STS	0x65,R24
(0064) delay(100);
    00B6 E604      LDI	R16,0x64
    00B7 E010      LDI	R17,0
    00B8 DFC4      RCALL	_delay
(0065) EN_CLR;
    00B9 91800065  LDS	R24,0x65
    00BB 7F8B      ANDI	R24,0xFB
    00BC 93800065  STS	0x65,R24
    00BE 940E0372  CALL	pop_gset1
    00C0 9508      RET
_LCD_write_data:
  data                 --> R20
    00C1 940E036F  CALL	push_gset1
    00C3 2F40      MOV	R20,R16
(0066) }
(0067) //显示屏数据显写入函数
(0068) void LCD_write_data(unsigned char data)
(0069) {
(0070) chk_busy();
    00C4 DFC0      RCALL	_chk_busy
(0071) RS_SET;
    00C5 91800065  LDS	R24,0x65
    00C7 6081      ORI	R24,1
    00C8 93800065  STS	0x65,R24
(0072) RW_CLR;
    00CA 91800065  LDS	R24,0x65
    00CC 7F8D      ANDI	R24,0xFD
    00CD 93800065  STS	0x65,R24
(0073) PORTA=data;
    00CF BB4B      OUT	0x1B,R20
(0074) EN_SET;
    00D0 91800065  LDS	R24,0x65
    00D2 6084      ORI	R24,4
    00D3 93800065  STS	0x65,R24
(0075) delay(100);
    00D5 E604      LDI	R16,0x64
    00D6 E010      LDI	R17,0
    00D7 DFA5      RCALL	_delay
(0076) EN_CLR; 
    00D8 91800065  LDS	R24,0x65
    00DA 7F8B      ANDI	R24,0xFB
    00DB 93800065  STS	0x65,R24
    00DD 940E0372  CALL	pop_gset1
    00DF 9508      RET
_disp_char:
  asii                 --> R20
  position             --> R22
    00E0 940E036D  CALL	push_gset2
    00E2 2F42      MOV	R20,R18
    00E3 2F60      MOV	R22,R16
(0077) }
(0078) /*单个字符输入函数;position--显示位置,data--显示内容*/
(0079) void disp_char(unsigned char position,unsigned char asii)
(0080) {
(0081)  LCD_write_code(position);
    00E4 2F06      MOV	R16,R22
    00E5 DFBC      RCALL	_LCD_write_code
(0082)  LCD_write_data(asii);
    00E6 2F04      MOV	R16,R20
    00E7 DFD9      RCALL	_LCD_write_data
    00E8 940E0361  CALL	pop_gset2
    00EA 9508      RET
_disp_word:
  word                 --> R20
  position             --> R22
    00EB 940E036D  CALL	push_gset2
    00ED 01A9      MOVW	R20,R18
    00EE 2F60      MOV	R22,R16
(0083) }
(0084) /*一串字符输入函数
(0085) void disp_char_str(unsigned char position,unsigned char *str)
(0086) {
(0087)  LCD_write_code(position);
(0088)  while(*str!=0)                    //含义???
(0089)       {
(0090) 	   
(0091) 	   LCD_write_data(*str);
(0092) 	   str++;
(0093) 	  }
(0094) }*/
(0095) /*汉字输入*/
(0096) void disp_word(unsigned char position,unsigned char *word)
(0097) {
(0098) LCD_write_code(position);//要显示的位置
    00EF 2F06      MOV	R16,R22
    00F0 DFB1      RCALL	_LCD_write_code
    00F1 C005      RJMP	0x00F7
(0099) while(*word!=0)
(0100)      {
(0101) 	  LCD_write_data(*word);
    00F2 01FA      MOVW	R30,R20
    00F3 8100      LDD	R16,Z+0
    00F4 DFCC      RCALL	_LCD_write_data
(0102) 	  word++;
    00F5 5F4F      SUBI	R20,0xFF
    00F6 4F5F      SBCI	R21,0xFF
    00F7 01FA      MOVW	R30,R20
    00F8 8020      LDD	R2,Z+0
    00F9 2022      TST	R2
    00FA F7B9      BNE	0x00F2
    00FB 940E0361  CALL	pop_gset2
    00FD 9508      RET
_disp_number10:
  num_l                --> R22
  num_h                --> R10
  num                  --> R20
  position             --> R22
    00FE 940E036B  CALL	push_gset3
    0100 2F42      MOV	R20,R18
    0101 2F60      MOV	R22,R16
(0103) 	 } 
(0104)  
(0105) }
(0106) //------------------------------------------------------------------------------
(0107) //函数名称:disp_number10()
(0108) //功能:数据的十进制显示,7显示07,12显示12
(0109) //------------------------------------------------------------------------------
(0110) void disp_number10(unsigned char position,unsigned char num)
(0111) {
(0112) unsigned char num_h, num_l;
(0113) LCD_write_code(position);
    0102 2F06      MOV	R16,R22
    0103 DF9E      RCALL	_LCD_write_code
(0114) if(num>=10)
    0104 304A      CPI	R20,0xA
    0105 F088      BCS	0x0117
(0115)   {
(0116)    num_h=(num/10);
    0106 E01A      LDI	R17,0xA
    0107 2F04      MOV	R16,R20
    0108 940E034B  CALL	div8u
    010A 2EA0      MOV	R10,R16
(0117)    num_l=(num%10);
    010B E01A      LDI	R17,0xA
    010C 2F04      MOV	R16,R20
    010D 940E0349  CALL	mod8u
    010F 2F60      MOV	R22,R16
(0118)    LCD_write_data(num_h+0x30);
    0110 2D0A      MOV	R16,R10
    0111 5D00      SUBI	R16,0xD0
    0112 DFAE      RCALL	_LCD_write_data
(0119)    LCD_write_data(num_l+0x30);
    0113 2F06      MOV	R16,R22
    0114 5D00      SUBI	R16,0xD0
    0115 DFAB      RCALL	_LCD_write_data
(0120)   }
    0116 C005      RJMP	0x011C
(0121)   else
(0122)   {
(0123)    LCD_write_data(0x30);
    0117 E300      LDI	R16,0x30
    0118 DFA8      RCALL	_LCD_write_data
(0124)    LCD_write_data(num+0x30);
    0119 2F04      MOV	R16,R20
    011A 5D00      SUBI	R16,0xD0
    011B DFA5      RCALL	_LCD_write_data
(0125)   }
    011C 940E0364  CALL	pop_gset3
    011E 9508      RET
_disp_number16:
  num_l                --> R22
  num_h                --> R10
  num                  --> R20
  position             --> R22
    011F 940E036B  CALL	push_gset3
    0121 2F42      MOV	R20,R18
    0122 2F60      MOV	R22,R16
(0126) 
(0127) }
(0128) //------------------------------------------------------------------------------
(0129) //函数名称:disp_number16()
(0130) //功能:数据的16进制显示,
(0131) //------------------------------------------------------------------------------
(0132) void disp_number16(unsigned char position,unsigned char num)
(0133) {
(0134) unsigned char num_h,num_l;
(0135) 
(0136) LCD_write_code(position);
    0123 2F06      MOV	R16,R22
    0124 DF7D      RCALL	_LCD_write_code
(0137) if(num>=10)
    0125 304A      CPI	R20,0xA
    0126 F080      BCS	0x0137
(0138)      {
(0139) 	 num_h=(num/16);
    0127 2F84      MOV	R24,R20
    0128 9582      SWAP	R24
    0129 708F      ANDI	R24,0xF
    012A 2EA8      MOV	R10,R24
(0140) 	     
(0141) 	 num_l=(num%16);
    012B E110      LDI	R17,0x10
    012C 2F04      MOV	R16,R20
    012D 940E0349  CALL	mod8u
    012F 2F60      MOV	R22,R16
(0142) 	      
(0143) 	 
(0144) 	 LCD_write_data(num_h+0x30);
    0130 2D0A      MOV	R16,R10
    0131 5D00      SUBI	R16,0xD0
    0132 DF8E      RCALL	_LCD_write_data
(0145) 	 LCD_write_data(num_l+0x30);
    0133 2F06      MOV	R16,R22
    0134 5D00      SUBI	R16,0xD0
    0135 DF8B      RCALL	_LCD_write_data
(0146) 	 }
    0136 C005      RJMP	0x013C
(0147) 	 else
(0148) 	 {
(0149) 	 
(0150) 	 
(0151) 	 LCD_write_data(0x30);
    0137 E300      LDI	R16,0x30
    0138 DF88      RCALL	_LCD_write_data
(0152) 	 LCD_write_data(num+0x30);
    0139 2F04      MOV	R16,R20
    013A 5D00      SUBI	R16,0xD0
    013B DF85      RCALL	_LCD_write_data
(0153) 	 }
    013C 940E0364  CALL	pop_gset3
    013E 9508      RET
(0154) }
(0155) //显示屏初始化
(0156) void disp_init(void)
(0157) {
(0158) DDRA=0XFF;
_disp_init:
    013F EF8F      LDI	R24,0xFF
    0140 BB8A      OUT	0x1A,R24
(0159) //DDRD=(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
(0160) DDRG=0XFF;
    0141 93800064  STS	0x64,R24
(0161) 
(0162) LCD_write_code(0x30);//功能设定/*30---基本指令动作
    0143 E300      LDI	R16,0x30
    0144 DF5D      RCALL	_LCD_write_code
(0163) LCD_write_code(0x01);//清屏,地址指针指向00H
    0145 E001      LDI	R16,1
    0146 DF5B      RCALL	_LCD_write_code
(0164) LCD_write_code(0x06);//光标的移动方向
    0147 E006      LDI	R16,6
    0148 DF59      RCALL	_LCD_write_code
(0165) LCD_write_code(0x0c);//光标反白显示--0x0f/*开显示,关游标
    0149 E00C      LDI	R16,0xC
    014A DF57      RCALL	_LCD_write_code
    014B 9508      RET
_error:
  type                 --> R16
    014C 940E036F  CALL	push_gset1
FILE: E:\icc\eeprom\eeprom_init.h
(0001) /*
(0002)  I2C总线/TWI操作模块
(0003)  1、读取和写入函数
(0004)  2、地址有效范围255
(0005)  3、数据长度为单字节
(0006)  4、函数采用查询方式
(0007)  5、可直接嵌入到项目中使用
(0008)  6、晶振频率:1M
(0009)  7、总线速度:50K
(0010)  AVR_AFA
(0011)  www.iccavr.com
(0012) */
(0013) #include "iom128v.h"
(0014) /*I2C总线主机模式错误处理*/
(0015) void error(unsigned char type) 
(0016) {
(0017)  switch (type & 0xF8) 
    014E 2F40      MOV	R20,R16
    014F 2755      CLR	R21
    0150 7F48      ANDI	R20,0xF8
    0151 7050      ANDI	R21,0
    0152 3340      CPI	R20,0x30
    0153 E0E0      LDI	R30,0
    0154 075E      CPC	R21,R30
    0155 F0D9      BEQ	0x0171
    0156 E380      LDI	R24,0x30
    0157 E090      LDI	R25,0

⌨️ 快捷键说明

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