📄 tech.c
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NULL 0
#define STOP 1
#define PLAY 2
#define REC 3
#define FFW 4
#define REW 5
#define PAUSE 6
#define RET 7
#define EJECT 8
#define MEM 9
#define Reset 0x10
#define MTEST 0xf0
#define SetVol 0xf1
#define COPY 0xF2
#define WAIT { _nop_(); _nop_(); _nop_(); _nop_(); }
//#define FALSE 0
//#define TURE 1
//#define ADDRESS 0x88
//#define TWO_CHAN1DB 0xDF
//#define TWO_CHAN10DB 0xE7
//#define L_Chan1DB 0xAF
//#define L_Chan10DB 0xB7
//#define R_Chan1DB 0x2f
//#define R_Chan10DB 0x37
//#define CLEAR 0xf0
//#define OPENVOLUME 0x74
#define PT2259_START {SCL = 1; SDA = 1; SDA = 0;}
#define PT2259_STOP {SCL = 1; SDA = 0; SDA = 1;}
sbit SCL = P3^5 ;
sbit SDA = P3^4 ;
// uchar code AdjustDB [10] = {0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9};
//-----------------------------------------
sbit PIN_CD5508_DATAOUT = P2^0;
sbit PIN_CD5508_CLOCK = P2^1;
sbit PIN_CD5508_DATAIN = P2^2;
sbit PIN_CD5508_RESET = P2^5;
sbit SOLEA = P0^6; //MOTOR FFW
sbit SOLEB = P0^7; //MOTOR REW
sbit RecEn = P2^3;
sbit CS = P0^2; //CS------------------
sbit CLK = P0^1;//CLK-------------------
sbit DI = P0^0; //DI-----------------
sbit copy1=P3^6; //rec prog con
sbit copy2=P3^7;//rec prog con
sbit speed=P0^5;
sbit DOpen=P0^3;
sbit RecX=P0^4;
sbit RecX1=P2^7;
sbit TapeEN=P2^4;
bdata char CF1,CF,CF2;
sbit RUN = CF^5;
sbit RF = CF^7;
sbit SetMem = CF^2;
sbit MODI = CF^3;
sbit duibi=CF^4;
sbit Ccopy=CF^6;
sbit IsA = CF^0;
sbit IsB = CF^1;
sbit setAuto = CF1^0;
sbit setFollow =CF1^1;
sbit setRepeat1 =CF1^2;
sbit ST5508 = CF1^3;
sbit setSpeed = CF1^4;
sbit setRepeat2 =CF1^5;
sbit playend =CF1^6;
sbit followend =CF1^7;
sbit Setvol_C=CF2^0;
//sbit pR=CF2^1;
sbit high =CF2^2;
uchar code BASE=8;
//uchar code LED[]={0x5f,0x6,0x6b,0x2f,0x36,0x3d,0x7d,0x7,0x7f,0x3f,0x59};
//uchar code LED[]={0xf5,0x60,0xb6,0xf2,0x63,0xd3,0xd7,0x70,0xf7,0xf3,0xf5};
//uchar code LED[]={0xf5,0x60,0xb6,0xf2,0x63,0xd3,0xd7,0x70,0xf7,0xf3,0x77,0xc7,0x95,0xe6,0x97,0x17};
uchar code LED[]={0xbe,0x06,0x7c,0x5e,0xc6,0xda,0xfa,0x0e,0xfe,0xde,0xee,0xf2,0xb8,0x76,0xf8,0xe8,0xba,0xe6};//S7001A
uchar LCDdat[16];
uchar IsAorB[] = {0x00,0x10,0x20};
uchar CurrentFUN,LastFUN,CurrentVol,LastVol,RemoteFUN,RevDat,AutoRew;MDat,data_1db,CurrentPL; //TapeEN;
uint MemNub,OldNub,AutoStop;
uint CountNub;
uchar ucState,Fspeed,dkeyvol;
uint wTime;
bit RevOK;
//void play() reentrant;
void Pause();
void delay(uint x)
{
unsigned char j;
while(x--){
for(j=0;j<125;j++);//...........200..............//
}
}
//-----------------------------------------
void PT2259_Start(void)
{
//SCL = 0;
SCL = 1;
SDA = 1;
WAIT;
SDA = 0;
// WAIT;
//SCL = 0;
}
//-----------------------------------------
void PT2259_Stop(void)
{
SCL = 1;
SDA = 0;
WAIT;
SDA = 1;
}
//-----------------------------------------
/*
bit Check_Acknowledge(void)
{
SDA = 1;
SCL = 1;
WAIT;
if(SDA)
return 0;
else
return 1;
}
//-----------------------------------------
*/
void PT2259_WriteByte( uchar ucData )
{
uchar i;
for( i = 0; i < 8; i++)
{
SCL = 0;
WAIT;
SDA = ((ucData & 0x80) == 0x80);
WAIT;
SCL = 1;
WAIT;
ucData <<= 1;
}
SCL = 0;
SDA = 1;
SCL = 1;
}
//-----------------------------------------
void PT2259_Set( uchar ucData10DB,uchar ucData1DB )
{
PT2259_Start();
PT2259_WriteByte( 0x88 );
PT2259_WriteByte( ucData10DB );
PT2259_WriteByte( ucData1DB );
PT2259_Stop();
}
//-----------------------------------------
void PT2259_Clear()
{
PT2259_Start();
PT2259_WriteByte( 0x88); // is PT2259 address
PT2259_WriteByte( 0xf0 ); // clear register
PT2259_Stop();
}
void PT2259_OpenVolume(uchar Data)
{
PT2259_Start();
PT2259_WriteByte( 0x88); // is PT2259 address
PT2259_WriteByte( Data ); // clear register
PT2259_Stop();
}
//-----------------------------------------
void CD5508_SendCommand(uint wData)
{
uchar i,j;
i = j = 0;
do {
PIN_CD5508_CLOCK = 1; //同步
PIN_CD5508_DATAIN = 1;
delay(1);
PIN_CD5508_CLOCK = 0;
delay(1);///////////////////////////add new
// while ((PIN_CD5508_DATAOUT == 1) && (i++ < 32)); //等待回应信号
if (PIN_CD5508_DATAOUT == 0)
{
for (j=0; j<12; j++) {
PIN_CD5508_CLOCK = 1;
delay(1);
if (((wData >> j) & 0x0001) == 0x0001)
PIN_CD5508_DATAIN = 1;
else PIN_CD5508_DATAIN = 0;
PIN_CD5508_CLOCK = 0;
delay(1);
}
i=40;
}
}
while(i++<32);
PIN_CD5508_CLOCK = 1;
PIN_CD5508_DATAIN = 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
uchar CD5508_ReadState()
{
uchar i,j,sum;
uint wData;
wData = 0x0000;
wTime=0;
i = j = 0;
sum = 0;
CD5508_SendCommand( 0x0077 );//发送读数据命令
delay(1);
for (i=0; i<=15; i++) {
PIN_CD5508_CLOCK = 0;
delay(1);
if (PIN_CD5508_DATAOUT == 1)
{
wData = ((wData>>1)|0x8000);
}
else{
wData = ((wData>>1)|0x0000);
}
PIN_CD5508_CLOCK = 1;
delay(1);
}//////接收16位数据存入--WDATA--中
for (j=0; j<=7; j++) {
PIN_CD5508_CLOCK = 0;
delay(1);
if (PIN_CD5508_DATAOUT == 1) {
sum = ((sum>>1)|0x80);
}
else{
sum = ((sum>>1)|0x00);
}
PIN_CD5508_CLOCK = 1;
delay(1);
}/////////接收8位数据存入--SUM--中
PIN_CD5508_DATAIN = 1;
PIN_CD5508_CLOCK = 1;
ucState = ((wData & 0xFC00)>> 10);
wTime = (wData & 0x03FF);
return(ucState,wTime);
}
void bitLCD(uchar mod)
{
CLK = 1; CLK = 1;
if (mod==1)
DI = 1;
else
DI = 0;
CLK = 1; CLK = 1;
CLK = 0; CLK = 0;
CLK = 1; CLK = 1;
DI = 1;
}
void CommandLCD(uchar ord)
{
uchar i;
CS = 0;
bitLCD(1);
bitLCD(0);
bitLCD(0);
bitLCD(0);
for (i=0;i<8;i++)
if ((ord & (0x80>>i))==(0x80>>i))
bitLCD(1);
else
bitLCD(0);
bitLCD(0);
CS = 1;
}
void WriteLCD()
{
uchar i,j;
CS = 0;
bitLCD(1);
bitLCD(0);
bitLCD(1);
for (i=0;i<6;i++)
bitLCD(0);
for ( j=0;j<16;j++)
for( i=0; i<8; i++)
if ((LCDdat[j] & (0x80>>i))==(0x80>>i))
bitLCD(1);
else
bitLCD(0);
CS = 1;
}
void ShowLCD(void)
{
uchar i;
for (i=0;i<16;i++)
LCDdat[i] = 0; //clear
LCDdat[10] = LED[ wTime % 10];
LCDdat[9] = LED[(wTime % 100)/10];
LCDdat[8] = LED[(wTime % 1000)/100];
LCDdat[7] = LED[(wTime % 10000)/1000];
// LCDdat[10] = LED[CountNub % 10];
// LCDdat[9] = LED[(CountNub % 100)/10];
//LCDdat[8] = LED[(CountNub % 1000)/100];
// LCDdat[7] = LED[(CountNub % 10000)/1000];//display"0000" countnumb
// LCDdat[5] = 0x08; //display"TAPE"
//LCDdat[13] = LCDdat[13] | LED[0];
//LCDdat[14] = LCDdat[14] | LED[0];
if(IsA)LCDdat[0] =LCDdat[0] | 0x08; //display"A"
if(IsB)LCDdat[0] =LCDdat[0] | 0x04; //display"B"
switch(CurrentPL)
{ case 0:
PT2259_OpenVolume(0x74);
switch(CurrentVol&0x0f){
case 0: LCDdat[2] = 0xff; //01
LCDdat[3] = 0xff; break;//80
case 1: LCDdat[2] = 0x7f; //03
LCDdat[3] = 0xfe; break;//c0
case 2: LCDdat[2] = 0x3f; //07
LCDdat[3] = 0xfc; break;//e0
case 3: LCDdat[2] = 0x1f; //0f
LCDdat[3] = 0xf8; break;//f0
case 4: LCDdat[2] = 0x0f; //1f
LCDdat[3] = 0xf0; break;//f8
case 5: LCDdat[2] = 0x07; //3f
LCDdat[3] = 0xe0; break;//fc
case 6: LCDdat[2] = 0x03; //7f
LCDdat[3] = 0xc0; break;//fe
case 7: LCDdat[2] = 0x01; //ff
LCDdat[3] = 0x80; break;//ff
default: break;
}; break;
case 1:
PT2259_OpenVolume(0x75);
switch(CurrentVol&0x0f){
case 0: LCDdat[2] = 0xff; break;//01
case 1: LCDdat[2] = 0x7f; break;//03
case 2: LCDdat[2] = 0x3f; break;//07
case 3: LCDdat[2] = 0x1f; break;//0f
case 4: LCDdat[2] = 0x0f; break;//1f
case 5: LCDdat[2] = 0x07; break;//3f
case 6: LCDdat[2] = 0x03; break;//7f
case 7: LCDdat[2] = 0x01; break;//ff
default: break;
}; break;
case 2:
PT2259_OpenVolume(0x76);
switch(CurrentVol&0x0f){
case 0: LCDdat[3] = 0xff; break;//80
case 1: LCDdat[3] = 0xfe; break;//c0
case 2: LCDdat[3] = 0xfc; break;//e0
case 3: LCDdat[3] = 0xf8; break;//f0
case 4: LCDdat[3] = 0xf0; break;//f8
case 5: LCDdat[3] = 0xe0; break;//fc
case 6: LCDdat[3] = 0xc0; break;//fe
case 7: LCDdat[3] = 0x80; break;//ff
default: break;
}; break;
default: break;
}
if (ST5508)
{
LCDdat[14] = LCDdat[14] | LED[ucState&0x0f];
LCDdat[13] = LCDdat[13] | LED[(ucState>>4)&0x0f];
}
else{
if(high)
{LCDdat[13] = 0x40;
LCDdat[12] = 0xe6;
LCDdat[11] = 0x40; } //显示“H”
if(!high)
{LCDdat[13] = 0x40;
LCDdat[12] = 0xb0;
LCDdat[11] = 0x40; } //显示“L”
}
if (Ccopy)
{
LCDdat[14]= 0x59;// SHOW COPY
LCDdat[13]= 0x5f;
LCDdat[12]=0x73;
LCDdat[11]=0x3e;
}
if(setAuto)
{
LCDdat[5]=LCDdat[5]|0x80;
}
if(setFollow)
{
LCDdat[5]=LCDdat[5]|0x40;
LCDdat[10] = LED[ wTime % 10];
LCDdat[9] = LED[(wTime % 100)/10];
LCDdat[8] = LED[(wTime % 1000)/100];
// LCDdat[7] = LCDdat[7] | LED[(wTime % 10000)/1000];//显示跟度时间
}else{followend=0;}
if(duibi)
{LCDdat[5]=LCDdat[5]|0x10;
LCDdat[10] = LED[wTime % 10];
LCDdat[9] = LED[(wTime % 100)/10];
LCDdat[8] = LED[(wTime % 1000)/100];
}
if(setSpeed){
LCDdat[6]=LCDdat[6]|0x28;
switch(Fspeed){
case 0: LCDdat[7] = LED[0]; LCDdat[6]=LCDdat[6]|0x28; break;
case 1: LCDdat[7] = LED[1]; LCDdat[6]=LCDdat[6]|0x04; break;
case 2: LCDdat[7] = LED[2]; LCDdat[6]=LCDdat[6]|0x04; break;
case 3: LCDdat[7] = LED[1]; LCDdat[6]=LCDdat[6]|0x40; break;
case 4: LCDdat[7] = LED[2]; LCDdat[6]=LCDdat[6]|0x40; break;
case 5: LCDdat[7] = LED[3]; LCDdat[6]=LCDdat[6]|0x40; break;
default: break;
}
}
if(setRepeat1)
{
LCDdat[5]=LCDdat[5]|0x20;
//LCDdat[10] = LED[wTime &0x000f];
//LCDdat[9] = LED[(wTime>>4)&0x000f];
//LCDdat[8] = LED[(wTime>>8)&0x000f];
LCDdat[10] = LED[ wTime % 10];
LCDdat[9] = LED[(wTime % 100)/10];
LCDdat[8] = LED[(wTime % 1000)/100];
//LCDdat[7] = LED[(wTime>>12)&0x000f]; //显示复度时间
}
if (SetMem) LCDdat[5]=LCDdat[5] | 0x02;
switch(CurrentFUN){
case STOP: LCDdat[4] = 0x02; break;
case PLAY: LCDdat[4] = 0x40; break;
case FFW: LCDdat[4] = 0x10; break;
case REW: LCDdat[4] = 0x01; break;
case PAUSE: if (LastFUN==PLAY) LCDdat[4] = 0x20; else LCDdat[4] = 0x40; break;
case REC: LCDdat[0] = 0x80; break;
// case FOLLOW: LCDdat[5] = 0x40; break; //LCDdat[2]=LCDdat[2] | 0x08; break;
default: break;
}
/*
if (ST5508)
{
LCDdat[14] = LCDdat[14] | LED[ucState&0x0f];
LCDdat[13] = LCDdat[13] | LED[(ucState>>4)&0x0f];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -