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

📄 sle4442.c

📁 51 - 音乐测试程序--------------------
💻 C
字号:
typedef unsigned char uchar;
typedef unsigned int  uint;

#include "DELAY.h" 
#include "io.h"

#define  IC_IOSDA   PINB.5   ///读卡引脚


/**********************************************************/ 
//启动4442卡
void sle4442_start(void)
{
    IC_CLK_LOW();
    delay_us(2);          //delay_us
    IC_RST_HIGH();
    delay_us(4);
    IC_IO_HIGH();
    delay_us(4);
    IC_RST_LOW();
    delay_us(4);
    IC_CLK_HIGH();
    delay_us(4);
    IC_IO_LOW();
    delay_us(2);
}
/**********************************************************/  
//  停止4442卡
void sle4442_stop(void)
{
    IC_CLK_LOW();
    IC_IO_LOW();
    delay_us(4);
    IC_CLK_HIGH();
    delay_us(4);
    IC_IO_HIGH();
    delay_us(4);
}
/**********************************************************/ 
//时钟
sle4442_wait_clk(uchar count)
{
    IC_CLK_LOW();
    delay_us(2);
    IC_IO_LOW();
    delay_us(2);
    do
    {
        IC_CLK_HIGH();
	    delay_us(2);
	    IC_CLK_LOW();
	    delay_us(2);
    }while(count--);
    IC_IO_HIGH();
}
/**********************************************************/ 
//写4442卡,一个字节
void sle4442_wb(uchar datas)
{
    uchar i;

    for(i=0;i<8;i++)
    {
        IC_CLK_LOW();
        delay_us(4);
	    if(datas & 0x01)
        {
            IC_IO_HIGH();
        }
	    else
        {
            IC_IO_LOW();
        }
        delay_us(4);
	    IC_CLK_HIGH();
	    delay_us(4);
	    datas = datas >> 1;
    }
}
/**********************************************************/
//读4442卡,一个字节
uchar sle4442_rb(void)
{
    uchar i,return_code;

    return_code = 0x00;

    IC_IO_DIR = INPUT;
    for(i=0;i<8;i++)
    {
        return_code = return_code >> 1;
	    IC_CLK_LOW();
	    delay_us(4);
	    IC_CLK_HIGH();
	    delay_us(4);
	    if(IC_IOSDA)      // 从PINB。5输入
            return_code = return_code | 0x80;
    }
    return return_code;
}
/**********************************************************/  
//发送3个字节命令  控制字,地址,数据
void sle4442_command(uchar cmd,uchar addr,uchar datas)
{
    sle4442_wb(cmd);
    sle4442_wb(addr);
    sle4442_wb(datas);
}
/**********************************************************/ 
//写4442卡   
uchar sle4442_write_byte(uchar dat,uchar addr)
{
    if(addr<32) return 1;
    sle4442_start();
    sle4442_command(0x38,addr,dat);
    sle4442_stop();
    sle4442_wait_clk(255);
    return 1;
}
/**********************************************************/  
//读4442数据块程序   数据指针,数据个数,地址
void sle4442_read_block(uchar *buffer,uchar data_len,uchar addr)
{
    uchar i;
    sle4442_start();                      //启动4442卡
    sle4442_command(0x30,addr,0x00);      //
    sle4442_stop();
    for(i=0;i<data_len;i++)               //
        buffer[i] = sle4442_rb();         //
}
/**********************************************************/
uchar sle4442_rdEC(void)
{
    sle4442_start();
    sle4442_command(0x31,0x00,0x00);
    sle4442_stop();
    return (sle4442_rb());
}
/**********************************************************/
uchar sle4442_vPSC(uchar p1,uchar p2,uchar p3)
{
    uchar e_code;

    e_code = sle4442_rdEC();

    if(e_code == 0) return 1;

    if(e_code ==0x07) e_code = 0x06;
    else 	if(e_code ==0x06) e_code = 0x04;
    else 	if(e_code ==0x04) e_code = 0x00;

    sle4442_start();
    sle4442_command(0x39, 0x00,e_code);
    sle4442_stop();
    sle4442_wait_clk(255);

    sle4442_start();
    sle4442_command(0x33, 0x01,p1);
    sle4442_stop();
    sle4442_wait_clk(8);

    sle4442_start();
    sle4442_command(0x33, 0x02,p2);
    sle4442_stop();
    sle4442_wait_clk(8);

    sle4442_start();
    sle4442_command(0x33, 0x03,p3);
    sle4442_stop();
    sle4442_wait_clk(8);

    sle4442_start();
    sle4442_command(0x39, 0x00,0xff);
    sle4442_stop();
    sle4442_wait_clk(124);

    e_code = sle4442_rdEC();

    if(e_code==0x07) return 0;
    else return 1;
}
/**********************************************************/
//复位与应答   
//0xa2, 0x13, 0x10, 0x91
uchar sle4442_reset_answer(void)
{
    uchar buf[4];

    IC_RST_HIGH();
    delay_us(4);
    IC_CLK_HIGH();
    delay_us(4);
    IC_CLK_LOW();
    delay_us(4);
    IC_RST_LOW();

    buf[0] = sle4442_rb();
    buf[1] = sle4442_rb();
    buf[2] = sle4442_rb();
    buf[3] = sle4442_rb();
    if(buf[0]!=0xa2) return 1;
    if(buf[1]!=0x13) return 1;
    if(buf[2]!=0x10) return 1;
    if(buf[3]!=0x91) return 1;
    return 0;
}
/**********************************************************/
uchar ic_check(void)                                //检查是否有卡
{
    uchar status;
    status = sle4442_reset_answer();
    if(status !=0x00) return 1;
    status = sle4442_vPSC(PS1,PS2,PS3);
    return status;
}
/**********************************************************/

⌨️ 快捷键说明

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