📄 1.lst
字号:
__text_start:
__start:
0037 E5CF LDI R28,0x5F
0038 E0D4 LDI R29,4
0039 BFCD OUT 0x3D,R28
003A BFDE OUT 0x3E,R29
003B 51CE SUBI R28,0x1E
003C 40D0 SBCI R29,0
003D EA0A LDI R16,0xAA
003E 8308 STD Y+0,R16
003F 2400 CLR R0
0040 E7E9 LDI R30,0x79
0041 E0F0 LDI R31,0
0042 E010 LDI R17,0
0043 37E9 CPI R30,0x79
0044 07F1 CPC R31,R17
0045 F011 BEQ 0x0048
0046 9201 ST R0,Z+
0047 CFFB RJMP 0x0043
0048 8300 STD Z+0,R16
0049 E5E4 LDI R30,0x54
004A E0F0 LDI R31,0
004B E6A0 LDI R26,0x60
004C E0B0 LDI R27,0
004D E010 LDI R17,0
004E 36ED CPI R30,0x6D
004F 07F1 CPC R31,R17
0050 F021 BEQ 0x0055
0051 95C8 LPM
0052 9631 ADIW R30,1
0053 920D ST R0,X+
0054 CFF9 RJMP 0x004E
0055 940E0073 CALL _main
_exit:
0057 CFFF RJMP _exit
FILE: E:\MYAVRW~1\SPI双~2\1.c
(0001) #include < iom16v.h>
(0002) #include <macros.h>
(0003) #include "lcd1602.h"
(0004) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
(0005) void delayms(void)
(0006) {
(0007) char a;
(0008) for(a=0;a<141;a++)
_delayms:
a --> R16
0058 2700 CLR R16
0059 C001 RJMP 0x005B
005A 9503 INC R16
005B 380D CPI R16,0x8D
005C F3E8 BCS 0x005A
005D 9508 RET
_delay:
b --> R20
a --> R22
005E 940E016C CALL push_gset2
0060 01B8 MOVW R22,R16
(0009) ;
(0010) }
(0011) void delay(int a)
(0012) {
(0013) int b;
(0014) for(b=0;b<a;b++)
0061 2744 CLR R20
0062 2755 CLR R21
0063 C003 RJMP 0x0067
(0015) delayms();
0064 DFF3 RCALL _delayms
0065 5F4F SUBI R20,0xFF
0066 4F5F SBCI R21,0xFF
0067 1746 CP R20,R22
0068 0757 CPC R21,R23
0069 F3D4 BLT 0x0064
006A 940E0160 CALL pop_gset2
006C 9508 RET
(0016) }
(0017) void Spi_init()
(0018) {
(0019) DDRB|=(1<<6);
_Spi_init:
006D 9ABE SBI 0x17,6
(0020) SPCR=0xE3;
006E EE83 LDI R24,0xE3
006F B98D OUT 0x0D,R24
(0021) SPSR=0x00;
0070 2422 CLR R2
0071 B82E OUT 0x0E,R2
0072 9508 RET
_main:
str --> R20
0073 9722 SBIW R28,2
(0022) }
(0023)
(0024) void main()
(0025) {
(0026) char *str="receive data :";
0074 E64A LDI R20,0x6A
0075 E050 LDI R21,0
(0027)
(0028) DDRA=0xFF;
0076 EF8F LDI R24,0xFF
0077 BB8A OUT 0x1A,R24
(0029) PORTA=0x00;
0078 2422 CLR R2
0079 BA2B OUT 0x1B,R2
(0030) DDRB=0xFF;
007A BB87 OUT 0x17,R24
(0031) PORTB=0x00;
007B BA28 OUT 0x18,R2
(0032) DDRC=0x00;
007C BA24 OUT 0x14,R2
(0033) PORTC=0x00;
007D BA25 OUT 0x15,R2
(0034) DDRD=0x00;
007E BA21 OUT 0x11,R2
(0035) PORTD=0x00;
007F BA22 OUT 0x12,R2
(0036)
(0037)
(0038) SEI();
0080 9478 BSET 7
(0039)
(0040) Spi_init();
0081 DFEB RCALL _Spi_init
(0041)
(0042) LCD_init();
0082 940E012A CALL _LCD_init
(0043) LCD_write_str(0,0,str);
0084 8359 STD Y+1,R21
0085 8348 STD Y+0,R20
0086 2722 CLR R18
0087 2700 CLR R16
0088 940E00FC CALL _LCD_write_str
(0044)
(0045)
(0046)
(0047) while(1);
008A CFFF RJMP 0x008A
008B 9622 ADIW R28,2
008C 9508 RET
_in:
temp --> Y+1
008D 940E0185 CALL push_lset
008F 9724 SBIW R28,4
(0048)
(0049) }
(0050)
(0051)
(0052) #pragma interrupt_handler in:11
(0053) void in()
(0054) {
(0055) char temp[3];
(0056)
(0057)
(0058) temp[2]= (SPDR /100)%10+'0';
0090 E614 LDI R17,0x64
0091 B10F IN R16,0x0F
0092 940E014A CALL div8u
0094 E01A LDI R17,0xA
0095 940E0148 CALL mod8u
0097 2F80 MOV R24,R16
0098 5D80 SUBI R24,0xD0
0099 838B STD Y+3,R24
(0059) temp[1] = (SPDR /10) %10+'0';
009A E01A LDI R17,0xA
009B B10F IN R16,0x0F
009C 940E014A CALL div8u
009E E01A LDI R17,0xA
009F 940E0148 CALL mod8u
00A1 2F80 MOV R24,R16
00A2 5D80 SUBI R24,0xD0
00A3 838A STD Y+2,R24
(0060) temp[0] = (SPDR % 10)+'0';
00A4 E01A LDI R17,0xA
00A5 B10F IN R16,0x0F
00A6 940E0148 CALL mod8u
00A8 2F80 MOV R24,R16
00A9 5D80 SUBI R24,0xD0
00AA 8389 STD Y+1,R24
(0061)
(0062)
(0063) LCD_write_char(11,1,temp[2]);
00AB 802B LDD R2,Y+3
00AC 8228 STD Y+0,R2
00AD E021 LDI R18,1
00AE E00B LDI R16,0xB
00AF 940E0118 CALL _LCD_write_char
(0064)
(0065) LCD_write_char(12,1,temp[1]);
00B1 802A LDD R2,Y+2
00B2 8228 STD Y+0,R2
00B3 E021 LDI R18,1
00B4 E00C LDI R16,0xC
00B5 940E0118 CALL _LCD_write_char
(0066)
(0067) LCD_write_char(13,1,temp[0]);
00B7 8029 LDD R2,Y+1
00B8 8228 STD Y+0,R2
00B9 E021 LDI R18,1
00BA E00D LDI R16,0xD
00BB 940E0118 CALL _LCD_write_char
00BD 9624 ADIW R28,4
00BE 940E019C CALL pop_lset
00C0 9518 RETI
FILE: E:\MYAVRW~1\SPI双~2\lcd1602.c
(0001) /*
(0002) LCD1602液晶屏驱动模块
(0003) 1、可直接嵌入到项目中使用
(0004) 2、晶振频率:1M
(0005) 3、如晶振提高低层驱动延时要作相应修改
(0006)
(0007) AVR_AFA
(0008) www.iccavr.com
(0009) 程序编写过程中参照了peak的4线显示程序
(0010) peak:AVR论坛技术版版主
(0011) */
(0012)
(0013) #include <iom16v.h>
(0014)
(0015) #define RS_CLR PORTD &= ~(1 << PD3)
(0016) #define RS_SET PORTD |= (1 << PD3)
(0017)
(0018) #define RW_CLR PORTD &= ~(1 << PD4)
(0019) #define RW_SET PORTD |= (1 << PD4)
(0020)
(0021) #define EN_CLR PORTD &= ~(1 << PD6)
(0022) #define EN_SET PORTD |= (1 << PD6)
(0023)
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026)
(0027) if (n == 0) {
_delay_us:
n --> R16
00C1 3000 CPI R16,0
00C2 0701 CPC R16,R17
00C3 F409 BNE 0x00C5
(0028) return ;
00C4 C006 RJMP 0x00CB
(0029) }
(0030) while (--n);
00C5 01C8 MOVW R24,R16
00C6 9701 SBIW R24,1
00C7 018C MOVW R16,R24
00C8 3000 CPI R16,0
00C9 0701 CPC R16,R17
00CA F7D1 BNE 0x00C5
00CB 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
00CC 940E016C CALL push_gset2
(0031) }
(0032)
(0033) /*延时函数*/
(0034) void delay_ms(unsigned char i) {
(0035)
(0036) unsigned char a, b;
(0037) for (a = 1; a < i; a++) {
00CE E041 LDI R20,1
00CF C006 RJMP 0x00D6
(0038) for (b = 1; b; b++) {
00D0 E061 LDI R22,1
00D1 C001 RJMP 0x00D3
00D2 9563 INC R22
00D3 2366 TST R22
00D4 F7E9 BNE 0x00D2
00D5 9543 INC R20
00D6 1740 CP R20,R16
00D7 F3C0 BCS 0x00D0
00D8 940E0160 CALL pop_gset2
00DA 9508 RET
_LCD_write_com:
com --> R20
00DB 940E016E CALL push_gset1
00DD 2F40 MOV R20,R16
(0039) ;
(0040) }
(0041) }
(0042) }
(0043)
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046)
(0047) RS_CLR;
00DE 9893 CBI 0x12,3
(0048) RW_CLR;
00DF 9894 CBI 0x12,4
(0049) EN_SET;
00E0 9A96 SBI 0x12,6
(0050) PORTA = com;
00E1 BB4B OUT 0x1B,R20
(0051) delay_us(5);
00E2 E005 LDI R16,5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -