|

楼主 |
发表于 2022-9-6 12:40:30
|
显示全部楼层
本帖最后由 860858828 于 2022-9-6 12:45 编辑
- //*********************************************************
- #include "SYSCFG.h"
- //***********************宏定义****************************
- #define uint8 unsigned char
- #define uint16 unsigned int
- #define P_TXD1 PA0 //PA1串口打印
- const unsigned char key[]={0X01,0X23,0X45,0X67,0X89,0XAB,0XCD,0XEF};
- const unsigned char NLF[2][2][2][2][2]=
- {
- 0,1,1,1,0,1,0,0,
- 0,0,1,0,1,1,1,0,
- 0,0,1,1,1,0,1,0,
- 0,1,0,1,1,1,0,0,
- };
- void POWER_INITIAL(void)
- {
- OSCCON = 0B01110000; //IRCF=111=16MHz/4T=4MHz,0.25us
- INTCON = 0; //暂禁止所有中断
- OPTION = 0B00001000; //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1
- PORTA = 0B00000000;
- TRISA = 0B00000000; //PA输入输出 0-输出 1-输入
- //PA4-输出
- WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
- MSCKCON = 0B00000000;
- //Bit4=0,禁止LVR(60F01x O版之前)
- //Bit4=0,LVREN使能时,开启LVR(60F01x O版及O版之后)
- //Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60F01x O版及O版后)
- }
- /********************** 模拟串口相关函数************************/
- void BitTime(void) //位时间函数 9600的波特率发送1位的时候为104.166us
- { //发送一个字节的时间为104.1667*10=1041.667us=1.041ms
- uint16 i;
- i= 33;
- while(--i);
- }
- //模拟串口发送
- void send_byte(uint8 dat) //9600,N,8,1 发送一个字节
- {
- uint8 i;
- GIE = 0;
- P_TXD1 = 0;
- BitTime(); //每位延时一下
- for(i=0; i<8; i++)
- {
- if(dat & 1) P_TXD1 = 1;
- else P_TXD1 = 0;
- dat >>= 1;
- BitTime(); ////每位延时一下
- }
- P_TXD1 = 1;
- GIE = 1;
- BitTime(); ////每位延时一下
- BitTime();
- }
- unsigned char getBit(unsigned char source[],int n)
- {
- unsigned char temp0=(unsigned char)1<<(n%8);
- unsigned char temp1=source[n/8]&temp0;
- if(temp1!=0)
- {
- return 1;
- }
- return 0;
- }
-
- unsigned char * RRC(unsigned char source[],char c,char n)
- {
- int i=0;
- unsigned char temp;
- for(i=n-1;i>=0;i--)
- {
- temp=source[i];
- if(c!=0){
- source[i]=(source[i]>>1)|0x80;
- }else{
- source[i]=(source[i]>>1)&0x7f;
- }
-
- if(temp&0x01!=0){
- c=1;
- }else{
- c=0;
- }
- }
- return source;
- }
-
- unsigned char * RLC(unsigned char source[],char c,char n)
- {
- int i=0;
- unsigned char temp;
- for(i=0;i<n;i++)
- {
- temp=source[i];
- if(c!=0){
- source[i]=(source[i]<<1)|0x01;
- }else{
- source[i]=(source[i]<<1)&0xfe;
- }
-
- if((temp&0x80)!=0){
- c=1;
- }else{
- c=0;
- }
- }
- return source;
- }
-
- unsigned char * CRYPT(unsigned char *source)
- {
- int i=0;
- unsigned char c=0;
- unsigned char nlf,y16,y0,k,result;
- // init();
- for (i = 0; i < 528; i++)
- {
- nlf=NLF[getBit(source, 31)][getBit(source, 26)][getBit(source, 20)][getBit(source, 9)][getBit(source, 1)];
- y16=getBit(source, 16);
- y0=getBit(source, 0);
- k=getBit(key, i%64);
- result=nlf^y16^y0^k;
- if (result!=0) {
- c=1;
- }else {
- c=0;
- }
- source=RRC(source,c,4);
- }
- return source;
- }
- void main()
- {
- unsigned char source[4]={0x12,0x34, 0x56, 0x78}; //原始数据,,
- unsigned char *p;
- POWER_INITIAL();
- P_TXD1=1; //串口发射脚先置1
- p=source;
-
- send_byte(0xaa);
- send_byte (source[0]); //串口打印原理数据
- send_byte (source[1]); //串口打印原理数据
- send_byte (source[2]); //串口打印原理数据
- send_byte (source[3]);
- send_byte(0xaa);
-
- p=CRYPT(p);
-
- send_byte(0xaa);
- send_byte (source[0]); //串口打印处理后的数据
- send_byte (source[1]); //串口打印处理后的数据
- send_byte (source[2]); //串口打印处理后的数据
- send_byte (source[3]); //串口打印处理后的数据
- send_byte(0xaa);
-
- while(1);
- }
-
复制代码
|
|