⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7289.h

📁 SPCE061A单片机的接近开关控制
💻 H
字号:
#ifndef	__7289_H__
#define	__7289_H__
//	write your header here

//////////////////////////////////////////////////////////////////////////
//						/cs   --   IOB12								//
//						clk   --   IOB13								//
//						data  --   IOB14								//
//						/key  --   IOB15								//
//								by 	KHOT									//
//									2007.8.3							//
//			使用时在主程序里面加上	#include "7289.h"					//
//////////////////////////////////////////////////////////////////////////


#include "SPCE061A.h"
extern unsigned int tb_count;

// IOB12,13,14   带数据缓存器的高电平输出,IOB15下拉输入
void init_7289(void)		
{	
	unsigned int data_out;
	*P_IOB_Dir |= 0x7000;	
	*P_IOB_Dir &= 0x7fff;	
							
	*P_IOB_Attrib |= 0x7000;
	*P_IOB_Attrib &= 0x7fff;
							
	*P_IOB_Data |= 0x7000;	
	*P_IOB_Data &= 0x7fff;	
							
	data_out = 0x00a4;		
	send(data_out);	
	*P_IOB_Data |= 0x1000;			//cs high
			
	delay(5);				
							
	*P_IOB_Data |= 0x1000;	
	delay(5);
}					

void send(unsigned int data)
{
	unsigned int i,a;
	
	*P_Watchdog_Clear = 0x0001;	
	
	*P_IOB_Dir |= 0x4000;			// B14(data)为带数据缓存器的高电平输出。
	*P_IOB_Attrib |= 0x4000;
	*P_IOB_Data |= 0x4000;
	
	data &= 0x00ff;          //取data的低八位
	data = data << 7;  
	*P_IOB_Data &= 0xefff;			// cs low  B12(CS)为低电平
	delay(1);  
	*P_IOB_Data &= 0xdfff;			// clk low CLK为低电平	
	for(i=0; i<8; i++)
		{
			a = data;
			a &= 0x4000;			//保留data的14位,其他的全为零
			*P_IOB_Data &= 0xbfff;	// IOB14 = 0,其他的不变。
			*P_IOB_Data |= a;		//将data的14位送给IOB14,并不影响IOB的其他位。
			
			*P_IOB_Data |= 0x2000;	// clk high			
			delay(3);			
			*P_IOB_Data &= 0xdfff;	// clk low		产生高电平宽度为delay(3)的脉冲,供CLK(8次)。	
			delay(3);				//延迟,清看门狗???
			data = data << 1;
		}
		
		//*P_IOB_Data |= 0x1000;	//cs high
		delay(3);
}

unsigned int receive(void)
{
	unsigned int i,j,a,b;
	
	*P_Watchdog_Clear = 0x0001;
	
	*P_IOB_Dir &= 0xbfff;			// data_changeto_input()让IOB14为带下拉电阻的输入,且不影响其他位
	*P_IOB_Attrib &= 0xbfff;
	*P_IOB_Data &= 0xbfff;
		
	j = 7;
	a = 0x0000;
	
	for(i=0; i<8; i++,j++)
		{
			b = 0x4000;
			*P_IOB_Data |= 0x2000;		// clk high将CLK置1。且不影响其他位,
			delay(1);
			
			b &= *P_IOB_Data;			//取出data (IOB14)的数据。
			b >>= j;
			a |= b;
			
			*P_IOB_Data &= 0xdfff;		// clk low
			delay(1);
		}
		
	*P_IOB_Data |= 0x1000;				//cs high
	delay(5);
	
	return a;
}

void display_7289(unsigned int *p)
{
	unsigned int i,command_out;
	unsigned int *data;
	
	data = p;
	command_out=0x00c8;		
	for(i=0; i<4; i++)
		{
			send(command_out);
			command_out++;
			send(data[i]);
			*P_IOB_Data |= 0x1000;			//cs high
			delay(1);
		}	
	*P_IOB_Data |= 0x1000;				//cs high
	delay(5);
}
void display_led(unsigned int led_addr,unsigned int value)
{
	//*P_IOB_Data &= 0xefff;			// cs low  B12(CS)为低电平
	//send(0x88);//消除闪烁
	//send(0xff);
	send(0xa4);                         //复位
	send(led_addr);
	delay(1);
	send(value);
	*P_IOB_Data |= 0x1000;				//cs high
	delay(3);
	*P_Watchdog_Clear=0x0001;	
}

void display_pos(float x1,float x2)
{
    unsigned int temp;
    unsigned int flag_hide=0xff;
    temp=((int)x1)/0x0a;
    if(temp!=0)
    {
        flag_hide=flag_hide|0x40;
        display_led(0x98,flag_hide);
        display_led(0x86,temp);    
    }
    else
    {
        flag_hide=flag_hide&0xbf;
        display_led(0x98,flag_hide); 
    }
   display_led(0x86,temp);    
    temp=((int)x1)%0x0a+0x80;
    display_led(0x85,temp);   
    temp=((int)(x1*10.0))%10;
    display_led(0x84,temp);


    temp=((int)x2)/0x64;
    if(temp!=0)
    {
        flag_hide=flag_hide|0x08;
        display_led(0x98,flag_hide);
        display_led(0x83,temp);    
    }
    else
    {
        flag_hide=flag_hide&0xf7;
        display_led(0x98,flag_hide); 
    }    
    temp=(((int)x2)/0x0a);
    if(temp!=0)
    {
        if(temp!=0x0a)
        {
            flag_hide=flag_hide|0x04;
            display_led(0x98,flag_hide);
            display_led(0x82,temp);    
        }
        else
        {
            flag_hide=flag_hide|0x04;
            display_led(0x98,flag_hide);
            display_led(0x82,0x00);    
        }
        
    }
    else
    {
        flag_hide=flag_hide&0xfb;
        display_led(0x98,flag_hide); 
    }
    temp=((int)x2)%0x0a+0x80;
    display_led(0x81,temp);
    temp=((int)(x2*10.0))%10;
    display_led(0x80,temp);
}

 int calc_keyvalue(unsigned int keybuf)
{
	unsigned int keyvalue;
	
	switch(keybuf)
		{
			case 04:
				keyvalue = 15;		break;
			case 12:
				keyvalue = 11;		break;
			case 20:
				keyvalue = 7;		break;
			case 28:
				keyvalue = 3;		break;
			case 05:
				keyvalue = 14;		break;
			case 13:
				keyvalue = 10;		break;
			case 21:
				keyvalue = 6;		break;
			case 29:
				keyvalue = 2;		break;
			case 06:
				keyvalue = 13;		break;
			case 14:
				keyvalue = 9;		break;	
			case 22:
				keyvalue = 5;		break;
			case 30:
				keyvalue = 1;		break;
			case 07:
				keyvalue = 12;		break;
			case 15:
				keyvalue = 8;		break;
			case 23:
				keyvalue = 4;		break;
			case 31:
				keyvalue =0;		break;
			default:
				break;
		}	
	return keyvalue;
}


void delay(unsigned int loop_counter)
{
	while(loop_counter--)
		;
	*P_Watchdog_Clear = 0x0001;
}

void delay_long(unsigned int num)
{
	unsigned int i=0,j=0;	
	for(i=0;i<num;i++)
		for(j=0;j<700;j++)
			*P_Watchdog_Clear = 0x0001;
}


void reset(void)
{
    send(0xa4);
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -