?? 7289.c
字號:
//////////////////////////////////////////////////////////////////////////
// /cs -- IOA12 //
// clk -- IOA13 //
// data -- IOA14 //
// /key -- IOA15 //
// by ouc //
// 2005.9.1 //
// 使用時在主程序里面加上 #include "7289.h" //
//////////////////////////////////////////////////////////////////////////
#include "SPCE061A.h"
// IOA12,13,14 帶數(shù)據(jù)緩存器的高電平輸出,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發(fā)送數(shù)據(jù)或命令到7289
void send(unsigned int data)
{
unsigned int i,a;
*P_Watchdog_Clear = 0x0001;
*P_IOA_Dir |= 0x4000; // B14(data)為帶數(shù)據(jù)緩存器的高電平輸出。
*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 產(chǎn)生高電平寬度為delay(3)的脈沖,供CLK(8次)。
delay(3);//延遲,清看門狗???
data = data << 1;
}
}
//CPU接收從7289發(fā)來的數(shù)據(jù)
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)的數(shù)據(jù)。
b >>= j;
a |= b;
*P_IOA_Data &= 0xdfff; // clk low
delay(3);
}
*P_IOA_Data |= 0x1000; //cs high
delay(7);
return a;
}
//八位顯示數(shù)據(jù),
//command_out命令控制顯示位
//send(data[i])發(fā)送顯示的數(shù)據(jù)
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)發(fā)送消隱控制命令或閃爍命令。
//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 + -