📄 spi.lis
字号:
.module SPI.c
.area text(rom, con, rel)
0000 .dbfile E:\写的程序\AVR(C)/1602显示.c
0000 .dbfunc e delay_1us _delay_1us fV
.even
0000 _delay_1us::
0000 .dbline -1
0000 .dbline 22
0000 ; #include "1602显示.c"
0000 ; #include "4X4键盘.c"
0000 ;
0000 ; void spi_sent_init(void)
0000 ; { PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);
0000 ; DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4); //设置MOSI,SCK和SS为输出
0000 ; SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
0000 ; SPSR = 0x00; //预分频为128
0000 ; }
0000 ;
0000 ; unsigned char SPI_sent(unsigned int Data)
0000 ; {
0000 ; unsigned char sign;
0000 ; PORTB &=~ (1<<PB4); //强制接收方进入从模式
0000 ; SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
0000 ; SPDR = Data; //启动数据传输
0000 ; while(!(SPSR&(1<<SPIF))); //等待传输结束
0000 ; PORTB |= (1<<PB4);
0000 ; sign=SPSR;
0000 ; sign=SPDR;
0000 ; return sign;
0000 ; }
0000 .dbline 23
0000 ; /**********************************************************
0000 0000 nop
0002 .dbline -2
0002 L1:
0002 .dbline 0 ; func end
0002 0895 ret
0004 .dbend
0004 .dbfunc e delay_nus _delay_nus fV
0004 ; i -> R20,R21
0004 ; n -> R22,R23
.even
0004 _delay_nus::
0004 0E940000 xcall push_gset2
0008 B801 movw R22,R16
000A .dbline -1
000A .dbline 27
000A ; 注意下面接到的数据是发的两位,原因可能是多接收了一位
000A ; /************************************************************/
000A ; void SPI_receive_int(void)
000A ; {
000A .dbline 28
000A ; /* 设置MISO为输出,其他为输入 */
000A 4427 clr R20
000C 5527 clr R21
000E .dbline 29
000E ; DDRB=0x02;
000E 03C0 xjmp L6
0010 L3:
0010 .dbline 30
0010 F7DF xcall _delay_1us
0012 L4:
0012 .dbline 29
0012 4F5F subi R20,255 ; offset = 1
0014 5F4F sbci R21,255
0016 L6:
0016 .dbline 29
0016 4617 cp R20,R22
0018 5707 cpc R21,R23
001A D0F3 brlo L3
001C .dbline -2
001C L2:
001C 0E940000 xcall pop_gset2
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r i 20 i
0022 .dbsym r n 22 i
0022 .dbend
0022 .dbfunc e delay_1ms _delay_1ms fV
0022 ; i -> R16,R17
.even
0022 _delay_1ms::
0022 .dbline -1
0022 .dbline 34
0022 ; PORTB|=BIT(4);
0022 ; }
0022 ; unsigned char SPI_receive()
0022 ; {
0022 ; unsigned char receive;
0022 .dbline 36
0022 0027 clr R16
0024 1127 clr R17
0026 02C0 xjmp L11
0028 L8:
0028 .dbline 36
0028 L9:
0028 .dbline 36
0028 0F5F subi R16,255 ; offset = 1
002A 1F4F sbci R17,255
002C L11:
002C .dbline 36
002C ; SPCR = (1<<SPE)|(1<<DORD);/* 使能 SPI */
002C ; while(!(SPSR & (1<<SPIF)));/* 等待接收结束 */
002C 0437 cpi R16,116
002E E4E0 ldi R30,4
0030 1E07 cpc R17,R30
0032 D0F3 brlo L8
0034 .dbline -2
0034 L7:
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbsym r i 16 i
0036 .dbend
0036 .dbfunc e delay_nms _delay_nms fV
0036 ; i -> R20,R21
0036 ; n -> R22,R23
.even
0036 _delay_nms::
0036 0E940000 xcall push_gset2
003A B801 movw R22,R16
003C .dbline -1
003C .dbline 40
003C ; receive=SPSR;
003C ; receive=SPDR;
003C ; return receive;/* 返回数据 */
003C ; }
003C .dbline 41
003C ;
003C 4427 clr R20
003E 5527 clr R21
0040 .dbline 42
0040 ; void main(void)
0040 03C0 xjmp L16
0042 L13:
0042 .dbline 43
0042 EFDF xcall _delay_1ms
0044 L14:
0044 .dbline 42
0044 4F5F subi R20,255 ; offset = 1
0046 5F4F sbci R21,255
0048 L16:
0048 .dbline 42
0048 4617 cp R20,R22
004A 5707 cpc R21,R23
004C D0F3 brlo L13
004E .dbline -2
004E L12:
004E 0E940000 xcall pop_gset2
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r i 20 i
0054 .dbsym r n 22 i
0054 .dbend
0054 .dbfunc e LCD_init _LCD_init fV
.even
0054 _LCD_init::
0054 .dbline -1
0054 .dbline 72
0054 ; {
0054 ; unsigned char F_data=1,j=0;
0054 ; // /*
0054 ; LCD_init();
0054 ; while(1)
0054 ; {
0054 ; if(!(PINB&0x08))
0054 ; {
0054 ; SPI_receive_int();
0054 ; F_data=SPI_receive();
0054 ; LCD_write_chang_data(0,0,F_data);
0054 ; }
0054 ; }
0054 ; // */
0054 ; /*
0054 ; spi_sent_init();
0054 ; while(1)
0054 ; {
0054 ; DDRD=0xFF;
0054 ; if(key_press())
0054 ; {
0054 ; F_data=key_scan();
0054 ; //PORTB&=0xF7;
0054 ; j=SPI_sent(F_data);
0054 ; LCD_init();
0054 ; LCD_write_chang_data(0,0,F_data);
0054 ; }
0054 ; }
0054 ; // */
0054 ; }
0054 .dbline 73
0054 ; }
0054 8FEF ldi R24,255
0056 8ABB out 0x1a,R24
0058 .dbline 74
0058 ; }
0058 8BBB out 0x1b,R24
005A .dbline 75
005A ; }
005A 84BB out 0x14,R24
005C .dbline 76
005C ; }
005C 85BB out 0x15,R24
005E .dbline 77
005E ; }
005E 0FE0 ldi R16,15
0060 10E0 ldi R17,0
0062 E9DF xcall _delay_nms
0064 .dbline 78
0064 ; }
0064 2227 clr R18
0066 3327 clr R19
0068 08E2 ldi R16,40
006A 10E0 ldi R17,0
006C 16D0 xcall _LCD_write_char
006E .dbline 79
006E ; }
006E 2227 clr R18
0070 3327 clr R19
0072 0CE0 ldi R16,12
0074 10E0 ldi R17,0
0076 11D0 xcall _LCD_write_char
0078 .dbline 80
0078 ; }
0078 2227 clr R18
007A 3327 clr R19
007C 01E0 ldi R16,1
007E 10E0 ldi R17,0
0080 0CD0 xcall _LCD_write_char
0082 .dbline 81
0082 ; }
0082 2227 clr R18
0084 3327 clr R19
0086 06E0 ldi R16,6
0088 10E0 ldi R17,0
008A 07D0 xcall _LCD_write_char
008C .dbline -2
008C L17:
008C .dbline 0 ; func end
008C 0895 ret
008E .dbend
008E .dbfunc e LCD_en_write _LCD_en_write fV
.even
008E _LCD_en_write::
008E .dbline -1
008E .dbline 85
008E ; }
008E ; }
008E ; }
008E ; }
008E .dbline 86
008E ; }
008E AF9A sbi 0x15,7
0090 .dbline 87
0090 ; }
0090 01E0 ldi R16,1
0092 10E0 ldi R17,0
0094 B7DF xcall _delay_nus
0096 .dbline 88
0096 ; }
0096 AF98 cbi 0x15,7
0098 .dbline -2
0098 L18:
0098 .dbline 0 ; func end
0098 0895 ret
009A .dbend
009A .dbfunc e LCD_write_char _LCD_write_char fV
009A ; data_temp -> R22,R23
009A ; command_temp -> R20,R21
009A ; data -> R12,R13
009A ; command -> R10,R11
.even
009A _LCD_write_char::
009A 0E940000 xcall push_gset4
009E 6901 movw R12,R18
00A0 5801 movw R10,R16
00A2 .dbline -1
00A2 .dbline 100
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 ; }
00A2 .dbline 102
00A2 ; }
00A2 ; }
00A2 A501 movw R20,R10
00A4 .dbline 103
00A4 ; }
00A4 B601 movw R22,R12
00A6 .dbline 104
00A6 ; }
00A6 4FD0 xcall _LCD_wait_Ready
00A8 .dbline 105
00A8 ; }
00A8 AE98 cbi 0x15,6
00AA .dbline 106
00AA ; }
00AA 4030 cpi R20,0
00AC 4507 cpc R20,R21
00AE 69F4 brne L20
00B0 X0:
00B0 .dbline 107
00B0 ; }
00B0 .dbline 108
00B0 ; }
00B0 AD9A sbi 0x15,5
00B2 .dbline 109
00B2 ; }
00B2 8BB3 in R24,0x1b
00B4 8F70 andi R24,15
00B6 8BBB out 0x1b,R24
00B8 .dbline 110
00B8 ; }
00B8 CB01 movw R24,R22
00BA 807F andi R24,240
00BC 9070 andi R25,0
00BE 2BB2 in R2,0x1b
00C0 3324 clr R3
00C2 282A or R2,R24
00C4 392A or R3,R25
00C6 2BBA out 0x1b,R2
00C8 .dbline 111
00C8 ; }
00C8 0CC0 xjmp L21
00CA L20:
00CA .dbline 113
00CA ; }
00CA ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -