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

📄 7289.c

📁 SPCE061A 7289 键盘显示控制
💻 C
字号:
//////////////////////////////////////////////////////////////////////////
//						/cs   --   IOB12								//
//						clk   --   IOB13								//
//						data  --   IOB14								//
//						/key  --   IOB15								//
//								by 	ouc									//
//									2005.9.1							//
//			使用时在主程序里面加上	#include "7289.h"	
//               注释后加 ; 的为自己注释 07.7.28		                    	//
//////////////////////////////////////////////////////////////////////////




#include "SPCE061A.h"

void delay(unsigned int time_counter);


////////////////////////////////////////
//void dis_play1(unsigned int aa) // 写指令和写数据函数
//{
//unsigned int  i,k;
//for(i=0;i<8;i++)
//{
//	aa<<i;
	
//if( k&0x80)
//*P_IOB_Data |= 0x4000;
//else *P_IOB_Data |= 0x0000;
//*P_IOB_Data |= 0x2000;		// clk high将CLK置1。且不影响其他位
//delay(3); // 延时
//*P_IOB_Data &= 0xdfff;			// clk low CLK为低电平
//}
//}
/////////////////////////////////////////////


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 &= 0xdfff;			// clk low CLK为低电平
	
	*P_IOB_Data &= 0xefff;			// cs low  B12(CS)为低电平	
	delay(3);
	
	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;		//每次只送一位;
		}
}

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(7);
	
	return a;
}

void display_7289(unsigned int *p)
{
	unsigned int i,command_out;
	unsigned int *data;
	
	data = p;
	//command_out=0x0080;
	command_out=0x0084; //自己改的		
	for(i=0; i<8; i++)
		{
			send(command_out);
			command_out++;
			send(data[i]);
			
			*P_IOB_Data |= 0x1000;			//cs high
			delay(1);
		}
	*P_IOB_Data |= 0x1000;			//cs high
	delay(7);
}
void display_led(unsigned int led_addr,unsigned int value)
{
	send(led_addr);
	send(value);
	*P_IOB_Data |= 0x1000;			//cs high
	delay(3);
}
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 28:
				keyvalue = 1;		break;
			case 29:
				keyvalue = 2;		break;
			case 30:
				keyvalue = 3;		break;
			case 31:
				keyvalue = 4;		break;
			case 20:
				keyvalue = 5;		break;
			case 21:
				keyvalue = 6;		break;
			case 22:
				keyvalue = 7;		break;
			case 23:
				keyvalue = 8;		break;
			case 12:
				keyvalue = 9;		break;
			case 13:
				keyvalue = 0;		break;	
			case 14:
				keyvalue = 10;		break;
			case 15:
				keyvalue = 11;		break;
			case 04:
				keyvalue = 12;		break;
			case 05:
				keyvalue = 13;		break;
			case 06:
				keyvalue = 14;		break;
			case 07:
				keyvalue = 15;		break;
			default: keyvalue = 20;
				break;
		}	
	return keyvalue;
}


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

void long_delay(void)
{
	unsigned int i = 15;
	
	while(i--)
		;
	*P_Watchdog_Clear = 0x0001;
}
void reset(void)
{
    send(0xa4);
}

⌨️ 快捷键说明

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