📄 ac15-2.lst
字号:
__text_start:
__start:
003B E5CF LDI R28,0x5F
003C E0D4 LDI R29,4
003D BFCD OUT 0x3D,R28
003E BFDE OUT 0x3E,R29
003F 51C0 SUBI R28,0x10
0040 40D0 SBCI R29,0
0041 EA0A LDI R16,0xAA
0042 8308 STD Y+0,R16
0043 2400 CLR R0
0044 E6E0 LDI R30,0x60
0045 E0F0 LDI R31,0
0046 E010 LDI R17,0
0047 36EA CPI R30,0x6A
0048 07F1 CPC R31,R17
0049 F011 BEQ 0x004C
004A 9201 ST R0,Z+
004B CFFB RJMP 0x0047
004C 8300 STD Z+0,R16
004D E7E6 LDI R30,0x76
004E E0F0 LDI R31,0
004F E6A0 LDI R26,0x60
0050 E0B0 LDI R27,0
0051 E010 LDI R17,0
0052 37E6 CPI R30,0x76
0053 07F1 CPC R31,R17
0054 F021 BEQ 0x0059
0055 95C8 LPM
0056 9631 ADIW R30,1
0057 920D ST R0,X+
0058 CFF9 RJMP 0x0052
0059 940E0264 CALL _main
_exit:
005B CFFF RJMP _exit
_ePutstr:
l --> R20
i --> R22
ptr --> R10
y --> R12
x --> R14
005C 940E0444 CALL push_gset5
005E 2EC2 MOV R12,R18
005F 2EE0 MOV R14,R16
0060 9721 SBIW R28,1
0061 84AB LDD R10,Y+11
0062 84BC LDD R11,Y+12
FILE: d:\MYDOCU~1\ac15-2\ac15-2.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) #define LED_1 PORTB|=BIT(PB7)
(0018) #define LED_0 PORTB&=~BIT(PB7)
(0019) //======================================
(0020) #define PIN_SDA (PINC&0x02)
(0021) #define DataPort PORTA
(0022) #define Busy 0x80
(0023) #define xtal 8
(0024) #define Some_NOP(); _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
(0025) //======================================
(0026) const uchar str0[]={"-Time : : --"};//待显字符串
(0027) const uchar str1[]={"-ATime : : --"};//待显字符串
(0028) //========函数声明=========
(0029) void Delay_1ms(void);
(0030) void Delay_nms(uint n);
(0031) void WaitForEnable(void);
(0032) void LcdWriteData(uchar W);
(0033) void LcdWriteCommand(uchar CMD,uchar Attribc);
(0034) void InitLcd(void);
(0035) void Display(uchar dd);
(0036) void DisplayOneChar(uchar x,uchar y,uchar Wdata);
(0037) void ePutstr(uchar x,uchar y,uchar const *ptr);
(0038) void port_init(void);
(0039) void init_devices(void);
(0040) void timer1_init(void);
(0041) //**********************显示指定座标的一串字符子函数**************
(0042) void ePutstr(uchar x,uchar y,uchar const *ptr)
(0043) {
(0044) uchar i,l=0;
0063 2744 CLR R20
0064 C001 RJMP 0x0066
(0045) while(ptr[l]>31){l++;}
0065 9543 INC R20
0066 2FE4 MOV R30,R20
0067 27FF CLR R31
0068 0DEA ADD R30,R10
0069 1DFB ADC R31,R11
006A 91E4 LPM R30,0(Z)
006B E18F LDI R24,0x1F
006C 178E CP R24,R30
006D F3B8 BCS 0x0065
(0046) for(i=0;i<l;i++){
006E 2766 CLR R22
006F C014 RJMP 0x0084
(0047) DisplayOneChar(x++,y,ptr[i]);
0070 2FE6 MOV R30,R22
0071 27FF CLR R31
0072 0DEA ADD R30,R10
0073 1DFB ADC R31,R11
0074 91E4 LPM R30,0(Z)
0075 83E8 STD Y+0,R30
0076 2D2C MOV R18,R12
0077 2C2E MOV R2,R14
0078 2D82 MOV R24,R2
0079 5F8F SUBI R24,0xFF
007A 2EE8 MOV R14,R24
007B 2D02 MOV R16,R2
007C D01E RCALL _DisplayOneChar
(0048) if(x==16){
007D 2D8E MOV R24,R14
007E 3180 CPI R24,0x10
007F F419 BNE 0x0083
(0049) x=0;y^=1;
0080 24EE CLR R14
0081 E081 LDI R24,1
0082 26C8 EOR R12,R24
0083 9563 INC R22
0084 1764 CP R22,R20
0085 F350 BCS 0x0070
0086 9621 ADIW R28,1
0087 940E0441 CALL pop_gset5
0089 9508 RET
_LocateXY:
temp --> R20
posy --> R22
posx --> R10
008A 940E0448 CALL push_gset3
008C 2F62 MOV R22,R18
008D 2EA0 MOV R10,R16
(0050) }
(0051) }
(0052) }
(0053) //*******************显示光标定位子函数******************
(0054) void LocateXY(char posx,char posy)
(0055) {
(0056) uchar temp;
(0057) temp&=0x7f;
008E 774F ANDI R20,0x7F
(0058) temp=posx&0x0f;
008F 2D4A MOV R20,R10
0090 704F ANDI R20,0xF
(0059) posy&=0x01;
0091 7061 ANDI R22,1
(0060) if(posy)temp|=0x40;
0092 F009 BEQ 0x0094
0093 6440 ORI R20,0x40
(0061) temp|=0x80;
0094 6840 ORI R20,0x80
(0062) LcdWriteCommand(temp,0);
0095 2722 CLR R18
0096 2F04 MOV R16,R20
0097 D031 RCALL _LcdWriteCommand
0098 940E043E CALL pop_gset3
009A 9508 RET
_DisplayOneChar:
Wdata --> Y+4
y --> R22
x --> R20
009B 940E044A CALL push_gset2
009D 2F62 MOV R22,R18
009E 2F40 MOV R20,R16
(0063) }
(0064) //*******************显示指定座标的一个字符子函数*******************
(0065) void DisplayOneChar(uchar x,uchar y,uchar Wdata)
(0066) {
(0067) LocateXY(x,y);
009F 2F26 MOV R18,R22
00A0 2F04 MOV R16,R20
00A1 DFE8 RCALL _LocateXY
(0068) LcdWriteData(Wdata);
00A2 810C LDD R16,Y+4
00A3 D038 RCALL _LcdWriteData
00A4 940E043B CALL pop_gset2
00A6 9508 RET
(0069) }
(0070) //*******************LCD初始化子函数*********************
(0071) void InitLcd(void)
(0072) {
(0073) LcdWriteCommand(0x38,0);
_InitLcd:
00A7 2722 CLR R18
00A8 E308 LDI R16,0x38
00A9 D01F RCALL _LcdWriteCommand
(0074) Delay_nms(5);
00AA E005 LDI R16,5
00AB E010 LDI R17,0
00AC D05C RCALL _Delay_nms
(0075) LcdWriteCommand(0x38,0);
00AD 2722 CLR R18
00AE E308 LDI R16,0x38
00AF D019 RCALL _LcdWriteCommand
(0076) Delay_nms(5);
00B0 E005 LDI R16,5
00B1 E010 LDI R17,0
00B2 D056 RCALL _Delay_nms
(0077) LcdWriteCommand(0x38,0);
00B3 2722 CLR R18
00B4 E308 LDI R16,0x38
00B5 D013 RCALL _LcdWriteCommand
(0078) Delay_nms(5);
00B6 E005 LDI R16,5
00B7 E010 LDI R17,0
00B8 D050 RCALL _Delay_nms
(0079) LcdWriteCommand(0x38,1);
00B9 E021 LDI R18,1
00BA E308 LDI R16,0x38
00BB D00D RCALL _LcdWriteCommand
(0080) LcdWriteCommand(0x08,1);
00BC E021 LDI R18,1
00BD E008 LDI R16,0x8
00BE D00A RCALL _LcdWriteCommand
(0081) LcdWriteCommand(0x01,1);
00BF E021 LDI R18,1
00C0 E001 LDI R16,1
00C1 D007 RCALL _LcdWriteCommand
(0082) LcdWriteCommand(0x06,1);
00C2 E021 LDI R18,1
00C3 E006 LDI R16,6
00C4 D004 RCALL _LcdWriteCommand
(0083) LcdWriteCommand(0x0c,1);
00C5 E021 LDI R18,1
00C6 E00C LDI R16,0xC
00C7 D001 RCALL _LcdWriteCommand
00C8 9508 RET
_LcdWriteCommand:
Attribc --> R22
CMD --> R20
00C9 940E044A CALL push_gset2
00CB 2F62 MOV R22,R18
00CC 2F40 MOV R20,R16
(0084) }
(0085) //********************写命令到LCM子函数********************
(0086) void LcdWriteCommand(uchar CMD,uchar Attribc)
(0087) {
(0088) if(Attribc)WaitForEnable();
00CD 2366 TST R22
00CE F009 BEQ 0x00D0
00CF D01C RCALL _WaitForEnable
(0089) LCM_RS_0;LCM_RW_0;_NOP();
00D0 98C0 CBI 0x18,0
00D1 98C1 CBI 0x18,1
00D2 0000 NOP
(0090) DataPort=CMD;_NOP();
00D3 BB4B OUT 0x1B,R20
00D4 0000 NOP
(0091) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
00D5 9AC2 SBI 0x18,2
00D6 0000 NOP
00D7 0000 NOP
00D8 98C2 CBI 0x18,2
00D9 940E043B CALL pop_gset2
00DB 9508 RET
_LcdWriteData:
dataW --> R20
00DC 940E044C CALL push_gset1
00DE 2F40 MOV R20,R16
(0092) }
(0093) //*******************写数据到LCM子函数********************
(0094) void LcdWriteData(uchar dataW)
(0095) {
(0096) WaitForEnable();
00DF D00C RCALL _WaitForEnable
(0097) LCM_RS_1;LCM_RW_0;_NOP();
00E0 9AC0 SBI 0x18,0
00E1 98C1 CBI 0x18,1
00E2 0000 NOP
(0098) DataPort=dataW;_NOP();
00E3 BB4B OUT 0x1B,R20
00E4 0000 NOP
(0099) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
00E5 9AC2 SBI 0x18,2
00E6 0000 NOP
00E7 0000 NOP
00E8 98C2 CBI 0x18,2
00E9 940E044F CALL pop_gset1
00EB 9508 RET
(0100) }
(0101) //*******************检测LCD忙信号子函数*********************
(0102) void WaitForEnable(void)
(0103) {
(0104) uchar val;
(0105) DataPort=0xff;
_WaitForEnable:
val --> R16
00EC EF8F LDI R24,0xFF
00ED BB8B OUT 0x1B,R24
(0106) LCM_RS_0;LCM_RW_1;_NOP();
00EE 98C0 CBI 0x18,0
00EF 9AC1 SBI 0x18,1
00F0 0000 NOP
(0107) LCM_EN_1;_NOP();_NOP();
00F1 9AC2 SBI 0x18,2
00F2 0000 NOP
00F3 0000 NOP
(0108) DDRA=0x00;
00F4 2422 CLR R2
00F5 BA2A OUT 0x1A,R2
(0109) val=PINA;
00F6 B309 IN R16,0x19
00F7 C001 RJMP 0x00F9
(0110) while(val&Busy)val=PINA;
00F8 B309 IN R16,0x19
00F9 FD07 SBRC R16,7
00FA CFFD RJMP 0x00F8
(0111) LCM_EN_0;
00FB 98C2 CBI 0x18,2
(0112) DDRA=0xff;
00FC EF8F LDI R24,0xFF
00FD BB8A OUT 0x1A,R24
00FE 9508 RET
(0113) }
(0114) //****************************************
(0115) void Delay_1ms(void) //1mS延时子函数
(0116) { uint i;
(0117) for(i=1;i<(uint)(xtal*143-2);i++)
_Delay_1ms:
i --> R16
00FF E001 LDI R16,1
0100 E010 LDI R17,0
0101 C002 RJMP 0x0104
0102 5F0F SUBI R16,0xFF
0103 4F1F SBCI R17,0xFF
0104 3706 CPI R16,0x76
0105 E0E4 LDI R30,4
0106 071E CPC R17,R30
0107 F3D0 BCS 0x0102
0108 9508 RET
_Delay_nms:
i --> R20
n --> R22
0109 940E044A CALL push_gset2
010B 01B8 MOVW R22,R16
(0118) ;
(0119) }
(0120) //====================================
(0121) void Delay_nms(uint n) //n*1mS延时子函数
(0122) {
(0123) uint i=0;
010C 2744 CLR R20
010D 2755 CLR R21
010E C003 RJMP 0x0112
(0124) while(i<n)
(0125) {Delay_1ms();
010F DFEF RCALL _Delay_1ms
(0126) i++;
0110 5F4F SUBI R20,0xFF
0111 4F5F SBCI R21,0xFF
0112 1746 CP R20,R22
0113 0757 CPC R21,R23
0114 F3D0 BCS 0x010F
0115 940E043B CALL pop_gset2
0117 9508 RET
(0127) }
(0128) }
(0129) /*******************定义结构体变量time1,time2*******************/
(0130) struct date
(0131) {
(0132) uchar hour;
(0133) uchar min;
(0134) uchar sec;
(0135) uchar dida;
(0136) }time1,time2;
(0137)
(0138) /*******************端口初始化*******************/
(0139) void port_init(void)
(0140) {
(0141) PORTA = 0x00;
_port_init:
0118 2422 CLR R2
0119 BA2B OUT 0x1B,R2
(0142) DDRA = 0xFF;
011A EF8F LDI R24,0xFF
011B BB8A OUT 0x1A,R24
(0143) PORTB = 0x00;
011C BA28 OUT 0x18,R2
(0144) DDRB = 0xFF;
011D BB87 OUT 0x17,R24
(0145) PORTC = 0x00;
011E BA25 OUT 0x15,R2
(0146) DDRC = 0x03;
011F E083 LDI R24,3
0120 BB84 OUT 0x14,R24
(0147) PORTD = 0xFF;
0121 EF8F LDI R24,0xFF
0122 BB82 OUT 0x12,R24
(0148) DDRD = 0x00;
0123 BA21 OUT 0x11,R2
0124 9508 RET
(0149) }
(0150) /*************************************/
(0151) char com_data;
(0152) uchar cnt;
(0153) void delay_iic(int n);
(0154) uchar rd_24c01(char a);
(0155) void wr_24c01(char a,char b);
(0156) /******************扫描按键***************/
(0157) uchar scan_key(void)
(0158) {
(0159) uchar temp;
(0160) temp=PIND;
_scan_key:
temp --> R16
0125 B300 IN R16,0x10
(0161) return temp;
0126 9508 RET
_delay:
i --> R20
j --> R22
k --> R16
0127 940E044A CALL push_gset2
(0162) }
(0163) /***************延时子函数******************/
(0164) void delay(uint k)
(0165) {
(0166) uint i,j;
(0167) for(i=0;i<k;i++)
0129 2744 CLR R20
012A 2755 CLR R21
012B C00B RJMP 0x0137
(0168) {for(j=0;j<121;j++)
012C 2766 CLR R22
012D 2777 CLR R23
012E C002 RJMP 0x0131
012F 5F6F SUBI R22,0xFF
0130 4F7F SBCI R23,0xFF
0131 3769 CPI R22,0x79
0132 E0E0 LDI R30,0
0133 077E CPC R23,R30
0134 F3D0 BCS 0x012F
0135 5F4F SUBI R20,0xFF
0136 4F5F SBCI R21,0xFF
0137 1740 CP R20,R16
0138 0751 CPC R21,R17
0139 F390 BCS 0x012C
013A 940E043B CALL pop_gset2
013C 9508 RET
(0169) {;}}
(0170) }
(0171)
(0172) /*****************启动读写时序子函数******************/
(0173) void start(void)
(0174) {DDRC=0x03;
_start:
013D E083 LDI R24,3
013E BB84 OUT 0x14,R24
(0175) SDA_1;Some_NOP();
013F 9AA9 SBI 0x15,1
0140 0000 NOP
0141 0000 NOP
0142 0000 NOP
0143 0000 NOP
0144 0000 NOP
0145 0000 NOP
0146 0000 NOP
0147 0000 NOP
(0176) SCL_1;Some_NOP();
0148 9AA8 SBI 0x15,0
0149 0000 NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -