|
PIC16F639單片機(jī)C語言代碼,附件完整工程MPLAB IDE可直接打開,主要功能:3D天線可低頻(125K)喚醒,空中高頻端數(shù)據(jù)采用滾碼方式加密,PIC內(nèi)部硬件加密沒用。。。
單片機(jī)源程序如下:
- #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; //休眠、工作標(biāo)志位
- /*******************************************************************************************/
- /*void write_byte(unsigned char com,unsigned char addr,unsigned char byte) */
- /*com命令 addr為地址 byte要寫入寄存器的數(shù)據(jù) */
- /*寫命令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; //產(chǎn)生上升沿
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- //AFESDI = 0;
- }
- crc = 0; //用于數(shù)據(jù)位1的個(gè)數(shù)
- 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; //進(jìn)行數(shù)據(jù)采樣
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- //AFESDI = 0;
- }
- if(crc%2==0) //偶數(shù)個(gè)1
- {
- AFESDI = 1;
- AFESCLK = 1; //進(jìn)行數(shù)據(jù)采樣
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- AFESDI = 0;
- }
- else
- {
- AFESDI = 0;
- AFESCLK = 1; //進(jìn)行數(shù)據(jù)采樣
- asm("nop");
- asm("nop");
- asm("nop");
- asm("nop");
- AFESCLK = 0;
- AFESDI = 0;
- }
- TRISC = 0x08;
- AFECS = 1;
- }
- /*******************************************************************************************/
- /*unsigned char read_byte(unsigned char addr) */
- /*addr為地址 返回讀到數(shù)據(jù) */
- /*先寫入命令+地址+無效數(shù)據(jù)(合計(jì)16位)拉高CS 再拉低CS 發(fā)送SCLK時(shí)鐘讀出數(shù)據(jù) */
- /*******************************************************************************************/
- unsigned char read_byte(unsigned char addr)
- {
- unsigned int temp = 0;
- unsigned char i;
- write_byte(0x06,addr,0x00); //先寫入命令和地址和無效數(shù)據(jù)
-
- 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};//解調(diào)輸出無喚醒
- const unsigned char AFEConfig[6]={0xa0,0x00,0x00,0x00,0x00,0x00};//解調(diào)輸出喚醒序列
- unsigned char i,j,k; //0xa0,0x00,0x00,0x00,0x00,0x10
- unsigned char AFEConfig6 = 0; //列校驗(yàn)
- for(i=0;i<8;i++) //校驗(yàn)數(shù)據(jù),生成列校驗(yàn)寄存器的值
- {
- 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);
- }
- /*******************************************************************************************/
- /*初始化時(shí)鐘、IO、中斷 */
- /*******************************************************************************************/
- void InIt(void)
- {
- TRISC = 0x00; //0000 0000 //RC0.1.2.3.4.5輸出
- OSCCON = 0x71; //0110 0001 //內(nèi)部振蕩器用于系統(tǒng)時(shí)鐘:8MHz
- PCON = 0x00; //0000 1011 //電源控制
- T1CON=0x00;
- EECON1=0x00;
- CMCON0 = 0x07; //關(guān)閉引腳比較器功能、模擬端口轉(zhuǎn)入數(shù)字端口
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
key-pic16f639.rar
(132.86 KB, 下載次數(shù): 50)
2020-6-28 15:11 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|