現今的擴充元件其溝通介面,大都作成串列如i2c或spi等,但如對速度有要求的,當然還有
並列介面,而PT6958就是串列的(EEPROM 24XX 是I2C,93CXX是SPI)
下面是用8X51系列,寫的範例程式,供想用PT6958的人參考,此範例並還未用到PT6958的
按鍵功能,這功能在下一篇再和大家分享吧
//* =======================*//
//* *//
//* PT6958.c *//
//* DATE:2009 8_25 *//
//* Author:Naga Lee *//
//* Description:PT6958 *//
//* *//
//* ====================== *//
//#include "REG_MPC82G516.H"
#include "REG_MPC89L51-515.H"
#include "INTRINS.H"
#define dout P34
#define din P35
#define clk P36
#define stb P37
unsigned char command1=0x40;
unsigned char command2=0xc0;
unsigned char command3=0x88;
unsigned char disp_data[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char _a_sec=0,i=0,j;
unsigned int time_cnt=0x0000;
unsigned char disp_1=10,disp_2=10,disp_3=10,disp_4=10;
unsigned char data_a,data_b,data_c,data_d;
void send_comm_data ( unsigned char command_data );
void L_Delay(int WAIT_COUNT);
void S_Delay();
void Timer_Interrupt_1() interrupt 3
{
_a_sec ++ ;
if (_a_sec > 0x28) // 計算1秒
{ time_cnt ++ ;
_a_sec=0 ;}
if ( time_cnt>1999)
{ time_cnt=0; }
TH1 = 0X3C ;
TL1 = 0XB0 ;
}
void Timer_Interrupt_2() interrupt 5
{
T2CON &= 0X7F; //CLEAR TIMER2 INT_FLAG
}
void Init_IRQ()
{
ET1 = 0x01; //Enable Timer Interrupt 1
ET2 = 0x01; //Enable Timer Interrupt 2
TMOD = 0X10 ;
TH1 = 0X3C ;
TL1 = 0XB0 ;
T2CON = 0X00 ;
RCAP2H = 0X15 ;
RCAP2L = 0X00 ;
EA = 0x01 ; //Enable All Interrupt
TR1 = 0X01 ; //START TIMER1
T2CON |= 0X04 ; //START TIMER2
}
void wait_15_nop(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void S_Delay(void)
{
int S_Loop ;
int Null_Var ;
for ( S_Loop = 0 ; S_Loop < 20 ; S_Loop ++ )
Null_Var += 1 ;
}
// ----------------------------------------------
void L_Delay(int WAIT_COUNT)
{
int L_Loop ;
for ( L_Loop = 0 ; L_Loop < WAIT_COUNT ; L_Loop ++ )
S_Delay( ) ;
}
void send_comm_data ( unsigned char command_data )
{ // 寫入一個 byte
unsigned char i=0;
for (i=0;i<8;i++)
{
clk=0;
wait_15_nop();
if ((command_data&0x01)==0X01) din=1 ;
else din=0;
clk=1;
wait_15_nop();
command_data>>=1;
}
}
void main(void)
{
P3=0XFF;
L_Delay(0x188);
///---- init pt6958
stb=0;
wait_15_nop();
send_comm_data(command1) ;//位置順序增加
stb=1;
wait_15_nop();
stb=0;
wait_15_nop();
send_comm_data(command2) ;
wait_15_nop();
for (i=0;i>9;i++)
{
// clear display memory
send_comm_data(0x00) ;
wait_15_nop();
}
stb=1;
wait_15_nop();
stb=0;
wait_15_nop();
send_comm_data(command3) ;
wait_15_nop();
stb=1;
wait_15_nop();
///---- init pt6958
Init_IRQ();
while (1)
{
data_a = time_cnt % 10 ;
data_b = (time_cnt/10)%10 ;
data_c = (time_cnt%1000)/100 ;
data_d = time_cnt / 1000 ;
if (data_d==0)
{data_d=0x00;}
if (data_d==1)
{data_d=0x06;}
/////////////////////////
stb=0;
_nop_();
_nop_();
send_comm_data(command1) ;//位置順序增加
stb=1;
_nop_();
_nop_();
stb=0;
_nop_();
_nop_();
send_comm_data(command2) ;
_nop_();
_nop_();
// write data to display memory
send_comm_data(disp_data[data_a]) ;
_nop_();
_nop_();
send_comm_data(0x00) ;
_nop_();
_nop_();
send_comm_data(disp_data[data_b]) ;
_nop_();
_nop_();
send_comm_data(0x00) ;
_nop_();
_nop_();
send_comm_data(disp_data[data_c]) ;
_nop_();
_nop_();
send_comm_data(0x00) ;
_nop_();
_nop_();
send_comm_data(data_d) ;
_nop_();
_nop_();
stb=1;
_nop_();
_nop_();
stb=0;
_nop_();
_nop_();
send_comm_data(command3) ;
_nop_();
_nop_();
stb=1;
_nop_();
_nop_();
}
}
留言列表