📄 ac15-3.lst
字号:
__text_start:
__start:
0033 E5CF LDI R28,0x5F
0034 E0D4 LDI R29,4
0035 BFCD OUT 0x3D,R28
0036 BFDE OUT 0x3E,R29
0037 51C0 SUBI R28,0x10
0038 40D0 SBCI R29,0
0039 EA0A LDI R16,0xAA
003A 8308 STD Y+0,R16
003B 2400 CLR R0
003C E6E0 LDI R30,0x60
003D E0F0 LDI R31,0
003E E010 LDI R17,0
003F 36E0 CPI R30,0x60
0040 07F1 CPC R31,R17
0041 F011 BEQ 0x0044
0042 9201 ST R0,Z+
0043 CFFB RJMP 0x003F
0044 8300 STD Z+0,R16
0045 E6E5 LDI R30,0x65
0046 E0F0 LDI R31,0
0047 E6A0 LDI R26,0x60
0048 E0B0 LDI R27,0
0049 E010 LDI R17,0
004A 36E5 CPI R30,0x65
004B 07F1 CPC R31,R17
004C F021 BEQ 0x0051
004D 95C8 LPM
004E 9631 ADIW R30,1
004F 920D ST R0,X+
0050 CFF9 RJMP 0x004A
0051 940E0193 CALL _main
_exit:
0053 CFFF RJMP _exit
_ePutstr:
l --> R20
i --> R22
ptr --> R10
y --> R12
x --> R14
0054 940E0294 CALL push_gset5
0056 2EC2 MOV R12,R18
0057 2EE0 MOV R14,R16
0058 9721 SBIW R28,1
0059 84AB LDD R10,Y+11
005A 84BC LDD R11,Y+12
FILE: d:\MYDOCU~1\ac15-3\ac15-3.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) //-----------------------------------------------
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006) //-------------------引脚电平的宏定义---------
(0007) #define LCM_RS_1 PORTB|=BIT(PB0)
(0008) #define LCM_RS_0 PORTB&=~BIT(PB0)
(0009) #define LCM_RW_1 PORTB|=BIT(PB1)
(0010) #define LCM_RW_0 PORTB&=~BIT(PB1)
(0011) #define LCM_EN_1 PORTB|=BIT(PB2)
(0012) #define LCM_EN_0 PORTB&=~BIT(PB2)
(0013)
(0014) #define rd_device_add 0xa1
(0015) #define wr_device_add 0xa0
(0016)
(0017) //======================================
(0018) //TWI状态定义
(0019) //MT 主方式传输 MR 主方式接收
(0020) #define START 0x08
(0021) #define RE_START 0x10
(0022) #define MT_SLA_ACK 0x18
(0023) #define MT_SLA_NOACK 0x20
(0024) #define MT_DATA_ACK 0x28
(0025) #define MT_DATA_NOACK 0x30
(0026) #define MR_SLA_ACK 0x40
(0027) #define MR_SLA_NOACK 0x48
(0028) #define MR_DATA_ACK 0x50
(0029) #define MR_DATA_NOACK 0x58
(0030)
(0031) //常用TWI操作(主模式写和主模式读)
(0032) #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0033) #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0034) #define Wait() {while(!(TWCR&(1<<TWINT)));}
(0035) #define TestAck() (TWSR&0xf8)
(0036) #define SetAck() (TWCR|=(1<<TWEA))
(0037) #define SetNoAck() (TWCR&=~(1<<TWEA))
(0038) #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
(0039) #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
(0040)
(0041) #define DataPort PORTA
(0042) #define Busy 0x80
(0043) #define xtal 8
(0044)
(0045) //=====================================
(0046) const uchar str0[]={"Write : "};//待显字符串
(0047) const uchar str1[]={"Read : "};//待显字符串
(0048)
(0049) //========函数声明=========
(0050) void WaitForEnable(void);
(0051) void LcdWriteData(uchar W);
(0052) void LcdWriteCommand(uchar CMD,uchar Attribc);
(0053) void InitLcd(void);
(0054) void Display(uchar dd);
(0055) void DisplayOneChar(uchar x,uchar y,uchar Wdata);
(0056) void ePutstr(uchar x,uchar y,uchar const *ptr);
(0057) void port_init(void);
(0058) void delay_ms(unsigned int time);
(0059) void delay_us(int time);
(0060)
(0061) //**********************显示指定座标的一串字符子函数**************
(0062) void ePutstr(uchar x,uchar y,uchar const *ptr)
(0063) {
(0064) uchar i,l=0;
005B 2744 CLR R20
005C C001 RJMP 0x005E
(0065) while(ptr[l]>31){l++;}
005D 9543 INC R20
005E 2FE4 MOV R30,R20
005F 27FF CLR R31
0060 0DEA ADD R30,R10
0061 1DFB ADC R31,R11
0062 91E4 LPM R30,0(Z)
0063 E18F LDI R24,0x1F
0064 178E CP R24,R30
0065 F3B8 BCS 0x005D
(0066) for(i=0;i<l;i++){
0066 2766 CLR R22
0067 C014 RJMP 0x007C
(0067) DisplayOneChar(x++,y,ptr[i]);
0068 2FE6 MOV R30,R22
0069 27FF CLR R31
006A 0DEA ADD R30,R10
006B 1DFB ADC R31,R11
006C 91E4 LPM R30,0(Z)
006D 83E8 STD Y+0,R30
006E 2D2C MOV R18,R12
006F 2C2E MOV R2,R14
0070 2D82 MOV R24,R2
0071 5F8F SUBI R24,0xFF
0072 2EE8 MOV R14,R24
0073 2D02 MOV R16,R2
0074 D01E RCALL _DisplayOneChar
(0068) if(x==16){
0075 2D8E MOV R24,R14
0076 3180 CPI R24,0x10
0077 F419 BNE 0x007B
(0069) x=0;y^=1;
0078 24EE CLR R14
0079 E081 LDI R24,1
007A 26C8 EOR R12,R24
007B 9563 INC R22
007C 1764 CP R22,R20
007D F350 BCS 0x0068
007E 9621 ADIW R28,1
007F 940E0291 CALL pop_gset5
0081 9508 RET
_LocateXY:
temp --> R20
posy --> R22
posx --> R10
0082 940E0298 CALL push_gset3
0084 2F62 MOV R22,R18
0085 2EA0 MOV R10,R16
(0070) }
(0071) }
(0072) }
(0073)
(0074) //*******************显示光标定位子函数******************
(0075) void LocateXY(char posx,char posy)
(0076) {
(0077) uchar temp;
(0078) temp&=0x7f;
0086 774F ANDI R20,0x7F
(0079) temp=posx&0x0f;
0087 2D4A MOV R20,R10
0088 704F ANDI R20,0xF
(0080) posy&=0x01;
0089 7061 ANDI R22,1
(0081) if(posy)temp|=0x40;
008A F009 BEQ 0x008C
008B 6440 ORI R20,0x40
(0082) temp|=0x80;
008C 6840 ORI R20,0x80
(0083) LcdWriteCommand(temp,0);
008D 2722 CLR R18
008E 2F04 MOV R16,R20
008F D031 RCALL _LcdWriteCommand
0090 940E028E CALL pop_gset3
0092 9508 RET
_DisplayOneChar:
Wdata --> Y+4
y --> R22
x --> R20
0093 940E029A CALL push_gset2
0095 2F62 MOV R22,R18
0096 2F40 MOV R20,R16
(0084) }
(0085)
(0086) //*******************显示指定座标的一个字符子函数*******************
(0087) void DisplayOneChar(uchar x,uchar y,uchar Wdata)
(0088) {
(0089) LocateXY(x,y);
0097 2F26 MOV R18,R22
0098 2F04 MOV R16,R20
0099 DFE8 RCALL _LocateXY
(0090) LcdWriteData(Wdata);
009A 810C LDD R16,Y+4
009B D038 RCALL _LcdWriteData
009C 940E028B CALL pop_gset2
009E 9508 RET
(0091) }
(0092)
(0093) //*******************LCD初始化子函数*********************
(0094) void InitLcd(void)
(0095) {
(0096) LcdWriteCommand(0x38,0);
_InitLcd:
009F 2722 CLR R18
00A0 E308 LDI R16,0x38
00A1 D01F RCALL _LcdWriteCommand
(0097) delay_ms(5);
00A2 E005 LDI R16,5
00A3 E010 LDI R17,0
00A4 D1B7 RCALL _delay_ms
(0098) LcdWriteCommand(0x38,0);
00A5 2722 CLR R18
00A6 E308 LDI R16,0x38
00A7 D019 RCALL _LcdWriteCommand
(0099) delay_ms(5);
00A8 E005 LDI R16,5
00A9 E010 LDI R17,0
00AA D1B1 RCALL _delay_ms
(0100) LcdWriteCommand(0x38,0);
00AB 2722 CLR R18
00AC E308 LDI R16,0x38
00AD D013 RCALL _LcdWriteCommand
(0101) delay_ms(5);
00AE E005 LDI R16,5
00AF E010 LDI R17,0
00B0 D1AB RCALL _delay_ms
(0102) LcdWriteCommand(0x38,1);
00B1 E021 LDI R18,1
00B2 E308 LDI R16,0x38
00B3 D00D RCALL _LcdWriteCommand
(0103) LcdWriteCommand(0x08,1);
00B4 E021 LDI R18,1
00B5 E008 LDI R16,0x8
00B6 D00A RCALL _LcdWriteCommand
(0104) LcdWriteCommand(0x01,1);
00B7 E021 LDI R18,1
00B8 E001 LDI R16,1
00B9 D007 RCALL _LcdWriteCommand
(0105) LcdWriteCommand(0x06,1);
00BA E021 LDI R18,1
00BB E006 LDI R16,6
00BC D004 RCALL _LcdWriteCommand
(0106) LcdWriteCommand(0x0c,1);
00BD E021 LDI R18,1
00BE E00C LDI R16,0xC
00BF D001 RCALL _LcdWriteCommand
00C0 9508 RET
_LcdWriteCommand:
Attribc --> R22
CMD --> R20
00C1 940E029A CALL push_gset2
00C3 2F62 MOV R22,R18
00C4 2F40 MOV R20,R16
(0107) }
(0108)
(0109) //********************写命令到LCM子函数********************
(0110) void LcdWriteCommand(uchar CMD,uchar Attribc)
(0111) {
(0112) if(Attribc)WaitForEnable();
00C5 2366 TST R22
00C6 F009 BEQ 0x00C8
00C7 D01C RCALL _WaitForEnable
(0113) LCM_RS_0;LCM_RW_0;_NOP();
00C8 98C0 CBI 0x18,0
00C9 98C1 CBI 0x18,1
00CA 0000 NOP
(0114) DataPort=CMD;_NOP();
00CB BB4B OUT 0x1B,R20
00CC 0000 NOP
(0115) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
00CD 9AC2 SBI 0x18,2
00CE 0000 NOP
00CF 0000 NOP
00D0 98C2 CBI 0x18,2
00D1 940E028B CALL pop_gset2
00D3 9508 RET
_LcdWriteData:
dataW --> R20
00D4 940E029C CALL push_gset1
00D6 2F40 MOV R20,R16
(0116) }
(0117)
(0118) //*******************写数据到LCM子函数********************
(0119) void LcdWriteData(uchar dataW)
(0120) {
(0121) WaitForEnable();
00D7 D00C RCALL _WaitForEnable
(0122) LCM_RS_1;LCM_RW_0;_NOP();
00D8 9AC0 SBI 0x18,0
00D9 98C1 CBI 0x18,1
00DA 0000 NOP
(0123) DataPort=dataW;_NOP();
00DB BB4B OUT 0x1B,R20
00DC 0000 NOP
(0124) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
00DD 9AC2 SBI 0x18,2
00DE 0000 NOP
00DF 0000 NOP
00E0 98C2 CBI 0x18,2
00E1 940E029F CALL pop_gset1
00E3 9508 RET
(0125) }
(0126)
(0127) //*******************检测LCD忙信号子函数*********************
(0128) void WaitForEnable(void)
(0129) {
(0130) uchar val;
(0131) DataPort=0xff;
_WaitForEnable:
val --> R16
00E4 EF8F LDI R24,0xFF
00E5 BB8B OUT 0x1B,R24
(0132) LCM_RS_0;LCM_RW_1;_NOP();
00E6 98C0 CBI 0x18,0
00E7 9AC1 SBI 0x18,1
00E8 0000 NOP
(0133) LCM_EN_1;_NOP();_NOP();
00E9 9AC2 SBI 0x18,2
00EA 0000 NOP
00EB 0000 NOP
(0134) DDRA=0x00;
00EC 2422 CLR R2
00ED BA2A OUT 0x1A,R2
(0135) val=PINA;
00EE B309 IN R16,0x19
00EF C001 RJMP 0x00F1
(0136) while(val&Busy)val=PINA;
00F0 B309 IN R16,0x19
00F1 FD07 SBRC R16,7
00F2 CFFD RJMP 0x00F0
(0137) LCM_EN_0;
00F3 98C2 CBI 0x18,2
(0138) DDRA=0xff;
00F4 EF8F LDI R24,0xFF
00F5 BB8A OUT 0x1A,R24
00F6 9508 RET
(0139) }
(0140)
(0141) /********************端口初始化******************/
(0142) void port_init(void)
(0143) {
(0144) PORTA = 0x00;
_port_init:
00F7 2422 CLR R2
00F8 BA2B OUT 0x1B,R2
(0145) DDRA = 0xFF;
00F9 EF8F LDI R24,0xFF
00FA BB8A OUT 0x1A,R24
(0146) PORTB = 0x00;
00FB BA28 OUT 0x18,R2
(0147) DDRB = 0xFF;
00FC BB87 OUT 0x17,R24
(0148) PORTC = 0x00;
00FD BA25 OUT 0x15,R2
(0149) DDRC = 0x03;
00FE E083 LDI R24,3
00FF BB84 OUT 0x14,R24
(0150) PORTD = 0xFF;
0100 EF8F LDI R24,0xFF
0101 BB82 OUT 0x12,R24
(0151) DDRD = 0x00;
0102 BA21 OUT 0x11,R2
0103 9508 RET
(0152) }
(0153)
(0154) /*******************扫描按键******************/
(0155) uchar scan_key(void)
(0156) {
(0157) uchar temp;
(0158) temp=PIND;
_scan_key:
temp --> R16
0104 B300 IN R16,0x10
(0159) return temp;
0105 9508 RET
_i2c_Read:
temp --> R20
RomAddress --> R16
0106 940E029C CALL push_gset1
(0160) }
(0161)
(0162) /******************************************
(0163) I2C总线读一个字节
(0164) 如果读失败返回0
(0165) *******************************************/
(0166) unsigned char i2c_Read(unsigned char RomAddress)
(0167) {
(0168) unsigned char temp;
(0169) Start();
0108 EA84 LDI R24,0xA4
0109 BF86 OUT 0x36,R24
(0170) Wait();
010A B626 IN R2,0x36
010B FE27 SBRS R2,7
010C CFFD RJMP 0x010A
(0171) if (TestAck()!=START) return 0;
010D B181 IN R24,0x01
010E 7F88 ANDI R24,0xF8
010F 3088 CPI R24,0x8
0110 F011 BEQ 0x0113
0111 2700 CLR R16
0112 C040 RJMP 0x0153
(0172) Write8Bit(wr_device_add);
0113 EA80 LDI R24,0xA0
0114 B983 OUT 0x03,R24
0115 E884 LDI R24,0x84
0116 BF86 OUT 0x36,R24
(0173) Wait();
0117 B626 IN R2,0x36
0118 FE27 SBRS R2,7
0119 CFFD RJMP 0x0117
(0174) if (TestAck()!=MT_SLA_ACK) return 0;
011A B181 IN R24,0x01
011B 7F88 ANDI R24,0xF8
011C 3188 CPI R24,0x18
011D F011 BEQ 0x0120
011E 2700 CLR R16
011F C033 RJMP 0x0153
(0175) Write8Bit(RomAddress);
0120 B903 OUT 0x03,R16
0121 E884 LDI R24,0x84
0122 BF86 OUT 0x36,R24
(0176) Wait();
0123 B626 IN R2,0x36
0124 FE27 SBRS R2,7
0125 CFFD RJMP 0x0123
(0177) if (TestAck()!=MT_DATA_ACK) return 0;
0126 B181 IN R24,0x01
0127 7F88 ANDI R24,0xF8
0128 3288 CPI R24,0x28
0129 F011 BEQ 0x012C
012A 2700 CLR R16
012B C027 RJMP 0x0153
(0178) Start();
012C EA84 LDI R24,0xA4
012D BF86 OUT 0x36,R24
(0179) Wait();
012E B626 IN R2,0x36
012F FE27 SBRS R2,7
0130 CFFD RJMP 0x012E
(0180) if (TestAck()!=RE_START) return 0;
0131 B181 IN R24,0x01
0132 7F88 ANDI R24,0xF8
0133 3180 CPI R24,0x10
0134 F011 BEQ 0x0137
0135 2700 CLR R16
0136 C01C RJMP 0x0153
(0181) Write8Bit(rd_device_add);
0137 EA81 LDI R24,0xA1
0138 B983 OUT 0x03,R24
0139 E884 LDI R24,0x84
013A BF86 OUT 0x36,R24
(0182) Wait();
013B B626 IN R2,0x36
013C FE27 SBRS R2,7
013D CFFD RJMP 0x013B
(0183) if(TestAck()!=MR_SLA_ACK) return 0;
013E B181 IN R24,0x01
013F 7F88 ANDI R24,0xF8
0140 3480 CPI R24,0x40
0141 F011 BEQ 0x0144
0142 2700 CLR R16
0143 C00F RJMP 0x0153
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -