📄 新建_文本文档_(2).txt
字号:
DataBit=KeyData&0x01;
if(DataBit)
{
PORTD|=BIT(PD5);//SDT=SendBit;1
}
else
{
PORTD&=~BIT(PD5);//SDT=SendBit;0
}
delay_us(delaytime);//Delay30us();
PORTD&=~BIT(PD4);//SCK=!SCK;0
delay_us(delaytime);//Delay30us();
PORTD|=BIT(PD4);//SCK=!SCK,1
KeyData=KeyData>>1;//SendData=SendData>>1;
}
PORTD&=~BIT(PD5);//SDT=SendBit;0
delay_us(delaytime); //Delay30us();
PORTD&=~BIT(PD4);//SCK=!SCK;//0
delay_us(delaytime);//Delay30us();
PORTD|=BIT(PD4);//SCK=!SCK;//1
if(WithDog)
delay_us(350);
else
delay_ms(3);
PORTD|=BIT(PD5);
}
//发送一串缓冲数据到键盘口
void sendkeys(uchar *ptr,int len,uchar WithDog)
{
if(F_SendMode==0)
{
sound();
delay_s(2);
WDR(); //喂狗
nosound();
delay_s(2);
WDR(); //喂狗
sound();
delay_s(2);
WDR(); //喂狗
nosound();
delay_s(2);
WDR(); //喂狗
sound();
delay_s(2);
nosound();
WDR(); //喂狗
return;
}
if(F_SendMode==3)
{
if(!WithDog)
{
sound();
delay_s(2);
WDR(); //喂狗
nosound();
delay_s(2);
WDR(); //喂狗
sound();
delay_s(2);
WDR(); //喂狗
nosound();
delay_s(2);
WDR(); //喂狗
sound();
delay_s(2);
WDR(); //喂狗
return;
}
}
PORTD|=BIT(PD6);//1
if(F_SendMode==2)
{
sound();
}
while(len--!=0)
{
if(*ptr==0xFA)
{
if(WithDog)
delay_s(*(ptr+1));
else
delay_s(*(ptr+1)*10);
}
else if(*ptr==0xFB)
{
if(WithDog)
delay_ms(*(ptr+1));
else
delay_ms(*(ptr+1)*10);
}
else
sendkey(*ptr,WithDog);
ptr++;
}
PORTD&=~BIT(PD6);//0
if(F_SendMode==2)
{
nosound();
}
}
//******************************************************************************
//算法函数
//******************************************************************************
//CRC循环冗余校验算法--->一下就占了512个字节
unsigned int cal_crc(unsigned char *ptr, int len)
{
unsigned int crc;
unsigned char L=0;
unsigned char H=0;
unsigned char Flag=0;
crc=0;
while(len>0)
{
if(Flag==0)
{
// L=L|*ptr;
H=H&*ptr;
Flag=1;
}
else
{
//L=L&*ptr;
H=H|*ptr;
Flag=0;
}
ptr++;
len=len-1;
}
crc=H;
crc=crc<<8;
crc=crc|L;
return(crc);
}
//算出一串缓冲数据的CRC码并分别将高字节与低字节赋值
void CRC_Assign(uchar *ptr, uchar len,uchar *CRCH,uchar *CRCL)
{
unsigned int Result=cal_crc(ptr,len);
*CRCH=Result>>8;
*CRCL=Result&0xFF;
}
//计算一串缓冲数据的CRC码的高字节与低字节是否相同
unsigned char CRC_Check(uchar *ptr, int len,uchar CRCH,uchar CRCL)
{
unsigned int Result=cal_crc(ptr,len);
if(((Result&0xFF)==CRCL)&&((Result>>8)==CRCH))
return 1;
else
return 0;
}
//奇校验函数
unsigned char ParityCheck(unsigned char data)
{
uchar i;
uchar j;
uchar sum=0;
i=data;
for(j=1;j<=8;j++)
{
sum=sum+(0x01&i);
i=i>>1;
}
sum&=0x01;
return sum;
}
unsigned int BytesToInt(uchar byteH,uchar byteL)
{
unsigned int Result=0;
Result=byteH;
Result<<=8;
Result|=byteL;
return Result;
}
void IntToBytes_Assign(int *intValue, uchar *byteH,uchar *byteL)
{
*byteH=(*intValue>>8)&0xFF;
*byteL=*intValue&0xFF;
}
float BytesToFloat44(uchar byte1,uchar byte2,uchar byte3,uchar byte4)
{
float Result=byte1*100+byte2+byte3*0.01+byte4*0.0001;
return Result;
}
void FloatToBytes44_Assign(float *FloatValue, uchar *byte1,uchar *byte2,uchar *byte3,uchar *byte4)
{
//1234.5678
int intTemp=(int)(*FloatValue);
*byte1=(int)(intTemp/100);
*byte2=intTemp-*byte1*100;
intTemp=(float)(*FloatValue-intTemp)*10000;
*byte3=(int)(intTemp/100);
*byte4=intTemp-*byte3*100;
}
//******************************************************************************
//蜂鸣器的打开与关闭
//******************************************************************************
void sound()
{
PORTD|=BIT(PD7);
}
void nosound()
{
PORTD&=~BIT(PD7);
}
//*****************************************************************************
//指示灯的打开与关闭
//*****************************************************************************
//使指定的指示灯亮
void displayled(uchar Number)
{
switch(Number)
{
case 0:
PORTB|=BIT(PB0);
break;
case 1:
PORTB|=BIT(PB1);
break;
case 2:
PORTB|=BIT(PB2);
break;
case 3:
PORTB|=BIT(PB3);
break;
}
}
//使指定的指示灯灭
void nodisplayled(uchar Number)
{
switch(Number)
{
case 0:
PORTB&=~BIT(PB0);
break;
case 1:
PORTB&=~BIT(PB1);
break;
case 2:
PORTB&=~BIT(PB2);
break;
case 3:
PORTB&=~BIT(PB3);
break;
}
}
//******************************************************************************
//CH451 数码管显示,面板按钮 模块
//******************************************************************************
void ch451_init()
{
SPCR = 0x00; //setup SPI.禁用SPI
SPSR = 0x00; //setup SPI.禁用SPI
DDRB = 0xBF;
//DDRB=DDRB|0X70;
PORTB&=~BIT(PB5); //先低后高,选择4线输入
PORTB|=BIT(PB5); //启动CH451
PORTB|=BIT(PB4);
//DDRB=0XFF;
delay_us(50);
ch451_write(CH451_SYSON3);
delay_us(50);
ch451_write(CH451_BCD); //测试送入命令
delay_us(50);
}
//定义一无符号整型变量存储12字节的命令字。
void ch451_write(unsigned int command)
{
unsigned char i;
uchar DataBit;
DDRB = 0xBF;
//CLI(); //关闭一切中断
PORTB&=~BIT(PB4); //命令开始
for(i=0;i<12;i++)
{
DataBit=command&1;
if(DataBit)
{
PORTB|=BIT(PB5); ;//SDT=SendBit;1
}
else
{
PORTB&=~BIT(PB5);//SDT=SendBit;0
}
//送入12位数据,低位在前
PORTB&=~BIT(PB7);
command>>=1;
PORTB|=BIT(PB7); //上升沿有效
}
PORTB&=~BIT(PB4);
PORTB|=BIT(PB4);
//加载数据
//SEI();打开中断
}
//输入命令子程序,MCU从451读一字节
unsigned char ch451_read()
{
unsigned char i;
unsigned char command,keycode; //定义命令字,和数据存储器
uchar DataBit;
DDRB = 0xBF;
//DDRB&=~BIT(PB6);
// CLI(); //关闭一切中断
command=0x07; //输入读451命令字
PORTB&=~BIT(PB4);
//ch451_load=0; //命令开始
for(i=0;i<4;i++)
{
DataBit=command&1;
if(DataBit)
{
PORTB|=BIT(PB5); ;//SDT=SendBit;1
}
else
{
PORTB&=~BIT(PB5);//SDT=SendBit;0
}
//送入12位数据,低位在前
PORTB&=~BIT(PB7);
command>>=1;
PORTB|=BIT(PB7);
}
PORTB|=BIT(PB4); //产生加载上升沿通知CH451处理命令数据
keycode=0; //清除keycode
for(i=0;i<7;i++)
{
keycode<<=1; //数据移入keycode,高位在前,低位在后
keycode=keycode|((PINB&0X40)>>6);//从高到低读入451的数据
PORTB&=~BIT(PB7);//ch451_dclk=0; //产生时钟下升沿通知CH451输出下一位
PORTB|=BIT(PB7);//ch451_dclk=1;
}
// SEI();打开中断
DDRB = 0x00;
return(keycode); //返回键值
}
//显示一个数据缓冲
void putled(uchar N,uchar point,uchar Value)
{
ch451_init();
// ch451_init(); //测试送入命令
ch451_write(0X100*(7+N)+point*0x80+Value);
delay_us(50);
}
char readbutton()
{
return ch451_read();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -