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

📄 7289.c

📁 基于凌阳61板的7289键盘显示驱动程序
💻 C
字号:
//////////////////////////////////////////////////////////////////////////
//						/cs   --   IOA12								//
//						clk   --   IOA13								//
//						data  --   IOA14								//
//						/key  --   IOA15								//
//								by 	ouc									//
//									2005.9.1							//
//			使用时在主程序里面加上	#include "7289.h"					//
//////////////////////////////////////////////////////////////////////////
#include "SPCE061A.h"
// IOA12,13,14   带数据缓存器的高电平输出,IOA15下拉输入

//初始化7289
void Init_7289(void)		
{	
	unsigned int data_out;
	*P_IOA_Dir|= 0x7000;	
	*P_IOA_Dir&= 0x7fff;	
							
	*P_IOA_Attrib |= 0x7000;
	*P_IOA_Attrib &= 0x7fff;
							
	*P_IOA_Data |= 0x7000;	
	*P_IOA_Data &= 0x7fff;	
							
	data_out = 0x00a4;		
	send(data_out);			
	delay(10);				
							
	*P_IOA_Data |= 0x1000;	
	delay(7);
}


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

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

//八位显示数据,
//command_out命令控制显示位
//send(data[i])发送显示的数据
void display_7289(unsigned int p)
{
	unsigned int i,command_out;
	unsigned int data;
	
	data = p;
	
	command_out=0x0080;		
	for(i=0; i<8; i++)
		{
			send(command_out);
			command_out++;
			send(data);
			
			*P_IOA_Data |= 0x1000;			//cs high
			delay(3);
		}
	*P_IOA_Data |= 0x1000;			//cs high
	delay(7);
}

//send(led_addr)发送消隐控制命令或闪烁命令。
//send(value)控制某位消隐,1为显示或不闪烁,0为消隐或闪烁
void display_led(unsigned int led_addr,unsigned int value)
{
	send(led_addr);
	send(value);
	*P_IOA_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 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:
			keyvalue =0;
				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 + -