📄 ac15-1.lst
字号:
__start:
__text_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 36E2 CPI R30,0x62
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 940E0255 CALL _main
_exit:
0053 CFFF RJMP _exit
_ePutstr:
l --> R20
i --> R22
ptr --> R10
y --> R12
x --> R14
0054 940E0345 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-1\ac15-1.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) #define SCL_1 PORTC|=BIT(PC0)
(0014) #define SCL_0 PORTC&=~BIT(PC0)
(0015) #define SDA_1 PORTC|=BIT(PC1)
(0016) #define SDA_0 PORTC&=~BIT(PC1)
(0017) //======================================
(0018) #define PIN_SDA (PINC&0x02)
(0019) #define DataPort PORTA
(0020) #define Busy 0x80
(0021) #define xtal 8
(0022) #define Some_NOP(); _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
(0023) //=====================================
(0024) const uchar str0[]={"Write : "};//待显字符串
(0025) const uchar str1[]={"Read : "};//待显字符串
(0026) //========函数声明=========
(0027) void Delay_1ms(void);
(0028) void Delay_nms(uint n);
(0029) void WaitForEnable(void);
(0030) void LcdWriteData(uchar W);
(0031) void LcdWriteCommand(uchar CMD,uchar Attribc);
(0032) void InitLcd(void);
(0033) void Display(uchar dd);
(0034) void DisplayOneChar(uchar x,uchar y,uchar Wdata);
(0035) void ePutstr(uchar x,uchar y,uchar const *ptr);
(0036) void port_init(void);
(0037) //**********************显示指定座标的一串字符子函数**************
(0038) void ePutstr(uchar x,uchar y,uchar const *ptr)
(0039) {
(0040) uchar i,l=0;
005B 2744 CLR R20
005C C001 RJMP 0x005E
(0041) 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
(0042) for(i=0;i<l;i++){
0066 2766 CLR R22
0067 C014 RJMP 0x007C
(0043) 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
(0044) if(x==16){
0075 2D8E MOV R24,R14
0076 3180 CPI R24,0x10
0077 F419 BNE 0x007B
(0045) 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 940E0342 CALL pop_gset5
0081 9508 RET
_LocateXY:
temp --> R20
posy --> R22
posx --> R10
0082 940E0349 CALL push_gset3
0084 2F62 MOV R22,R18
0085 2EA0 MOV R10,R16
(0046) }
(0047) }
(0048) }
(0049) //*******************显示光标定位子函数******************
(0050) void LocateXY(char posx,char posy)
(0051) {
(0052) uchar temp;
(0053) temp&=0x7f;
0086 774F ANDI R20,0x7F
(0054) temp=posx&0x0f;
0087 2D4A MOV R20,R10
0088 704F ANDI R20,0xF
(0055) posy&=0x01;
0089 7061 ANDI R22,1
(0056) if(posy)temp|=0x40;
008A F009 BEQ 0x008C
008B 6440 ORI R20,0x40
(0057) temp|=0x80;
008C 6840 ORI R20,0x80
(0058) LcdWriteCommand(temp,0);
008D 2722 CLR R18
008E 2F04 MOV R16,R20
008F D031 RCALL _LcdWriteCommand
0090 940E033F CALL pop_gset3
0092 9508 RET
_DisplayOneChar:
Wdata --> Y+4
y --> R22
x --> R20
0093 940E034B CALL push_gset2
0095 2F62 MOV R22,R18
0096 2F40 MOV R20,R16
(0059) }
(0060) //*******************显示指定座标的一个字符子函数*******************
(0061) void DisplayOneChar(uchar x,uchar y,uchar Wdata)
(0062) {
(0063) LocateXY(x,y);
0097 2F26 MOV R18,R22
0098 2F04 MOV R16,R20
0099 DFE8 RCALL _LocateXY
(0064) LcdWriteData(Wdata);
009A 810C LDD R16,Y+4
009B D038 RCALL _LcdWriteData
009C 940E033C CALL pop_gset2
009E 9508 RET
(0065) }
(0066) //*******************LCD初始化子函数*********************
(0067) void InitLcd(void)
(0068) {
(0069) LcdWriteCommand(0x38,0);
_InitLcd:
009F 2722 CLR R18
00A0 E308 LDI R16,0x38
00A1 D01F RCALL _LcdWriteCommand
(0070) Delay_nms(5);
00A2 E005 LDI R16,5
00A3 E010 LDI R17,0
00A4 D05C RCALL _Delay_nms
(0071) LcdWriteCommand(0x38,0);
00A5 2722 CLR R18
00A6 E308 LDI R16,0x38
00A7 D019 RCALL _LcdWriteCommand
(0072) Delay_nms(5);
00A8 E005 LDI R16,5
00A9 E010 LDI R17,0
00AA D056 RCALL _Delay_nms
(0073) LcdWriteCommand(0x38,0);
00AB 2722 CLR R18
00AC E308 LDI R16,0x38
00AD D013 RCALL _LcdWriteCommand
(0074) Delay_nms(5);
00AE E005 LDI R16,5
00AF E010 LDI R17,0
00B0 D050 RCALL _Delay_nms
(0075) LcdWriteCommand(0x38,1);
00B1 E021 LDI R18,1
00B2 E308 LDI R16,0x38
00B3 D00D RCALL _LcdWriteCommand
(0076) LcdWriteCommand(0x08,1);
00B4 E021 LDI R18,1
00B5 E008 LDI R16,0x8
00B6 D00A RCALL _LcdWriteCommand
(0077) LcdWriteCommand(0x01,1);
00B7 E021 LDI R18,1
00B8 E001 LDI R16,1
00B9 D007 RCALL _LcdWriteCommand
(0078) LcdWriteCommand(0x06,1);
00BA E021 LDI R18,1
00BB E006 LDI R16,6
00BC D004 RCALL _LcdWriteCommand
(0079) 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 940E034B CALL push_gset2
00C3 2F62 MOV R22,R18
00C4 2F40 MOV R20,R16
(0080) }
(0081) //********************写命令到LCM子函数********************
(0082) void LcdWriteCommand(uchar CMD,uchar Attribc)
(0083) {
(0084) if(Attribc)WaitForEnable();
00C5 2366 TST R22
00C6 F009 BEQ 0x00C8
00C7 D01C RCALL _WaitForEnable
(0085) LCM_RS_0;LCM_RW_0;_NOP();
00C8 98C0 CBI 0x18,0
00C9 98C1 CBI 0x18,1
00CA 0000 NOP
(0086) DataPort=CMD;_NOP();
00CB BB4B OUT 0x1B,R20
00CC 0000 NOP
(0087) 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 940E033C CALL pop_gset2
00D3 9508 RET
_LcdWriteData:
dataW --> R20
00D4 940E034D CALL push_gset1
00D6 2F40 MOV R20,R16
(0088) }
(0089) //*******************写数据到LCM子函数********************
(0090) void LcdWriteData(uchar dataW)
(0091) {
(0092) WaitForEnable();
00D7 D00C RCALL _WaitForEnable
(0093) LCM_RS_1;LCM_RW_0;_NOP();
00D8 9AC0 SBI 0x18,0
00D9 98C1 CBI 0x18,1
00DA 0000 NOP
(0094) DataPort=dataW;_NOP();
00DB BB4B OUT 0x1B,R20
00DC 0000 NOP
(0095) 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 940E0350 CALL pop_gset1
00E3 9508 RET
(0096) }
(0097) //*******************检测LCD忙信号子函数*********************
(0098) void WaitForEnable(void)
(0099) {
(0100) uchar val;
(0101) DataPort=0xff;
_WaitForEnable:
val --> R16
00E4 EF8F LDI R24,0xFF
00E5 BB8B OUT 0x1B,R24
(0102) LCM_RS_0;LCM_RW_1;_NOP();
00E6 98C0 CBI 0x18,0
00E7 9AC1 SBI 0x18,1
00E8 0000 NOP
(0103) LCM_EN_1;_NOP();_NOP();
00E9 9AC2 SBI 0x18,2
00EA 0000 NOP
00EB 0000 NOP
(0104) DDRA=0x00;
00EC 2422 CLR R2
00ED BA2A OUT 0x1A,R2
(0105) val=PINA;
00EE B309 IN R16,0x19
00EF C001 RJMP 0x00F1
(0106) while(val&Busy)val=PINA;
00F0 B309 IN R16,0x19
00F1 FD07 SBRC R16,7
00F2 CFFD RJMP 0x00F0
(0107) LCM_EN_0;
00F3 98C2 CBI 0x18,2
(0108) DDRA=0xff;
00F4 EF8F LDI R24,0xFF
00F5 BB8A OUT 0x1A,R24
00F6 9508 RET
(0109) }
(0110) //****************************************
(0111) void Delay_1ms(void) //1mS延时子函数
(0112) { uint i;
(0113) for(i=1;i<(uint)(xtal*143-2);i++)
_Delay_1ms:
i --> R16
00F7 E001 LDI R16,1
00F8 E010 LDI R17,0
00F9 C002 RJMP 0x00FC
00FA 5F0F SUBI R16,0xFF
00FB 4F1F SBCI R17,0xFF
00FC 3706 CPI R16,0x76
00FD E0E4 LDI R30,4
00FE 071E CPC R17,R30
00FF F3D0 BCS 0x00FA
0100 9508 RET
_Delay_nms:
i --> R20
n --> R22
0101 940E034B CALL push_gset2
0103 01B8 MOVW R22,R16
(0114) ;
(0115) }
(0116) //====================================
(0117) void Delay_nms(uint n) //n*1mS延时子函数
(0118) {
(0119) uint i=0;
0104 2744 CLR R20
0105 2755 CLR R21
0106 C003 RJMP 0x010A
(0120) while(i<n)
(0121) {Delay_1ms();
0107 DFEF RCALL _Delay_1ms
(0122) i++;
0108 5F4F SUBI R20,0xFF
0109 4F5F SBCI R21,0xFF
010A 1746 CP R20,R22
010B 0757 CPC R21,R23
010C F3D0 BCS 0x0107
010D 940E033C CALL pop_gset2
010F 9508 RET
(0123) }
(0124) }
(0125) /*****************端口初始化********************/
(0126) void port_init(void)
(0127) {
(0128) PORTA = 0x00;
_port_init:
0110 2422 CLR R2
0111 BA2B OUT 0x1B,R2
(0129) DDRA = 0xFF;
0112 EF8F LDI R24,0xFF
0113 BB8A OUT 0x1A,R24
(0130) PORTB = 0x00;
0114 BA28 OUT 0x18,R2
(0131) DDRB = 0xFF;
0115 BB87 OUT 0x17,R24
(0132) PORTC = 0x00;
0116 BA25 OUT 0x15,R2
(0133) DDRC = 0x03;
0117 E083 LDI R24,3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -