📄 cmx865.c
字号:
//----------------------
#pragma CD DB SB OE OT(8,SPEED) OR
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//==================== CMX865_REF===
#define RESET 0x01
#define GENERALCONTROL 0xE0
#define TXMODE 0XE1
#define RXMODE 0XE2
#define TXDATA 0XE3
#define RXDATA 0XE5
#define STATUS 0XE6
#define PRGREG 0XE8
//==================================
#define POWERUP 0X1349//0x7b49//
sbit SYS_LED=P1^6;
sbit IRQN=P3^3;
//CMX865_communication pins.
//
sbit RDATA=P1^2;//sbit
sbit CDATA=P1^4;//sbit
sbit SCLK=P1^7;//sbit
sbit CSN=P1^5;//sbit
uchar lenth=3;
uchar CM865_Send_Flag=0;
uchar int_flag=0,send_one=0;
uint ii1,ii2;
uint xdata status_data;
uchar xdata H;
uchar xdata L;
uchar xdata sb,buff_var;
//===========================
void initialize_865(void);
void generalreset(void);
void wr2(uchar address, uint dataword);
void wr1(uchar address,uchar databyte);
void wr_byte(uchar byte);
void tx_data(uchar tx_dd);
void tx_string(uchar *tx_st);
uint m_read2(uchar address);
uchar rd1(uchar address);
uchar rd_byte(void);
void tx_data(uchar tx_dd)
{
TI=0;
SBUF=tx_dd;
while(!TI){;}
}
void tx_string(uchar *tx_st)
{
uchar m;
for(m=0;m<60;m++)
{
if(*tx_st!=0)
{
tx_data(*tx_st);
tx_st++;
}
else
break;
}
}
//-----------主程序
void main(void)
{
IE=0;TCON=0x04;
IRQN=1;
TMOD=0x21; //定时器T1设为工作方式2,自动装入
TH1=0xFD;
TL1=0xFD;
TR1=1;
REN=1;
SCON=0x50; //关中断
PCON=0;
SYS_LED=1;
tx_string("hello\r");
initialize_865();
m_read2(RXDATA);
IRQN=1;
EX1=1;EA=1;
wr1(TXDATA,0X00);
while(1){
_nop_();
}
}
void cmx865_int() interrupt 2 using 3
{
//m_read2(STATUS); //进入中断后应立即读取STATUS中的内容。否则读出来的数据就不对。
status_data=m_read2(STATUS);
wr1(TXDATA,0x33);
if(((status_data&0x8000)!=0))
{
tx_string("effect interrupt: ");
L=status_data;
H=status_data>>8;
tx_data(0x30+((H>>4)>9?((H>>4)+7):(H>>4)));
tx_data(0x30+((H&0x0f)>9?((H&0x0f)+7):(H&0x0f)));
tx_data(0x30+((L>>4)>9?((L>>4)+7):(L>>4)));
tx_data(0x30+((L&0x0f)>9?((L&0x0f)+7):(L&0x0f)));
tx_string("\r");
if(((status_data&0x1000)!=0))
{
;// wr1(TXDATA,0x33);
//sb=rd1(RXDATA);//CLEAR RX_FLAG;
/*for(ii1=0;ii1<16;ii1++){
status_data=m_read2(STATUS);
L=status_data;
H=status_data>>8;
tx_data(0x30+((H>>4)>9?((H>>4)+7):(H>>4)));
tx_data(0x30+((H&0x0f)>9?((H&0x0f)+7):(H&0x0f)));
tx_data(0x30+((L>>4)>9?((L>>4)+7):(L>>4)));
tx_data(0x30+((L&0x0f)>9?((L&0x0f)+7):(L&0x0f)));
tx_string("\r");
tx_string("output signal again\r");} */
}
else if((status_data&0x0040)!=0)
{
sb=rd1(RXDATA);
tx_string("acquired rxdata:");
tx_data(0x30+((sb>>4)>9?((sb>>4)+7):(sb>>4)));
tx_data(0x30+(sb&0x0f>9?((sb&0x0f)+7):(sb&0x0f)));
tx_string("\r");
}
send_one=0;
}
else
tx_string("uneffect interrupt\r");
SYS_LED=!SYS_LED;
}
void wr_byte(uchar byte)
{
uchar i;
SCLK=0;
for(i=8;i!=0;i--)
{
SCLK=0;
if(byte&0x80)
CDATA=1;
else
CDATA=0;
byte<<=1;
SCLK=1;
}
SCLK=0;
}
void wr1(uchar address,uchar databyte)
{
CSN=0;
wr_byte(address);
_nop_();
_nop_();
wr_byte(databyte);
CSN=1;
}
void wr2(uchar address, uint dataword)
{
uchar temp;
CSN=0;
wr_byte(address);
temp=dataword;
dataword>>=8;
wr_byte(dataword);
wr_byte(temp);
CSN=1;
}
uchar rd_byte(void) using 3
{
uchar xdata i;
uchar xdata j;
//Replay data send from cmx868 to the UC is valid when the CLOCK is high.
RDATA=1;
j=0;
SCLK=0;
for(i=0;i<8;i++)
{
SCLK=1;
j=j<<1;
if(RDATA==1)
j^=0x01;
SCLK=0;
}
return(j);
}
uchar rd1(uchar address) using 3
{
uchar xdata rbyte;
CSN=0;
wr_byte(address);
rbyte=rd_byte();
CSN=1;
return(rbyte);
}
uint m_read2(uchar address) using 3
{
uint xdata rbyte;
SCLK=0;
CSN=0;
wr_byte(address);
rbyte=rd_byte();
rbyte <<= 8;
rbyte=rbyte+rd_byte();
CSN=1;
SCLK=1;
return(rbyte);
}
void generalreset(void)
{
CSN=0;
wr_byte(RESET);
CSN=1;
}
void initialize_865(void)
{
uchar xdata tt0,tt1;
generalreset();
wr2(GENERALCONTROL,0X13c9);
for(tt0=0;tt0<6;tt0++)
{
for(tt1=0;tt1<255;tt1++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
wr2(GENERALCONTROL,POWERUP);
_nop_();
wr2(RXMODE,0X0000);
_nop_();
wr2(TXMODE,0X5016);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -