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

📄 test.lst

📁 24IIC的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0116) 
(0117)  re_exit://出错退出 
(0118)  Stop(); 
     128 E984      LDI	R24,0x94
     129 BF86      OUT	0x36,R24
(0119)  _SEI(); 
     12A 9478      BSET	7
(0120)  return 0;  
     12B 2700      CLR	R16
     12C 9622      ADIW	R28,2
     12D 90A9      LD	R10,Y+
     12E 9508      RET
FILE: D:\iccavr\mega16\11\24CXX\lcd1602.h
(0001) /*-------------------------------------------
(0002)    RS----------PC2
(0003)    RW----------GND
(0004)    EN----------PC3
(0005)    D4-D7-------PC4-PC7
(0006) ---------------------------------------------*/
(0007) //定义MCU与LCD的接口 
(0008) #define LCD_EN_PORT   PORTC
(0009) #define LCD_EN_DDR    DDRC
(0010) #define LCD_RS_PORT   PORTC
(0011) #define LCD_RS_DDR    DDRC
(0012) #define LCD_DATA_PORT PORTC
(0013) #define LCD_DATA_DDR  DDRC
(0014) #define LCD_DATA_PIN  PINC
(0015) #define LCD_EN        0x08   //portc3 out
(0016) #define LCD_RS        0x04   //portc2 out
(0017) #define LCD_DATA      0xf0 //portc4/5/6/7 out
(0018) 
(0019) /*----------------------------------------------------------
(0020) Public function prototypes
(0021) ----------------------------------------------------------*/
(0022) void LCD_init(void);
(0023) void LCD_en_write(void);
(0024) void clear(void);
(0025) void LCD_write_char(unsigned command,unsigned data);
(0026) void LCD_set_xy(unsigned char x, unsigned char y);
(0027) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0028) void LCD_write_data(unsigned char X,unsigned char Y,int dat);
(0029) 
(0030) /*------------------------------------------------------------
(0031) 函数: lcd1602口线初始化和液晶初始化
(0032) -------------------------------------------------------------*/
(0033) void LCD_init(void) //液晶初始化
(0034) {
(0035)  LCD_DATA_DDR|=LCD_DATA;
_LCD_init:
     12F B384      IN	R24,0x14
     130 6F80      ORI	R24,0xF0
     131 BB84      OUT	0x14,R24
(0036)  LCD_EN_DDR|=LCD_EN;
     132 9AA3      SBI	0x14,3
(0037)  LCD_RS_DDR|=LCD_RS;
     133 9AA2      SBI	0x14,2
(0038)  delay_ms(15);
     134 E00F      LDI	R16,0xF
     135 E010      LDI	R17,0
     136 DF6B      RCALL	_delay_ms
(0039)  LCD_write_char(0x28,0); //4位显示
     137 2722      CLR	R18
     138 2733      CLR	R19
     139 E208      LDI	R16,0x28
     13A E010      LDI	R17,0
     13B D028      RCALL	_LCD_write_char
(0040)  delay_ms(15);
     13C E00F      LDI	R16,0xF
     13D E010      LDI	R17,0
     13E DF63      RCALL	_delay_ms
(0041)  LCD_write_char(0x0c,0); //显示开
     13F 2722      CLR	R18
     140 2733      CLR	R19
     141 E00C      LDI	R16,0xC
     142 E010      LDI	R17,0
     143 D020      RCALL	_LCD_write_char
(0042)  delay_ms(15);
     144 E00F      LDI	R16,0xF
     145 E010      LDI	R17,0
     146 DF5B      RCALL	_delay_ms
(0043)  LCD_write_char(0x01,0); //清屏
     147 2722      CLR	R18
     148 2733      CLR	R19
     149 E001      LDI	R16,1
     14A E010      LDI	R17,0
     14B D018      RCALL	_LCD_write_char
(0044)  clear();
     14C D04E      RCALL	_clear
     14D 9508      RET
_LCD_set_xy:
  address0             --> R20
  y                    --> R10
  x                    --> R22
     14E D141      RCALL	push_xgsetF00C
     14F 2EA2      MOV	R10,R18
     150 2F60      MOV	R22,R16
(0045) }
(0046) 
(0047) /*------------------------------------------------------------
(0048) 函数: 设置显示地址
(0049) para: x---the display address of a line limit: 0---15
(0050)       y---the display line limit 0 or 1 
(0051) --------------------------------------------------------------*/
(0052) void LCD_set_xy(unsigned char x, unsigned char y) //写地址函数
(0053) {
(0054)   unsigned char address;
(0055)   if(y ==0) 
     151 20AA      TST	R10
     152 F419      BNE	0x0156
(0056)    address=0x80+x; //the first line
     153 2F46      MOV	R20,R22
     154 5840      SUBI	R20,0x80
     155 C002      RJMP	0x0158
(0057)   else 
(0058)    address=0xc0+x; //the second line
     156 2F46      MOV	R20,R22
     157 5440      SUBI	R20,0x40
(0059)   LCD_write_char(address,0);
     158 2722      CLR	R18
     159 2733      CLR	R19
     15A 2F04      MOV	R16,R20
     15B 2711      CLR	R17
     15C D007      RCALL	_LCD_write_char
     15D C137      RJMP	pop_xgsetF00C
(0060) }
(0061) /*-------------------------------------------------------------
(0062) 函数: lcd1602使能
(0063) *--------------------------------------------------------------*/
(0064) void LCD_en_write(void) //液晶使能
(0065) { 
(0066)  LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
     15E 9AAB      SBI	0x15,3
(0067)  delay_us(5);
     15F E005      LDI	R16,5
     160 E010      LDI	R17,0
     161 DF27      RCALL	_delay_us
(0068)  LCD_EN_PORT&=~LCD_EN;
     162 98AB      CBI	0x15,3
     163 9508      RET
_LCD_write_char:
  data_temp0           --> R22
  command_temp0        --> R20
  data                 --> R12
  command              --> R10
     164 D143      RCALL	push_xgsetF03C
     165 0169      MOVW	R12,R18
     166 0158      MOVW	R10,R16
(0069) }
(0070) /*------------------------------------------------------------
(0071) 函数: 写命令或数据到lcd1602
(0072) 参数:command: 0---写数据, 1---写命令
(0073)       data: 所要写的命令或数据
(0074) *-------------------------------------------------------------*/
(0075) void LCD_write_char(unsigned command,unsigned data) 
(0076) {
(0077)  unsigned command_temp,data_temp;
(0078)  command_temp=command;
     167 01A5      MOVW	R20,R10
(0079)  data_temp=data;
     168 01B6      MOVW	R22,R12
(0080)  delay_us(25);
     169 E109      LDI	R16,0x19
     16A E010      LDI	R17,0
     16B DF1D      RCALL	_delay_us
(0081)  if(command==0)
     16C 3040      CPI	R20,0
     16D 0745      CPC	R20,R21
     16E F4C1      BNE	0x0187
(0082)  {
(0083)   LCD_RS_PORT|=LCD_RS; //RS=1
     16F 9AAA      SBI	0x15,2
(0084)   LCD_DATA_PORT&=0X0f;
     170 B385      IN	R24,0x15
     171 708F      ANDI	R24,0xF
     172 BB85      OUT	0x15,R24
(0085)   LCD_DATA_PORT|=data_temp&0xf0; //写高四位
     173 01CB      MOVW	R24,R22
     174 940E 02D6 CALL	0x02D6
(0086)   LCD_en_write();
     176 DFE7      RCALL	_LCD_en_write
(0087)   data_temp=data_temp<<4; 
     177 0F66      LSL	R22
     178 1F77      ROL	R23
     179 0F66      LSL	R22
     17A 1F77      ROL	R23
     17B 0F66      LSL	R22
     17C 1F77      ROL	R23
     17D 0F66      LSL	R22
     17E 1F77      ROL	R23
(0088)   LCD_DATA_PORT&=0X0f;
     17F B385      IN	R24,0x15
     180 708F      ANDI	R24,0xF
     181 BB85      OUT	0x15,R24
(0089)   LCD_DATA_PORT|=data_temp&0xf0; //写低四位
     182 01CB      MOVW	R24,R22
     183 940E 02D6 CALL	0x02D6
(0090)   LCD_en_write();
     185 DFD8      RCALL	_LCD_en_write
(0091)  }
     186 C013      RJMP	0x019A
(0092)  else
(0093)  {
(0094)   LCD_RS_PORT&=~LCD_RS; //RS=0
     187 98AA      CBI	0x15,2
(0095)   LCD_DATA_PORT&=0X0f;
     188 B385      IN	R24,0x15
     189 708F      ANDI	R24,0xF
     18A BB85      OUT	0x15,R24
(0096)   LCD_DATA_PORT|=command_temp&0xf0; //写高四位
     18B 01CA      MOVW	R24,R20
     18C 940E 02D6 CALL	0x02D6
(0097)   LCD_en_write();
     18E DFCF      RCALL	_LCD_en_write
     18F 940E 02ED CALL	0x02ED
     191 940E 02ED CALL	0x02ED
(0098)   command_temp=command_temp<<4;
(0099)   LCD_DATA_PORT&=0x0f;
     193 B385      IN	R24,0x15
     194 708F      ANDI	R24,0xF
     195 BB85      OUT	0x15,R24
(0100)   LCD_DATA_PORT|=command_temp&0xf0; //写低四位
     196 01CA      MOVW	R24,R20
     197 940E 02D6 CALL	0x02D6
(0101)   LCD_en_write();
     199 DFC4      RCALL	_LCD_en_write
(0102)  }
     19A C114      RJMP	pop_xgsetF03C
_clear:
  i2                   --> R20
  i0                   --> R20
     19B 934A      ST	R20,-Y
(0103) }
(0104) /*-------------------------------------------------------------
(0105) 函数: 清屏lcd1602
(0106) ---------------------------------------------------------------*/
(0107) void clear(void)
(0108) {
(0109)  unsigned char i;
(0110)  LCD_set_xy(0,0);
     19C 2722      CLR	R18
     19D 2700      CLR	R16
     19E DFAF      RCALL	_LCD_set_xy
(0111)  for(i=0;i<16;i++)
     19F 2744      CLR	R20
     1A0 C004      RJMP	0x01A5
(0112)  LCD_write_char(0,' ');
     1A1 940E 0301 CALL	0x0301
     1A3 DFC0      RCALL	_LCD_write_char
     1A4 9543      INC	R20
     1A5 3140      CPI	R20,0x10
     1A6 F3D0      BCS	0x01A1
(0113)  LCD_set_xy(0,1);
     1A7 E021      LDI	R18,1
     1A8 2700      CLR	R16
     1A9 DFA4      RCALL	_LCD_set_xy
(0114)  for(i=0;i<16;i++)
     1AA 2744      CLR	R20
     1AB C004      RJMP	0x01B0
(0115)  LCD_write_char(0,' ');
     1AC 940E 0301 CALL	0x0301
     1AE DFB5      RCALL	_LCD_write_char
     1AF 9543      INC	R20
     1B0 3140      CPI	R20,0x10
     1B1 F3D0      BCS	0x01AC
     1B2 9149      LD	R20,Y+
     1B3 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R12
  X                    --> R10
     1B4 D0E7      RCALL	push_xgset303C
     1B5 2EC2      MOV	R12,R18
     1B6 2EA0      MOV	R10,R16
     1B7 814E      LDD	R20,Y+6
     1B8 815F      LDD	R21,Y+7
(0116) }
(0117) /*-------------------------------------------------------------
(0118) 函数: 写字符串
(0119) 参数:列---X=0~15,行---Y=0~1 写地址
(0120)       s为所要写的字符串
(0121) ---------------------------------------------------------------*/
(0122) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) 
(0123) {
(0124)  LCD_set_xy(X,Y);   
     1B9 2D2C      MOV	R18,R12
     1BA 2D0A      MOV	R16,R10
     1BB DF92      RCALL	_LCD_set_xy
     1BC C006      RJMP	0x01C3
(0125)  while(*s)  
(0126)  {
(0127)   LCD_write_char(0,*s);
     1BD 01FA      MOVW	R30,R20
     1BE 940E 02FC CALL	0x02FC
     1C0 DFA3      RCALL	_LCD_write_char
(0128)   s++;
     1C1 5F4F      SUBI	R20,0xFF
     1C2 4F5F      SBCI	R21,0xFF
     1C3 01FA      MOVW	R30,R20
     1C4 8020      LDD	R2,Z+0
     1C5 2022      TST	R2
     1C6 F7B1      BNE	0x01BD
     1C7 C0DB      RJMP	pop_xgset303C
_LCD_write_data:
  data                 --> Y,+0
  i0                   --> R20
  Y                    --> R12
  X                    --> R10
     1C8 D0BE      RCALL	push_xgset30FC
     1C9 2EC2      MOV	R12,R18
     1CA 2EA0      MOV	R10,R16
     1CB 9724      SBIW	R28,4
     1CC 84EC      LDD	R14,Y+12
     1CD 84FD      LDD	R15,Y+13
(0129)  }
(0130) }
(0131) 
(0132) /*-------------------------------------------------------------
(0133) 函数: 写数字
(0134) 参数:列---X=0~15,行---Y=0~1 写地址
(0135)       dat为所要写的数字
(0136) ---------------------------------------------------------------*/
(0137) void LCD_write_data(unsigned char X,unsigned char Y,int dat)
(0138) {
(0139)  //unsigned char fuhao;
(0140)  unsigned char data[4];
(0141)  unsigned char i;
(0142)   
(0143)  /*if(dat<0)
(0144)  {
(0145)   fuhao='-';
(0146)   dat=0-dat;
(0147)  }
(0148)  else
(0149)   fuhao=' ';
(0150)  data[0]=fuhao;*/
(0151)  data[0]=dat/1000+0x30; dat%=1000;
     1CE EE28      LDI	R18,0xE8
     1CF E033      LDI	R19,3
     1D0 0187      MOVW	R16,R14
     1D1 D078      RCALL	div16s
     1D2 01C8      MOVW	R24,R16
     1D3 96C0      ADIW	R24,0x30
     1D4 8388      STD	Y+0,R24
     1D5 EE28      LDI	R18,0xE8
     1D6 E033      LDI	R19,3
     1D7 0187      MOVW	R16,R14
     1D8 D06D      RCALL	mod16s
     1D9 0178      MOVW	R14,R16
(0152)  data[1]=dat/100+0x30;  dat%=100;
     1DA E624      LDI	R18,0x64

⌨️ 快捷键说明

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