PIC16F639单片机C语言代码,附件完整工程MPLAB IDE可直接打开,主要功能:3D天线可低频(125K)唤醒,空中高频端数据采用滚码方式加密,PIC内部硬件加密没用。。。
单片机源程序如下:
- #include <pic.h>
- #include <string.h>
- #include"Keeloq.h"
- __CONFIG(0x1004); //0001 0000 0000 0100
- #define LED RC0
- #define AFECS RC1 // CS
- #define AFESCLK RC2 // SCLK
- #define AFESDI RC3 // SDI
- bit Wake_flag = 0; //休眠、工作标志位
- /*******************************************************************************************/
- /*void write_byte(unsigned char com,unsigned char addr,unsigned char byte) */
- /*com命令 addr为地址 byte要写入寄存器的数据 */
- /*写命令0x07 读命令0x06 */
- /*******************************************************************************************/
- void write_byte(unsigned char com,unsigned char addr,unsigned char byte)
- {
- unsigned char i,temp;
- unsigned char dat;
- unsigned char crc;
-
- TRISC = 0x00; //RC0.1.2.3.4.5输出
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- AFESDI = 0;
- AFECS = 0; //使能SPI
- com = com << 4; //0000 0111
- temp = addr|com; //0111 xxxx
- temp = temp << 1; //将高位移除
- for(i=0;i<7;i++) //写命令加地址
- {
- dat = temp&0x80;
- temp = temp << 1;
- if(dat==0x80)
- AFESDI = 1;
- else
- AFESDI = 0;
- AFESCLK = 1; //产生上升沿
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- //AFESDI = 0;
- }
- crc = 0; //用于数据位1的个数
- temp = byte;
- for(i=0;i<8;i++)
- {
- dat = temp&0x80;
- temp = temp <<1;
- if(dat==0x80)
- {
- AFESDI = 1;
- crc ++;
- }
- else
- AFESDI = 0;
- AFESCLK = 1; //进行数据采样
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- //AFESDI = 0;
- }
- if(crc%2==0) //偶数个1
- {
- AFESDI = 1;
- AFESCLK = 1; //进行数据采样
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- AFESDI = 0;
- }
- else
- {
- AFESDI = 0;
- AFESCLK = 1; //进行数据采样
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- AFESDI = 0;
- }
- TRISC = 0x08;
- AFECS = 1;
- }
- /*******************************************************************************************/
- /*unsigned char read_byte(unsigned char addr) */
- /*addr为地址 返回读到数据 */
- /*先写入命令+地址+无效数据(合计16位)拉高CS 再拉低CS 发送SCLK时钟读出数据 */
- /*******************************************************************************************/
- unsigned char read_byte(unsigned char addr)
- {
- unsigned int temp = 0;
- unsigned char i;
- write_byte(0x06,addr,0x00); //先写入命令和地址和无效数据
-
- TRISC = 0x00; //0000 0100
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFECS = 0;
- for(i=0;i<16;i++) // 1010 0000 1
- {
- AFESCLK = 1;
- if(AFESDI) temp = temp|0x01;
- temp = temp<<1;
- AFESCLK = 0;
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- }
- TRISC = 0x08;
- AFECS = 1;
- temp = temp>>1;
- return temp;
- }
- /*******************************************************************************************/
- /*void LF_Configuration(void) */
- /*低频配置 */
- /*写命令0x07 读命令0x06 */
- /*******************************************************************************************/
- void LF_Configuration(void)
- {
- //const unsigned char AFEConfig[6]={0x00,0x00,0x00,0x00,0x00,0x30};//解调输出无唤醒
- const unsigned char AFEConfig[6]={0xa0,0x00,0x00,0x00,0x00,0x00};//解调输出唤醒序列
- unsigned char i,j,k; //0xa0,0x00,0x00,0x00,0x00,0x10
- unsigned char AFEConfig6 = 0; //列校验
- for(i=0;i<8;i++) //校验数据,生成列校验寄存器的值
- {
- j = 0;
- AFEConfig6 = AFEConfig6 <<1;
- for(k=0;k<6;k++)
- {
- switch(i)
- {
- case 0: j = j^(AFEConfig[k]&0x80);
- break;
- case 1: j = j^(AFEConfig[k]&0x40);
- break;
- case 2: j = j^(AFEConfig[k]&0x20);
- break;
- case 3: j = j^(AFEConfig[k]&0x10);
- break;
- case 4: j = j^(AFEConfig[k]&0x08);
- break;
- case 5: j = j^(AFEConfig[k]&0x04);
- break;
- case 6: j = j^(AFEConfig[k]&0x02);
- break;
- case 7: j = j^(AFEConfig[k]&0x01);
- break;
- }
- }
- if(j==0) AFEConfig6 = AFEConfig6 | 0x01;
- }
- /* while(1)
- {
- write_byte(0x07,0x00,AFEConfig[0]);
- Delay_1ms(5);
- } */
- write_byte(0x07,0x00,AFEConfig[0]);
- write_byte(0x07,0x01,AFEConfig[1]);
- write_byte(0x07,0x02,AFEConfig[2]);
- write_byte(0x07,0x03,AFEConfig[3]);
- write_byte(0x07,0x04,AFEConfig[4]);
- write_byte(0x07,0x05,AFEConfig[5]);
- write_byte(0x07,0x06,AFEConfig6);
- }
- /*******************************************************************************************/
- /*初始化时钟、IO、中断 */
- /*******************************************************************************************/
- void InIt(void)
- {
- TRISC = 0x00; //0000 0000 //RC0.1.2.3.4.5输出
- OSCCON = 0x71; //0110 0001 //内部振荡器用于系统时钟:8MHz
- PCON = 0x00; //0000 1011 //电源控制
- T1CON=0x00;
- EECON1=0x00;
- CMCON0 = 0x07; //关闭引脚比较器功能、模拟端口转入数字端口
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
key-pic16f639.rar
(132.86 KB, 下载次数: 50)
|