⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jb8_io~1.lst

📁 使用RC531读卡芯片读取二代身份证的模块软件设计部分
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0002) //本文件包含:                                                              *
(0003) //    (1)SPI0Init      : SPI0初始化                                        *
(0004) //    (2)SPI0SLAVECOM  : SPI0从机通信                                      *
(0005) //    (3)SPI1Init      : SPI1初始化                                        *
(0006) //    (4)SPI1MASTERCOM : SPI1主机通信                                      *
(0007) //硬件连接:                                                                *
(0008) //    (1)SPI0使用PTA口与外部控制芯片通信                                   *
(0009) //    (2)SPI1使用PTD口与射频基站芯片MF RC531通信                           *
(0010) //-------------------------------------------------------------------------*
(0011) //头文件
(0012) #include "SPI.h"         //SPI函数头文件
(0013) 
(0014) //函数
(0015) //SPI0Init:----------------------------------------------------------------*
(0016) //功能:SPI0通信初始化函数,定义为SPI从机                                    *
(0017) //参数:无                                                                  *
(0018) //返回:无                                                                  *
(0019) //#define SPI0_SS    3          //从机选择引脚位                           *
(0020) //#define SPI0_SCK   2          //时钟引脚                                 *
(0021) //#define SPI0_MOSI  1          //主出从入                                 *
(0022) //#define SPI0_MISO  0          //主入从出                                 *
(0023) //-------------------------------------------------------------------------*
(0024) void SPI0Init()
(0025) {
_SPI0Init:
    DEAB 12 16        Bset	1,0x16
(0026)     //定义接口数据方向
(0027)     //设定SPI0_SS引脚为下降沿中断
(0028)     DisableKBint();               //屏蔽键盘中断(IMASKK = 1)
(0029)     KBIER |= (1 << SPI0_SS);      //引脚中断使能
    DEAD 16 17        Bset	3,0x17
(0030)     KBSCR |= (1 << 2);            //清除键盘中断请求(ACKK = 1)
    DEAF 14 16        Bset	2,0x16
(0031)        
(0032)     SPI0_D &= ~(1 << SPI0_SCK);   //时钟信号
    DEB1 15 04        Bclr	2,0x04
(0033)     
(0034)     SPI0_D &= ~(1 << SPI0_MOSI);  //主出从入
    DEB3 13 04        Bclr	1,0x04
(0035)     
(0036)     SPI0_D |= (1 << SPI0_MISO);   //主入从出
    DEB5 10 04        Bset	0,0x04
(0037)     SPI0_P |= (1 << SPI0_MISO);   //初始化为高
    DEB7 10 00        Bset	0,0x00
    DEB9 81           rts	
_SPI0SLAVECOM:
  redata               --> X+0
  datalen              --> X+1
  snddata              --> X+4
    DEBA A7 FE        aiS	#-2
    DEBC 95           tSX	
(0038)     
(0039) }
(0040) 
(0041) //SPI0SLAVECOM:------------------------------------------------------------*
(0042) //功能:SPI0从机通信程序                                                    *
(0043) //参数:snddata-发送数据                                                    *
(0044) //返回:接收数据                                                            *
(0045) //#define SPI0_SS    3          从机选择引脚位                             *
(0046) //#define SPI0_SCK   2          时钟引脚                                   *
(0047) //#define SPI0_MOSI  1          主出从入                                   *
(0048) //#define SPI0_MISO  0          主入从出                                   *
(0049) //-------------------------------------------------------------------------*
(0050) INT8U SPI0SLAVECOM(INT8U snddata)
(0051) {
    DEBD A6 08        ldA	#8
    DEBF E7 01        stA	1,X
(0052)     INT8U redata;     //接收数据
(0053)     INT8U datalen;    //数据长度
(0054)     
(0055)     datalen = 0x08;   //每次发送8位
(0056)     
(0057)     //发送数据字节最高位上线
(0058)     if((snddata & (1 << 7 )) == 0x00)
    DEC1 E6 04        ldA	4,X
    DEC3 A5 80        bit	#-128
    DEC5 26 04        bne	0xDECB
(0059)     {
    DEC7 11 00        Bclr	0,0x00
(0060)         SPI0_P &= ~(1 << SPI0_MISO);    //置低电平
(0061)     }
    DEC9 20 5B        bra	0xDF26
(0062)     else
(0063)     {
    DECB 10 00        Bset	0,0x00
(0064)         SPI0_P |= (1 << SPI0_MISO);     //置高电平
(0065)     }
    DECD 20 57        bra	0xDF26
(0066)     
(0067)     //判断片选信号是否选中(低电平)
(0068)     while(((SPI0_P & (1 << SPI0_SS)) == 0x00) && datalen)
(0069)     {
    DECF 05 00FD      BRclr	2,0x00,0xDECF
(0070)         //从机选中
(0071)         //检测SCK时钟信号,空闲低电平,高电平为产生跳变
(0072)         while ((SPI0_P & (1 << SPI0_SCK)) == 0x00);     //为低电平则等待
(0073) 
(0074)         //SCK时钟高电平时操作        
(0075)         //读MOSI
(0076)         if((SPI0_P & (1 << SPI0_MOSI)) == 0x00)
    DED2 02 001A      BRset	1,0x00,0xDEEF
(0077)         {
    DED5 E6 01        ldA	1,X
    DED7 A0 01        sub	#1
    DED9 6E 0142      mov	#1,*__r2
    DEDC A4 07        and	#7
    DEDE 27 04        beq	0xDEE4
    DEE0 38 42        lsl	*__r2
    DEE2 4B FC        dbnzA	0xDF26
    DEE4 4E 4240      mov	*__r2,*__r0
    DEE7 33 40        com	*__r0
    DEE9 F6           ldA	0,X
    DEEA B4 40        and	*__r0
    DEEC F7           stA	0,X
(0078)             redata &= ~(1 << (datalen - 1));     //低电平            
(0079)         }
    DEED 20 13        bra	0xDF02
(0080)         else
(0081)         {
    DEEF E6 01        ldA	1,X
    DEF1 A0 01        sub	#1
    DEF3 6E 0142      mov	#1,*__r2
    DEF6 A4 07        and	#7
    DEF8 27 04        beq	0xDEFE
    DEFA 38 42        lsl	*__r2
    DEFC 4B FC        dbnzA	0xDF40
    DEFE F6           ldA	0,X
    DEFF BA 42        orA	*__r2
    DF01 F7           stA	0,X
(0082)             redata |= 1 << (datalen - 1 );       //高电平            
(0083)         }
    DF02 E6 01        ldA	1,X
    DF04 A1 01        cmp	#1
    DF06 23 19        bls	0xDF21
(0084)         
(0085)         //写MISO      
(0086)         if(datalen > 1)
(0087)         {
    DF08 A0 02        sub	#2
    DF0A 6E 0142      mov	#1,*__r2
    DF0D A4 07        and	#7
    DF0F 27 04        beq	0xDF15
    DF11 38 42        lsl	*__r2
    DF13 4B FC        dbnzA	0xDF57
    DF15 E6 04        ldA	4,X
    DF17 B4 42        and	*__r2
    DF19 26 04        bne	0xDF1F
(0088)             if((snddata & (1 << (datalen - 2 ))) == 0x00)
(0089)             {
    DF1B 11 00        Bclr	0,0x00
(0090)                 SPI0_P &= ~(1 << SPI0_MISO);     //置低电平
(0091)             }
    DF1D 20 02        bra	0xDF21
(0092)             else
(0093)             {
    DF1F 10 00        Bset	0,0x00
(0094)                 SPI0_P |= (1 << SPI0_MISO);      //置高电平
(0095)             }
    DF21 04 00FD      BRset	2,0x00,0xDF21
(0096)         }
(0097)         
(0098)         while ((SPI0_P & (1 << SPI0_SCK)) != 0x00);     //等待恢复为空闲低电平
(0099)         
(0100)         datalen--;                                      //继续下一位操作           
    DF24 6A 01        dec	1,X
(0101)     }//while
    DF26 06 0004      BRset	3,0x00,0xDF2D
    DF29 E6 01        ldA	1,X
    DF2B 26 A2        bne	0xDECF
(0102)     
(0103)     return redata;  //返回
    DF2D F6           ldA	0,X
    DF2E A7 02        aiS	#2
    DF30 81           rts	
(0104) } 
(0105) 
(0106) 
(0107) 
(0108) //SPI1Init:----------------------------------------------------------------*
(0109) //功能:SPI1通信初始化函数,定义为SPI主机                                    *
(0110) //参数:无                                                                  *
(0111) //返回:无                                                                  *
(0112) //#define SPI1_SS    7          //从机选择引脚位                           *
(0113) //#define SPI1_SCK   6          //时钟引脚                                 *
(0114) //#define SPI1_MOSI  5          //主出从入                                 *
(0115) //#define SPI1_MISO  4          //主入从出                                 *
(0116) //-------------------------------------------------------------------------*
(0117) void SPI1Init()
(0118) {
_SPI1Init:
    DF31 1E 07        Bset	7,0x07
(0119)     //定义引脚功能
(0120) 
(0121)     //1.从机选择    
(0122)     SPI1_D |= (1 << SPI1_SS);     //输出引脚
(0123)     SPI1_P |= (1 << SPI1_SS);     //初始化为高
    DF33 1E 03        Bset	7,0x03
(0124)     
(0125)     //2.时钟信号   
(0126)     SPI1_D |= (1 << SPI1_SCK);    //输出引脚   
    DF35 1C 07        Bset	6,0x07
(0127)     SPI1_P &= ~(1 << SPI1_SCK);   //初始化为低
    DF37 1D 03        Bclr	6,0x03
(0128)    
(0129)      
(0130)     //3.主出从入    
(0131)     SPI1_D |= (1 << SPI1_MOSI);   //输出引脚
    DF39 1A 07        Bset	5,0x07
(0132)     SPI1_P |= (1 << SPI1_MOSI);   //初始化为高
    DF3B 1A 03        Bset	5,0x03
(0133)     
(0134)     //4.主入从出  
(0135)     SPI1_D &= ~(1 << SPI1_MISO);   //输入引脚    
    DF3D 19 07        Bclr	4,0x07
    DF3F 81           rts	
_SPI1MASTERCOM:
  redata               --> X+0
  datalen              --> X+1
  i                    --> X+2
  snddata              --> X+5
    DF40 A7 FD        aiS	#-3
    DF42 95           tSX	
(0136)     //SPI1_P &= ~(1 << SPI1_MISO);   //初始化为低
(0137) 
(0138) }
(0139) 
(0140) //SPI1MASTERCOM:-----------------------------------------------------------*
(0141) //功能:SPI1主机通信程序                                                    *
(0142) //参数:snddata-发送数据                                                    *
(0143) //返回:接收数据                                                            *
(0144) //#define SPI1_SS    7          //从机选择引脚位                           *
(0145) //#define SPI1_SCK   6          //时钟引脚                                 *
(0146) //#define SPI1_MOSI  5          //主出从入                                 *
(0147) //#define SPI1_MISO  4          //主入从出                                 *
(0148) //-------------------------------------------------------------------------*
(0149) INT8U SPI1MASTERCOM(INT8U snddata)
(0150) {
    DF43 A6 08        ldA	#8
    DF45 E7 01        stA	1,X
(0151)     INT8U redata;     //接收数据
(0152)     INT8U datalen;    //数据长度
(0153)     INT8U i;
(0154)     
(0155)     datalen = 0x08;   //每次发送8位    
(0156)     
(0157)     //操作8位
(0158)     for(i = 0; i < datalen; i++)
    DF47 6F 02        clr	2,X
    DF49 20 58        bra	0xDFA3
(0159)     {
    DF4B E6 01        ldA	1,X
    DF4D A0 01        sub	#1
    DF4F E0 02        sub	2,X
    DF51 6E 0142      mov	#1,*__r2
    DF54 A4 07        and	#7
    DF56 27 04        beq	0xDF5C
    DF58 38 42        lsl	*__r2
    DF5A 4B FC        dbnzA	0xDF9E
    DF5C E6 05        ldA	5,X
    DF5E B4 42        and	*__r2
    DF60 26 04        bne	0xDF66
(0160)         //先将MOSI数据上线,高位优先
(0161)         if((snddata & (1 << (datalen - 1 - i ))) == 0x00)
(0162)         {
    DF62 1B 03        Bclr	5,0x03
(0163)             SPI1_P &= ~(1 << SPI1_MOSI);    //置低电平
(0164)         }
    DF64 20 02        bra	0xDF68
(0165)         else
(0166)         {
    DF66 1A 03        Bset	5,0x03
(0167)             SPI1_P |= (1 << SPI1_MOSI);      //置高电平
(0168)         } 
    DF68 08 031C      BRset	4,0x03,0xDF87
(0169)               
(0170)         //读MISO数据
(0171)         if((SPI1_P & (1 << SPI1_MISO)) == 0x00)
(0172)         {
    DF6B E6 01        ldA	1,X
    DF6D A0 01        sub	#1
    DF6F E0 02        sub	2,X
    DF71 6E 0142      mov	#1,*__r2
    DF74 A4 07        and	#7
    DF76 27 04        beq	0xDF7C
    DF78 38 42        lsl	*__r2
    DF7A 4B FC        dbnzA	0xDFBE
    DF7C 4E 4240      mov	*__r2,*__r0
    DF7F 33 40        com	*__r0
    DF81 F6           ldA	0,X
    DF82 B4 40        and	*__r0
    DF84 F7           stA	0,X
(0173)             redata &= ~(1 << (datalen - 1 - i));     //低电平            
(0174)         }
    DF85 20 15        bra	0xDF9C
(0175)         else
(0176)         {
    DF87 E6 01        ldA	1,X
    DF89 A0 01        sub	#1
    DF8B E0 02        sub	2,X
    DF8D 6E 0142      mov	#1,*__r2
    DF90 A4 07        and	#7
    DF92 27 04        beq	0xDF98
    DF94 38 42        lsl	*__r2
    DF96 4B FC        dbnzA	0xDFDA
    DF98 F6           ldA	0,X
    DF99 BA 42        orA	*__r2
    DF9B F7           stA	0,X
(0177)             redata |= 1 << (datalen -1 - i);         //高电平            
(0178)         }       
    DF9C 1C 03        Bset	6,0x03
(0179)                     
(0180)         //SPI1_SCK空闲时为低电平,通信时置高
(0181)         SPI1_P |= (1 << SPI1_SCK); 
(0182)         asm("NOP");
    DF9E 9D           nop	
(0183)         SPI1_P &= ~(1 << SPI1_SCK);    
    DF9F 1D 03        Bclr	6,0x03
(0184)     }//for 
    DFA1 6C 02        inc	2,X
    DFA3 E6 02        ldA	2,X
    DFA5 E1 01        cmp	1,X
    DFA7 25 A2        bcs	0xDF4B
(0185)         
(0186)     return redata;
    DFA9 F6           ldA	0,X
    DFAA A7 03        aiS	#3
    DFAC 81           rts	
_RFRegRead:
  ReData1              --> X+0
  ReData2              --> X+1
  SndData              --> X+2
  addr                 --> X+5
    DFAD A7 FD        aiS	#-3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -