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

📄 电池放电器v2.lst

📁 这是一个电池放电器
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0068 E5CF      LDI	R28,0x5F
    0069 E0D4      LDI	R29,4
    006A BFCD      OUT	0x3D,R28
    006B BFDE      OUT	0x3E,R29
    006C 51C0      SUBI	R28,0x10
    006D 40D0      SBCI	R29,0
    006E EA0A      LDI	R16,0xAA
    006F 8308      STD	Y+0,R16
    0070 2400      CLR	R0
    0071 E7E8      LDI	R30,0x78
    0072 E0F0      LDI	R31,0
    0073 E010      LDI	R17,0
    0074 3FE0      CPI	R30,0xF0
    0075 07F1      CPC	R31,R17
    0076 F011      BEQ	0x0079
    0077 9201      ST	R0,Z+
    0078 CFFB      RJMP	0x0074
    0079 8300      STD	Z+0,R16
    007A EBE7      LDI	R30,0xB7
    007B E0F0      LDI	R31,0
    007C E6A0      LDI	R26,0x60
    007D E0B0      LDI	R27,0
    007E E010      LDI	R17,0
    007F 3CEF      CPI	R30,0xCF
    0080 07F1      CPC	R31,R17
    0081 F021      BEQ	0x0086
    0082 95C8      LPM
    0083 9631      ADIW	R30,1
    0084 920D      ST	R0,X+
    0085 CFF9      RJMP	0x007F
    0086 D677      RCALL	_main
_exit:
    0087 CFFF      RJMP	_exit
_key:
  pb                   --> R22
  a                    --> R20
    0088 DEB2      RCALL	push_gset2
    0089 2F40      MOV	R20,R16
FILE: E:\刻录的\电子技术\项目\电池放电器\软件V2.0\keyboard_Driver.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "discharge.h"
(0004)  unsigned char key_old;
(0005)  unsigned char key_time;
(0006) unsigned int key(unsigned char a)
(0007) {
(0008)  unsigned char pb=0;
    008A 2766      CLR	R22
(0009)  if(a==0)
    008B 2344      TST	R20
    008C F599      BNE	0x00C0
(0010)  {  
(0011)     delay_nms(1);
    008D E001      LDI	R16,1
    008E E010      LDI	R17,0
    008F D411      RCALL	_delay_nms
(0012)     pb=(~PINB)&0x39;
    0090 B366      IN	R22,0x16
    0091 9560      COM	R22
    0092 7369      ANDI	R22,0x39
(0013) 	a=(pb>>2)|(pb&0x01); 
    0093 2F86      MOV	R24,R22
    0094 7081      ANDI	R24,1
    0095 2F46      MOV	R20,R22
    0096 9546      LSR	R20
    0097 9546      LSR	R20
    0098 2B48      OR	R20,R24
(0014) 	if(a==key_old)
    0099 90200079  LDS	R2,key_old
    009B 1542      CP	R20,R2
    009C F499      BNE	0x00B0
(0015) 	  {
(0016) 	    key_time++;
    009D 91800078  LDS	R24,key_time
    009F 5F8F      SUBI	R24,0xFF
    00A0 93800078  STS	key_time,R24
(0017) 		 if(key_time==20)
    00A2 3184      CPI	R24,0x14
    00A3 F449      BNE	0x00AD
(0018) 		   {a|=0x10;key_old=a;key_time=0;return a;}
    00A4 6140      ORI	R20,0x10
    00A5 93400079  STS	key_old,R20
    00A7 2422      CLR	R2
    00A8 92200078  STS	key_time,R2
    00AA 2F04      MOV	R16,R20
    00AB 2711      CLR	R17
    00AC C015      RJMP	0x00C2
(0019) 		 else
(0020) 		return 0;
    00AD 2700      CLR	R16
    00AE 2711      CLR	R17
    00AF C012      RJMP	0x00C2
(0021) 	}
(0022) 	  else 
(0023) 	    {
(0024) 		  if(a==(key_old&~0x10)){return 0;}
    00B0 91800079  LDS	R24,key_old
    00B2 7E8F      ANDI	R24,0xEF
    00B3 1748      CP	R20,R24
    00B4 F419      BNE	0x00B8
    00B5 2700      CLR	R16
    00B6 2711      CLR	R17
    00B7 C00A      RJMP	0x00C2
(0025) 		 else  key_old=a;key_time=0;return a;
    00B8 93400079  STS	key_old,R20
    00BA 2422      CLR	R2
    00BB 92200078  STS	key_time,R2
    00BD 2F04      MOV	R16,R20
    00BE 2711      CLR	R17
    00BF C002      RJMP	0x00C2
(0026) 		}
(0027)  }
(0028)  return a;
    00C0 2F04      MOV	R16,R20
    00C1 2711      CLR	R17
    00C2 DE6A      RCALL	pop_gset2
    00C3 9508      RET
FILE: E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "discharge.h"
(0004) #include "LCD_1602.h"
(0005) 
(0006) unsigned char lcd_data[32];//32字节显存,记录LCD上显示的数据
(0007) unsigned char data[32];//32字节缓存,保存将要写入LCD的数据
(0008) unsigned char add;//显存地址标号
(0009) unsigned char new=32;//显存标号 
(0010) unsigned int num=0;
(0011) /**********************************************************
(0012) TC1602B LCD DISPLAY
(0013) 建立时间:2005年12月12号
(0014) 修改日期:2005年12月12号
(0015) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0016)                    入命令
(0017) LCD第一行显示寄存器地址:0X80-0X8F
(0018) LCD第二行显示寄存器地址:0XC0-0XCF
(0019) **********************************************************/
(0020) void LCD_init(void)
(0021)   { 
(0022)      LCD_EN_DDR|=LCD_EN;//设定该引脚方向为输出
_LCD_init:
    00C4 9A8E      SBI	0x11,6
(0023) 	 LCD_RS_DDR|=LCD_RS;//设定该引脚方向为输出
    00C5 9A8F      SBI	0x11,7
(0024) 	 LCD_D4_DDR|=LCD_D4;//设定数据口为输出 
    00C6 9A8D      SBI	0x11,5
(0025) 	 LCD_D5_DDR|=LCD_D5;//设定数据口为输出  
    00C7 9A8C      SBI	0x11,4
(0026) 	 LCD_D6_DDR|=LCD_D6;//设定数据口为输出  
    00C8 9A8B      SBI	0x11,3
(0027) 	 LCD_D7_DDR|=LCD_D7;//设定数据口为输出
    00C9 9A8A      SBI	0x11,2
(0028) 	 
(0029) 	  LCD_EN_PORT&=~LCD_EN;//EN设为低电平
    00CA 9896      CBI	0x12,6
(0030) 	  LCD_RS_PORT&=~LCD_RS;//RS设为低电平
    00CB 9897      CBI	0x12,7
(0031) 	  LCD_D4_PORT&=~LCD_D4;//数据口置低电平
    00CC 9895      CBI	0x12,5
(0032) 	  LCD_D5_PORT&=~LCD_D5;//数据口置低电平
    00CD 9894      CBI	0x12,4
(0033) 	  LCD_D6_PORT&=~LCD_D6;//数据口置低电平
    00CE 9893      CBI	0x12,3
(0034) 	  LCD_D7_PORT&=~LCD_D7;//数据口置低电平
    00CF 9892      CBI	0x12,2
(0035) 	  
(0036)     LCD_write_char(0,0x33);      //4bit test
    00D0 E323      LDI	R18,0x33
    00D1 E030      LDI	R19,0
    00D2 2700      CLR	R16
    00D3 2711      CLR	R17
    00D4 D02A      RCALL	_LCD_write_char
(0037) 	delay_nms(25);
    00D5 E109      LDI	R16,0x19
    00D6 E010      LDI	R17,0
    00D7 D3C9      RCALL	_delay_nms
(0038) 	LCD_write_char(0,0x32);
    00D8 E322      LDI	R18,0x32
    00D9 E030      LDI	R19,0
    00DA 2700      CLR	R16
    00DB 2711      CLR	R17
    00DC D022      RCALL	_LCD_write_char
(0039) 	delay_nms(15);
    00DD E00F      LDI	R16,0xF
    00DE E010      LDI	R17,0
    00DF D3C1      RCALL	_delay_nms
(0040) 	LCD_write_char(0,0x28);
    00E0 E228      LDI	R18,0x28
    00E1 E030      LDI	R19,0
    00E2 2700      CLR	R16
    00E3 2711      CLR	R17
    00E4 D01A      RCALL	_LCD_write_char
(0041) 	delay_nms(15);
    00E5 E00F      LDI	R16,0xF
    00E6 E010      LDI	R17,0
    00E7 D3B9      RCALL	_delay_nms
(0042)     LCD_write_char(0,0x0C);      //显示开
    00E8 E02C      LDI	R18,0xC
    00E9 E030      LDI	R19,0
    00EA 2700      CLR	R16
    00EB 2711      CLR	R17
    00EC D012      RCALL	_LCD_write_char
(0043) 	delay_nms(15);
    00ED E00F      LDI	R16,0xF
    00EE E010      LDI	R17,0
    00EF D3B1      RCALL	_delay_nms
(0044)     LCD_write_char(0,0x01);      //显示清屏
    00F0 E021      LDI	R18,1
    00F1 E030      LDI	R19,0
    00F2 2700      CLR	R16
    00F3 2711      CLR	R17
    00F4 D00A      RCALL	_LCD_write_char
(0045) 	delay_nms(15);
    00F5 E00F      LDI	R16,0xF
    00F6 E010      LDI	R17,0
    00F7 D3A9      RCALL	_delay_nms
(0046)     LCD_write_char(0,0x06);      //显示光标移动设置	
    00F8 E026      LDI	R18,6
    00F9 E030      LDI	R19,0
    00FA 2700      CLR	R16
    00FB 2711      CLR	R17
    00FC D002      RCALL	_LCD_write_char
(0047) 	LCD_clear();
    00FD D064      RCALL	_LCD_clear
    00FE 9508      RET
_LCD_write_char:
  data                 --> R20
  command              --> R22
    00FF DE3B      RCALL	push_gset2
    0100 01A9      MOVW	R20,R18
    0101 01B8      MOVW	R22,R16
(0048) 	//LCD_init_CGRAM(); 
(0049)   }
(0050) /*-----------------------------------------------------------------------
(0051) LCD_write_char    : 写一个字节到LCD的函数
(0052) 编写日期             :2005-12-12 
(0053) 最后修改日期      :2005-12-12 		
(0054) -----------------------------------------------------------------------*/
(0055) void LCD_write_char(unsigned command,unsigned data)
(0056)   { 
(0057)     if (command == 0)
    0102 3060      CPI	R22,0
    0103 0767      CPC	R22,R23
    0104 F411      BNE	0x0107
(0058)    	LCD_RS_PORT &= ~LCD_RS;   //RS=0  写地址
    0105 9897      CBI	0x12,7
    0106 C001      RJMP	0x0108
(0059) 	else
(0060)     LCD_RS_PORT |= LCD_RS;    //RS=1 写数据
    0107 9A97      SBI	0x12,7
(0061) 	
(0062)     LCD_write_DATA_PORT(data);//写高4位
    0108 2F04      MOV	R16,R20
    0109 D018      RCALL	_LCD_write_DATA_PORT
(0063)     LCD_write_DATA_PORT(data<<4);//写低4位
    010A 2F04      MOV	R16,R20
    010B 0F00      LSL	R16
    010C 1F11      ROL	R17
    010D 0F00      LSL	R16
    010E 1F11      ROL	R17
    010F 0F00      LSL	R16
    0110 1F11      ROL	R17
    0111 0F00      LSL	R16
    0112 1F11      ROL	R17
    0113 D00E      RCALL	_LCD_write_DATA_PORT
(0064) 	delay_nus(250);
    0114 EF0A      LDI	R16,0xFA
    0115 E010      LDI	R17,0
    0116 D399      RCALL	_delay_nus
(0065) 	num++;//统计向LCD发送的字节数
    0117 91800061  LDS	R24,num
    0119 91900062  LDS	R25,num+1
    011B 9601      ADIW	R24,1
    011C 93900062  STS	num+1,R25
    011E 93800061  STS	num,R24
    0120 DE0C      RCALL	pop_gset2
    0121 9508      RET
_LCD_write_DATA_PORT:
  data                 --> R20
    0122 DE1A      RCALL	push_gset1
    0123 2F40      MOV	R20,R16
(0066)   }
(0067) /*-----------------------------------------------------------------------
(0068) LCD_write_DATA_PORT : 写数据到LCD数据口函数
(0069) 
(0070) 输入参数data   :要写入的数据(仅高4位)
(0071) 编写日期          :2005-12-12
(0072) 最后修改日期   :2005-12-12 		
(0073) -----------------------------------------------------------------------*/
(0074) void LCD_write_DATA_PORT(unsigned char data)
(0075) {   
(0076)     if((data>>4)%2)
    0124 E012      LDI	R17,2
    0125 2F04      MOV	R16,R20
    0126 9502      SWAP	R16
    0127 700F      ANDI	R16,0xF
    0128 DDDC      RCALL	mod8u
    0129 2300      TST	R16
    012A F011      BEQ	0x012D
(0077) 	  LCD_D4_PORT |=LCD_D4;
    012B 9A95      SBI	0x12,5
    012C C001      RJMP	0x012E
(0078) 	else
(0079) 	  LCD_D4_PORT &=~LCD_D4;
    012D 9895      CBI	0x12,5
(0080) 	
(0081) 	if((data>>5)%2)
    012E E012      LDI	R17,2
    012F 2F04      MOV	R16,R20
    0130 9506      LSR	R16
    0131 9506      LSR	R16
    0132 9506      LSR	R16
    0133 9506      LSR	R16
    0134 9506      LSR	R16
    0135 DDCF      RCALL	mod8u
    0136 2300      TST	R16
    0137 F011      BEQ	0x013A
(0082) 	  LCD_D5_PORT |=LCD_D5;
    0138 9A94      SBI	0x12,4
    0139 C001      RJMP	0x013B
(0083) 	else
(0084) 	  LCD_D5_PORT &=~LCD_D5;
    013A 9894      CBI	0x12,4
(0085) 	  
(0086) 	if((data>>6)%2)
    013B E012      LDI	R17,2
    013C 2F04      MOV	R16,R20
    013D 9506      LSR	R16
    013E 9506      LSR	R16
    013F 9506      LSR	R16
    0140 9506      LSR	R16
    0141 9506      LSR	R16
    0142 9506      LSR	R16
    0143 DDC1      RCALL	mod8u
    0144 2300      TST	R16
    0145 F011      BEQ	0x0148
(0087) 	  LCD_D6_PORT |=LCD_D6;
    0146 9A93      SBI	0x12,3
    0147 C001      RJMP	0x0149
(0088) 	else
(0089) 	  LCD_D6_PORT &=~LCD_D6;
    0148 9893      CBI	0x12,3
(0090) 	  
(0091) 	if((data>>7)%2)
    0149 E012      LDI	R17,2
    014A 2F04      MOV	R16,R20
    014B 9506      LSR	R16
    014C 9506      LSR	R16
    014D 9506      LSR	R16
    014E 9506      LSR	R16
    014F 9506      LSR	R16
    0150 9506      LSR	R16
    0151 9506      LSR	R16
    0152 DDB2      RCALL	mod8u
    0153 2300      TST	R16
    0154 F011      BEQ	0x0157
(0092) 	  LCD_D7_PORT |=LCD_D7;
    0155 9A92      SBI	0x12,2
    0156 C001      RJMP	0x0158
(0093) 	else
(0094) 	  LCD_D7_PORT &=~LCD_D7;
    0157 9892      CBI	0x12,2
(0095) 	  
(0096) 	  LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
    0158 9A96      SBI	0x12,6
(0097) 	  delay_nus(25);
    0159 E109      LDI	R16,0x19
    015A E010      LDI	R17,0
    015B D354      RCALL	_delay_nus
(0098)       LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
    015C 9896      CBI	0x12,6
(0099) 	  delay_nus(25);
    015D E109      LDI	R16,0x19
    015E E010      LDI	R17,0
    015F D350      RCALL	_delay_nus
    0160 DDDF      RCALL	pop_gset1
    0161 9508      RET
_LCD_clear:
  i                    --> R20
    0162 DDDA      RCALL	push_gset1
(0100) }
(0101) /*-----------------------------------------------------------------------
(0102) LCD_clear    : 清除屏幕的函数
(0103) 
(0104) 输入参数      :无
(0105) 编写日期      :2005/10/18	
(0106)        说明      :	lcd_data[]也会被清0
(0107) -----------------------------------------------------------------------*/
(0108) void LCD_clear(void)
(0109)   {  
(0110)      unsigned char i;
(0111)      LCD_write_char(0,0x01);//显示清屏
    0163 E021      LDI	R18,1
    0164 E030      LDI	R19,0
    0165 2700      CLR	R16
    0166 2711      CLR	R17
    0167 DF97      RCALL	_LCD_write_char
(0112) 	 for(i=0;i<32;i++)
    0168 2744      CLR	R20
    0169 C009      RJMP	0x0173
(0113) 	   {

⌨️ 快捷键说明

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