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)
2020-6-28 15:11 上傳
點擊文件名下載附件
|