?? wt_lcd.c
字號:
#include <Aduc812.H>
#include <absacc.h>
#include <string.h>
#define V_SET T0
#define V_RET T1
#define I2C_ADV7170 0x54
#define VREF 25
#define BRIGHT_ADDR 0x80f0
#define V_CDC_ADDR 0x80f1
unsigned char device; //EEPROM 設(shè)備
unsigned int wr_addr; //EEPROM 地址
unsigned int rd_addr; //EEPROM 地址
unsigned int ee_addr;
// #define DELAY_TIME 60
#define DELAY_TIME 120
#define TRUE 1
#define FALSE 0
#define SCL MCO
#define SDA MDO
#define SEN MDE
#define SDI MDI
//register address
#define MODE0_REG 0x00
#define MODE1_REG 0x01
#define MODE2_REG 0x02
#define MODE3_REG 0x03
#define MODE4_REG 0x04
#define TIMEMODE0_REG 0x07
#define TIMEMODE1_REG 0x08
#define SUBFREQ0_REG 0x09
#define SUBFREQ1_REG 0x0a
#define SUBFREQ2_REG 0x0b
#define SUBFREQ3_REG 0x0c
#define SUBPHASE_REG 0x0d
bit En_Tx_end;
bit En_Rx_end;
bit En_explain;
bit En_rst;
bit En_test;
unsigned char Txbuffer[16];
unsigned char Rxbuffer[8];
unsigned char Txcount,Rxcount;
unsigned int Txtotal;
unsigned char bright; //
unsigned char v_cdc; //
unsigned char old_bright; //
unsigned char old_v_cdc; //
float value; //
unsigned int voltage; //
unsigned int voltage0; //
unsigned int voltage1; //
/****************************************************
*以下為16進(jìn)制數(shù)據(jù) 轉(zhuǎn)換 ASCII碼
*****************************************************/
char asc_h(unsigned char indata)
{
char outdata,temp;
temp=(indata>>4)&0x0f;
if(temp>9)
outdata=temp+55;
else
outdata=temp+48;
return outdata;
}
char asc_l(unsigned char indata)
{
char outdata,temp;
temp=indata&0x0f;
if(temp>9)
outdata=temp+55;
else
outdata=temp+48;
return outdata;
}
/*****************************************
*初始化串口 定時器1作串行時鐘 定時器0
*****************************************/
void initSer()
{
// TMOD=0x91; //T1 GATE:INT1 T0 16 bit cnt
TMOD=0x29; //T0 GATE:INT0 T1 方式2 波特率發(fā)生器
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50; /* function 1 */
PCON=0x80; //19.2k
}
/**********************************
*初始化定時器2 主工作時鐘
**********************************/
void initT2()
{
T2CON=0;
TH2=0x4c; //50ms timer 20為1秒
TL2=0x00;
RCAP2L=0x4c;
RCAP2L=0x00;
TR2=1;
ET2=1;
}
/**********************************
定時器2中斷服務(wù)程序
**********************************/
void timer2() interrupt 5 using 0
{
TF2=0;
En_test=1;
/*
if(En_test==1)
{
V_SET=0;
En_test=0;
}
else
{
V_SET=1;
En_test=1;
}
//V_SET=0;
// V_SET=1;
/*
t0_cnt++;
if(t0_cnt>19)
{
timer0_1s++; //1s timer
t0_cnt=0;
}
*/
}
/************************************
*I2C延時
*************************************/
void DELAY(unsigned int t)
{
while(t!=0)
t--;
}
/************************************
*I2C操作程序
*************************************/
void I2C_Start(void)
{
SEN=1;
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SDA=0;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
// DELAY(DELAY_TIME);
}
/*****************************************
*I2C操作
*****************************************/
void I2C_Stop(void)
{
SEN=1;
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SDA=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
/*****************************************
*I2C操作
*****************************************/
void SEND_0(void) /* SEND ACK */
{
SEN=1;
SDA=0;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
/*****************************************
*I2C操作
*****************************************/
void SEND_1(void)
{
SEN=1;
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
bit Check_Acknowledge(void)
{
SDA=1;
SEN=0;
SCL=1;
DELAY(DELAY_TIME/2);
// F0=SDA;
F0=SDI;
// DELAY(DELAY_TIME/2);
SCL=0;
// DELAY(DELAY_TIME);
DELAY(DELAY_TIME);
F0=SDI;
if(F0==1)
return FALSE;
return TRUE;
}
/*****************************************
*I2C操作
*****************************************/
void WriteI2CByte(unsigned char b)
{
char i;
SEN=1;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
unsigned char ReadI2CByte(void)
{
unsigned char b=0,i;
SEN=0;
SCL=0;
for(i=0;i<8;i++)
{
// SDA=1; /*釋放總線*/
SCL=1; /*接受數(shù)據(jù)*/
DELAY(10);
// F0=SDA;
// F0=SDI;
// DELAY(10);
DELAY(10);
SCL=0;
F0=SDI;
if(F0==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
void ADV_Write_One_Word(unsigned char device, unsigned char addr,unsigned char thedata)
{
bit acktemp=1;
/*write a byte to mem*/
I2C_Start();
// WriteI2CByte(0xa0);
WriteI2CByte(device);
acktemp=Check_Acknowledge();
// WriteI2CByte(addr>>8);
// acktemp=Check_Acknowledge();
WriteI2CByte(addr);
acktemp=Check_Acknowledge();
WriteI2CByte(thedata);
acktemp=Check_Acknowledge();
I2C_Stop();
DELAY(200);
}
/*****************************************
*ADV7171 在指定地址讀取數(shù)據(jù)
*****************************************/
char ADV_Read_One_Word(unsigned char device, unsigned char addr)
{ bit acktemp=1;
unsigned char mydata;
/*read a byte from mem*/
I2C_Start();
// WriteI2CByte(0xa0);
WriteI2CByte(device);
acktemp=Check_Acknowledge();
// WriteI2CByte(addr>>8);
// acktemp=Check_Acknowledge();
WriteI2CByte(addr); // 24c512
acktemp=Check_Acknowledge();
I2C_Start();
// WriteI2CByte(0xa1);
WriteI2CByte(device+1);
acktemp=Check_Acknowledge();
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();
I2C_Stop();
return mydata;
}
/********************************
*基準(zhǔn)電源
********************************/
void DACinit()
{
DACCON=0x1f; // DAC0 on, 12bit, asynchronous
DAC0H=0;//0x0e;
DAC0L=0;//0x13; // DAC0 2.2V bright signal
DAC1H=0;//0x04;
DAC1L=0;//0x00; // DAC1 to mid-scale
}
void setvoltage()
{
if(old_bright!=bright)
{
old_bright=bright;
value=bright*4095.0/250;
voltage=(int)value;
voltage0=voltage;
DAC0H=voltage>>8;
DAC0L=voltage; // DAC0 bright signal
}
if(old_v_cdc!=v_cdc)
{
old_v_cdc=v_cdc;
value=v_cdc*4095.0/250;
voltage=(int)value;
voltage1=voltage;
DAC1H=voltage>>8;
DAC1L=voltage; // DAC0 v_cdc signal
}
}
void ADV_init()
{
ADV_Write_One_Word(device,MODE0_REG,0x00);
// ADV_Write_One_Word(device,MODE1_REG,0x80); //enable output color bar 0x80
ADV_Write_One_Word(device,MODE1_REG,0x00); //enable output color bar 0x80
ADV_Write_One_Word(device,MODE2_REG,0x00); //720 pixel
ADV_Write_One_Word(device,MODE3_REG,0x00); //MR37 defalut color MR33=0 MR34=0
ADV_Write_One_Word(device,MODE4_REG,0x0d); //RGB sync VSYNC MR41 MR40=1 MR43 V_SYNC_3H
ADV_Write_One_Word(device,TIMEMODE0_REG,0x0d); //master 8 bit TR05=0 TR04=1 74ns delay
ADV_Write_One_Word(device,TIMEMODE1_REG,0x33); //Tpclk
ADV_Write_One_Word(device,SUBFREQ0_REG,0x1f); //
ADV_Write_One_Word(device,SUBFREQ1_REG,0x7c); //
ADV_Write_One_Word(device,SUBFREQ2_REG,0xf0); //
ADV_Write_One_Word(device,SUBFREQ3_REG,0x21); //
ADV_Write_One_Word(device,SUBPHASE_REG,0x00); //Tpclk
}
/****************************************************
*以下串行中斷服務(wù)程序
*****************************************************/
void inrs() interrupt 4 using 3
{
if(RI)
{
RI=0;
Rxbuffer[Rxcount]=SBUF;
Rxcount++;
En_explain=1;
if(Rxcount>6) Rxcount=0; //接收數(shù)據(jù)最大為6個
}
if(TI)
{
TI=0;
Txcount++;
if(Txcount>=Txtotal)
{
Txcount=0;
En_Tx_end=1;
}
else
SBUF=Txbuffer[Txcount];
}
}
/****************************************************
*以下為主函數(shù)
*****************************************************/
void main (void)
{
// int i;
unsigned char v_data;
DELAY(50000);
V_RET=0;
DELAY(100);
V_RET=1;
En_rst=1;
I2CCON=0xa8; //I2C控制器
device=I2C_ADV7170; //EEPROM
ADV_init();
initSer();
initT2();
DACinit();
En_test=0;
Txcount=0;
Rxcount=0;
En_explain=0;
bright=0;
v_cdc=0;
old_bright=0;
old_v_cdc=0;
ES=1;
EA=1;
while (1)
{ /* Loop forever */
// V_SET=0;
// V_SET=1;
if(En_test==1)
{
En_test=0;
bright=XBYTE[BRIGHT_ADDR];
v_cdc=XBYTE[V_CDC_ADDR];
setvoltage();
}
//V_SET=0;
// V_SET=1;
if(En_explain)
{
if(Rxbuffer[0]=='a')
{
Rxcount=0;
En_explain=0;
v_data=ADV_Read_One_Word(device, MODE0_REG);
Txbuffer[0]=asc_h(v_data);
Txbuffer[1]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, MODE1_REG);
Txbuffer[2]=asc_h(v_data);
Txbuffer[3]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, MODE2_REG);
Txbuffer[4]=asc_h(v_data);
Txbuffer[5]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, MODE3_REG);
Txbuffer[6]=asc_h(v_data);
Txbuffer[7]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, MODE4_REG);
Txbuffer[8]=asc_h(v_data);
Txbuffer[9]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, TIMEMODE0_REG); //master
Txbuffer[10]=asc_h(v_data);
Txbuffer[11]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, TIMEMODE1_REG); //Tpclk
Txbuffer[12]=asc_h(v_data);
Txbuffer[13]=asc_l(v_data);
Txtotal=14;
SBUF=Txbuffer[0];
}
else if(Rxbuffer[0]=='b')
{
Rxcount=0;
En_explain=0;
v_data=ADV_Read_One_Word(device, SUBFREQ0_REG);
Txbuffer[0]=asc_h(v_data);
Txbuffer[1]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, SUBFREQ1_REG);
Txbuffer[2]=asc_h(v_data);
Txbuffer[3]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, SUBFREQ2_REG);
Txbuffer[4]=asc_h(v_data);
Txbuffer[5]=asc_l(v_data);
v_data=ADV_Read_One_Word(device, SUBFREQ3_REG);
Txbuffer[6]=asc_h(v_data);
Txbuffer[7]=asc_l(v_data);
v_data=ADV_Read_One_Word(device,SUBPHASE_REG);
Txbuffer[8]=asc_h(v_data);
Txbuffer[9]=asc_l(v_data);
Txtotal=10;
SBUF=Txbuffer[0];
}
else if(Rxbuffer[0]=='r')
{
Rxcount=0;
En_explain=0;
/*
if(En_rst==1)
{
V_RET=0;
En_rst=0;
Txbuffer[1]='0';
}
else
{
V_RET=1;
En_rst=1;
Txbuffer[1]='1';
}
*/
Txbuffer[0]=Rxbuffer[0];
Txtotal=2;
SBUF=Txbuffer[0];
}
else if(Rxbuffer[0]=='m')
{
Rxcount=0;
En_explain=0;
// XBYTE[BRIGHT_ADDR]=0x55;
// XBYTE[V_CDC_ADDR]=0xaa;
bright=XBYTE[BRIGHT_ADDR];
v_cdc=XBYTE[V_CDC_ADDR];
// setvoltage();
Txbuffer[0]=asc_h(bright);
Txbuffer[1]=asc_l(bright);
Txbuffer[2]=asc_h(v_cdc);
Txbuffer[3]=asc_l(v_cdc);
Txtotal=4;
SBUF=Txbuffer[0];
}
else if(Rxbuffer[0]=='s')
{
Rxcount=0;
En_explain=0;
ADV_init();
Txbuffer[0]=Rxbuffer[0];
Txtotal=1;
SBUF=Txbuffer[0];
}
else if(Rxbuffer[0]=='v')
{
Rxcount=0;
En_explain=0;
bright=XBYTE[BRIGHT_ADDR];
v_cdc=XBYTE[V_CDC_ADDR];
value=bright*4095.0/250;
voltage0=(int)value;
value=v_cdc*4095.0/250;
voltage1=(int)value;
Txbuffer[0]=asc_h(bright);
Txbuffer[1]=asc_l(bright);
Txbuffer[2]=asc_h(v_cdc);
Txbuffer[3]=asc_l(v_cdc);
Txbuffer[4]=asc_h((voltage0>>8));
Txbuffer[5]=asc_l((voltage0>>8));
Txbuffer[6]=asc_h(voltage0);
Txbuffer[7]=asc_l(voltage0);
Txbuffer[8]=asc_h((voltage1>>8));
Txbuffer[9]=asc_l((voltage1>>8));
Txbuffer[10]=asc_h(voltage1);
Txbuffer[11]=asc_l(voltage1);
Txtotal=12;
SBUF=Txbuffer[0];
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -