?? lcd drive.c
字號:
uchar a;
for(a=0;a<8;a++)
{
I2C_SDA=(bit)(I2C_data&0x80);
I2C_data=I2C_data<<1;
I2C_clock();
};
I2C_SDA=High;
I2C_delay();
return(I2C_clock());
}
/***********************************************
I2C總線讀一個字節(jié),即接收一個字節(jié)數(shù)據(jù)
接收結(jié)束后需要發(fā)送一個應(yīng)答位acknowledge
***********************************************/
uchar I2C_receive()
{
uchar a,receive_data;
for(a=0;a<8;a++)
{
receive_data=receive_data<<1;
if(I2C_clock())
{
receive_data++;
};
};
//I2C_ACK();
return(receive_data);
}
DS1621_start()
{
do
{
I2C_start();
}
while(I2C_send(0x90));//發(fā)送數(shù)據(jù)完地址字節(jié)的數(shù)據(jù)時,檢測從機的應(yīng)答位
if(I2C_send(0xee)==0)
{
I2C_stop();
return 1;
}
else
return 0;
}
DS1621_stop()
{
do
{
I2C_start();
//I2C_send(0x90);
}
while(I2C_send(0x90));
if(I2C_send(0x22)==0)
{
I2C_stop();
return 1;
}
else
return 0;
}
char read_count_remain()
{
char temp_remain=0;
do
{
I2C_start();
}
while(I2C_send(0x90));//是否應(yīng)答
if(I2C_send(0xa8)==0)
{
I2C_start();
if(I2C_send(0x91)==0)
{
temp_remain=I2C_receive();
I2C_NACK();
I2C_stop();
return temp_remain;
}
else
return 0;
}
else
return 0;
}
char read_count_c()
{
char temp_c=0;
do
{
I2C_start();
}
while(I2C_send(0x90));//是否應(yīng)答
if(I2C_send(0xa9)==0)
{
I2C_start();
if(I2C_send(0x91)==0)
{
temp_c=I2C_receive();
I2C_NACK();
I2C_stop();
return temp_c;
}
else
return 0;
}
else
return 0;
}
bit read_temperature(char *point1)
{
do
{
I2C_start();
}
while(I2C_send(0x90));
if(I2C_send(0xaa)==0)
{
do{
I2C_start();
}
while(I2C_send(0x91));
(*point1)=I2C_receive();
I2C_ACK();
(*(point1+1))=I2C_receive();
I2C_NACK();
I2C_stop();
return 1;
}
else
return 0;
}
DS1621_state()
{
do
{
I2C_start();
}
while(I2C_send(0x90));
if(I2C_send(0xac)==0)
{
do
{
I2C_start();
}
while(I2C_send(0x90));
if(I2C_send(0x00)==0)
//if(I2C_send(0x01)==0)
{
I2C_stop();
return 1;
}
else
return 0;
}
else
return 0;
}
DS1621_th()
{
}
DS1621_tl()
{
}
DS1621_init()
{
while(DS1621_stop()==0)
{};
while(DS1621_state()==0)
{};
DS1621_th();
DS1621_tl();
}
/****************************************************
字符為16*16顯示,分為兩個部分寫入32個字節(jié)
前16個字節(jié)寫入第一頁(16*8),后16個字節(jié)寫入
第二頁(16*8)
左側(cè)寫入"歡迎",右側(cè)寫入"使用"
*****************************************************/
C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
{
uchar k;
C_Pagenum=PAGEADD|C_Pagenum;
C_Tiernum=TIERADD|C_Tiernum;
WRCommand_L(C_Pagenum);
WRCommand_L(C_Tiernum);
for(k=0;k<16;k++)
{
WRdata_L(table2[C_Temp*32+k]);
};
C_Pagenum=C_Pagenum+1;
WRCommand_L(C_Pagenum);
WRCommand_L(C_Tiernum);
for(k=0;k<16;k++)
{
WRdata_L(table2[C_Temp*32+k+16]);
};
}
C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
{
uchar k;
C_Pagenum=PAGEADD|C_Pagenum;
C_Tiernum=TIERADD|C_Tiernum;
WRCommand_R(C_Pagenum);
WRCommand_R(C_Tiernum);
for(k=0;k<16;k++)
{
WRdata_R(table2[C_Temp*32+k]);
};
C_Pagenum=C_Pagenum+1;
WRCommand_R(C_Pagenum);
WRCommand_R(C_Tiernum);
for(k=0;k<16;k++)
{
WRdata_R(table2[C_Temp*32+k+16]);
};
}
/****************************************
寫入西文字符,共11個字符,左側(cè)寫入6個
右側(cè)寫入5個,左側(cè)起始從16開始,右側(cè)從
0開始
*****************************************/
E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
{
uchar k;
WRCommand_L(PAGEADD|E_Pagenum);
WRCommand_L(TIERADD|E_Tiernum);
for(k=0;k<8;k++)
{
WRdata_L(table1[E_Temp*8+k]);
};
}
E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)
{
uchar k;
WRCommand_R(PAGEADD|E_Pagenum);
WRCommand_R(TIERADD|E_Tiernum);
for(k=0;k<8;k++)
{
WRdata_R(table1[E_Temp*8+k]);
};
}
/*********************************
清除所有顯示RAM內(nèi)容
**********************************/
CLR_DisplayRAM()
{
uchar C_page,i,k;
for(i=0;i<8;i++)
{
C_page=PAGEADD|i;//清除起始頁為0
WRCommand_L(C_page);//清除起始頁寫入左側(cè)
WRCommand_L(TIERADD);//清除起始行地址寫入左側(cè)
WRCommand_R(C_page);//清除起始頁寫入右側(cè)
WRCommand_R(TIERADD);//清除起始行地址寫入右側(cè)
for(k=0;k<64;k++)
{
WRdata_L(0x00);
WRdata_R(0x00);//lcm的ram自動加一,只許循環(huán)64次即可
};
};
}
/*********************************
初始化 設(shè)置啟使行
**********************************/
void Init_LCD(void)
{
CLR_DisplayRAM();//清除所有顯示寄存器
WRCommand_L(DIS_STARADD);
WRCommand_R(DIS_STARADD);//設(shè)置顯示起始行地址
WRCommand_L(0x3f);
WRCommand_R(0x3f);//開顯示
}
/***************************************
tlc0831
****************************************/
uchar tlc0831_read()
{
uchar ad_num,voltage_temp=0;
cs=High;
clk=Low;
_nop;
_nop;
cs=Low;
for(ad_num=0;ad_num<8;ad_num++)
{
clk=High;
_nop;
clk=Low;
if(d_out)
voltage_temp++;
voltage_temp<<=1;
}
cs=High;
return (voltage_temp);
}
main()
{
uchar a=0,temp=0,b=0,number=0,pagenum=0;
char count_remain=0,count_c=0;
bit flag=1;
char temperature_bus[2]={0};
uchar temperature_display[8]={0};
//uchar voltage=0; //測試0831時使用
double voltage=0,temp_buffer=0;
cs=High;
clk=High;
Init_LCD();
I2C_init();
DS1621_init();
DS1621_start();//開始溫度采集
for(a=b;b<2;b++)
{
//第一頁顯示大概為1.2s,第一頁顯示結(jié)束
for(number=0;number<20;number++)
{
//中文顯示:歡迎使用液晶模塊
pagenum=1;
for(a=0;a<4;a++)
{
C_display_L(pagenum,a*16,a);
C_display_R(pagenum,a*16,a+4);
};
//英文顯示:Welcome use
pagenum=5;
for(a=0;a<3;a++)
{
E_Display_L(pagenum,(a+5)*8,etable[a+5]);
};
for(a=0;a<8;a++)
{
E_Display_R(pagenum,a*8,etable[a+8]);
};
//顯示:Time:2006/11/07
pagenum=7;
for(a=0;a<8;a++)
{
E_Display_L(pagenum,a*8,ttable[a]);
E_Display_R(pagenum,a*8,ttable[a+8]);
}
Delay_nms(100);
};
if(flag)
{
read_temperature(temperature_bus);//在轉(zhuǎn)到下一個顯示截面之前空讀兩次
read_count_remain();
read_count_c();
DS1621_start();
flag=0;
};
};
WRCommand_L(0x3e);
WRCommand_R(0x3e);
CLR_DisplayRAM(); //清除顯示ram
WRCommand_L(0x3f);
WRCommand_R(0x3f);
while(1)
{
while(read_temperature(temperature_bus)==0);//讀溫度值(兩字節(jié)有符數(shù)),只使用第一字節(jié)
count_remain=read_count_remain();//讀斜率
count_c=read_count_c();//讀計數(shù)器
temp_buffer=temperature_bus[0]-0.75+(count_c-count_remain)/(float)count_c;
DS1621_start();
temperature_display[0]=19;
if(temp_buffer<0)
{
temperature_display[1]=16;
temperature_display[2]=(uchar)((-temp_buffer)/10);
temperature_display[3]=((uchar)(-temp_buffer))%10;
temperature_display[4]=17;
temperature_display[5]=(int)((-temp_buffer)*10)%10;
temperature_display[6]=(int)((-temp_buffer)*100)%10;
}
else
{
temperature_display[1]=((uchar)temp_buffer)/100;
temperature_display[2]=((uchar)temp_buffer)/10%10;
temperature_display[3]=((uchar)temp_buffer)%10;
temperature_display[4]=17;
temperature_display[5]=((int)(temp_buffer*10))%10;
temperature_display[6]=((int)(temp_buffer*100))%10;
}
// 測試從0831讀出的原始數(shù)據(jù)
/***************************
pagenum=3;
voltage=tlc0831_read();
voltage_display[0]=19;
voltage_display[1]= voltage/100;
voltage_display[2]=(voltage/10)%10;
voltage_display[3]= voltage%10;
*******************************/
//LCD顯示部分
for(b=0;b<40;b++)
{
//更新0831顯示值
voltage=(double)tlc0831_read();
voltage=5*voltage/255;
voltage_display[0]=19;
voltage_display[1]=(uchar) voltage;
voltage_display[2]=17;
voltage_display[3]=((uchar)(voltage*10))%10;
voltage_display[4]=((uchar)(voltage*100))%10;
voltage_display[5]=((uchar)(voltage*1000))%10;
//顯示文字:電壓測量
pagenum=2;
for(a=0;a<2;a++)
C_display_L(pagenum,a*16,a+8);
for(a=0;a<2;a++)
C_display_L(pagenum,(a+2)*16,a+12);
//顯示文字:溫度測量
pagenum=5;
for(a=0;a<2;a++)
C_display_L(pagenum,a*16,a+10);
for(a=0;a<2;a++)
C_display_L(pagenum,(a+2)*16,a+12);
//顯示0831采樣值
pagenum=3;
for(a=0;a<6;a++)
{
E_Display_R(pagenum,a*8,voltage_display[a]);
}
//顯示ds1621采樣值
pagenum=6;
for(a=0;a<7;a++)
{
E_Display_R(pagenum,a*8,temperature_display[a]);
}
};
};
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -