📄 电池放电器v2.lst
字号:
__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 + -