📄 spi.s
字号:
.module spi.c
.area text(rom, con, rel)
.dbfile E:\PQ-1A\我的AVR\无线模拟\spi.c
.dbfunc e delayms _delayms fV
; x -> R20,R21
; y -> R22,R23
; z -> R16,R17
.even
_delayms::
xcall push_gset2
.dbline -1
.dbline 53
; #include <iom128v.h>
; #include <iom128.h>
; #include <macros.h>
; #include <BIT.h>
; #define uchar unsigned char
; #define uint unsigned int
;
; #define CSN _PB0
; #define SCK _PB1
; #define MOSI _PB2
; #define MISO READ_PB3
;
; /*#define BYTE_BIT0 0x01
; #define BYTE_BIT1 0x02
; #define BYTE_BIT2 0x04
; #define BYTE_BIT3 0x08
; #define BYTE_BIT4 0x10
; #define BYTE_BIT5 0x20
; #define BYTE_BIT6 0x40
; #define BYTE_BIT7 0x80
;
; uchar DATA_BUF;
; #define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
; #define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)
;
; /*从最高位到最低位依次是:hafc debg
; uchar table[]=//这个译码数组0、123467已经改好了! by张强
; //589也已改好 lly
; {0x7e, 0x12, 0x4f,0x5b
; ,0x33, 0x79, 0x7d, 0x52,
; 0x7f,0x7b};//段选编码*/
;
; /*******************************************
; 函数名称: delayus
; 功 能: 延时指定微秒(8.31M晶振)
; 参 数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
; 返回值 : 无
; /*******************************************
; void delayus(uint us)
; {
; uint i;
; us=us*13/10; //13/10是在8.31MHz晶振下,通过软件仿真反复实验得到的数值
; for( i=0;i<us;i++);
; } */
;
; /*******************************************
; 函数名称: delay()
; 功 能: 8.31MHz晶振下延时 z ms
; 参 数: z
; 返回值 : 无
; /********************************************/
; void delayms(uint z)
; {
.dbline 55
; uint x,y;
; for(x=z;x>0;x--)
movw R20,R16
xjmp L5
L2:
.dbline 56
ldi R22,1185
ldi R23,4
xjmp L9
L6:
.dbline 56
L7:
.dbline 56
subi R22,1
sbci R23,0
L9:
.dbline 56
cpi R22,0
cpc R22,R23
brne L6
X0:
L3:
.dbline 55
subi R20,1
sbci R21,0
L5:
.dbline 55
cpi R20,0
cpc R20,R21
brne L2
X1:
.dbline -2
.dbline 57
; for(y=1185;y>0;y--);
; }
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r x 20 i
.dbsym r y 22 i
.dbsym r z 16 i
.dbend
.dbfunc e SpiInit _SpiInit fV
.even
_SpiInit::
.dbline -1
.dbline 60
;
; void SpiInit(void)
; {
.dbline 61
; DDRA=0XFF;
ldi R24,255
out 0x1a,R24
.dbline 62
; DDRB|=BIT(0)|BIT(1)|BIT(2);
in R24,0x17
ori R24,7
out 0x17,R24
.dbline 63
; DDRB&=~BIT(3);
cbi 0x17,3
.dbline 64
; PORTB|=BIT(3);
sbi 0x18,3
.dbline 65
; CSN=1; // Spi disable
in R24,0x18
ori R24,1
out 0x18,R24
.dbline 66
; SCK=0; // Spi clock line init low
in R24,0x18
andi R24,253
out 0x18,R24
.dbline -2
.dbline 67
; }
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; num -> R20,R21
.even
_main::
.dbline -1
.dbline 113
; /*
; unsigned char SpiRead(void)
; {
; unsigned char i;
; for (i=0;i<8;i++)
; {
; DATA_BUF=DATA_BUF<<1;
; SCK=1;
; //OED&=0XFD; // DATA=1; //设置为输入状态
; if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
; {
; DATA_BUF|=BYTE_BIT0;
; }
; else
; {
; DATA_BUF&=~BYTE_BIT0;
; }
; //OED|=0X02;
; SCK=0;
; }
; return DATA_BUF;
; }
;
; void SpiWrite(unsigned char send)
; {
; unsigned char i;
; DATA_BUF=send;
; for (i=0;i<8;i++)
; {
; if (DATA7) //总是发送最高位
; {
; MOSI=1;
; }
; else
; {
; MOSI=0;
; }
; SCK=1;
; DATA_BUF=DATA_BUF<<1;
; SCK=0;
; }
; }
; */
;
; void main()
; {
.dbline 115
; uint num;
; SpiInit();
xcall _SpiInit
.dbline 116
; PORTA=0X55;
ldi R24,85
out 0x1b,R24
xjmp L13
L12:
.dbline 118
; while(1)
; {
.dbline 119
; if(MISO==0)
in R24,0x16
lsr R24
lsr R24
lsr R24
andi R24,1
brne L15
.dbline 120
; {
.dbline 121
; num++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 122
; }
L15:
.dbline 123
out 0x1b,R20
.dbline 124
ldi R16,1000
ldi R17,3
xcall _delayms
.dbline 125
L13:
.dbline 117
xjmp L12
X2:
.dbline -2
.dbline 126
; PORTA=num;
; delayms(1000);
; }
; }
L11:
.dbline 0 ; func end
ret
.dbsym r num 20 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -