?? 1820.c
字號:
#pragma SMALL // LARGE
#include <absacc.h>
#include <string.h>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define C_ad 5
/*----------------------------------------*/
/*溫度值 二進制數(shù)據(jù)輸出 16進制輸出
+125℃ 0000011111010000 07D0H
+85℃ 0000010101010000 0550H*
+25.0625℃ 0000000110010001 0191H
+10.125℃ 0000000010100010 00A2H
+0.5℃ 0000000000001000 0008H
0℃ 0000000000000000 0000H
-0.5℃ 11111111111111000 FFF8H
-10.125℃ 1111111101011110 FF5EH
-25.0625℃ 1111111001101111 FE6FH
-55℃ 1111110010010000 FC90H*/
/*----7219----*/
sbit load=P1^1;
sbit clk=P1^2;
sbit din=P1^0;
/* ------------lcd-------*/
#define clear 0x01 //清屏幕,約1.6ms
#define home 0x02 //光標(biāo)回零(左上角)/
#define f_set 0x30 //并行、基本指令 ?????
#define dis_on 0x0f //打開顯示,光標(biāo),閃爍功能
#define in_mode 0x06 //輸入方式,地址增1,光標(biāo)右移
#define C_ad 5
sbit P_RS=P0^7;
sbit P_RW=P0^6;
sbit P_E= P0^5;
/*----5045----*/
sbit acc=0xe0;
sbit cy=0xd7;
//sbit load2=P3^1;
sbit x25_cs=P1^4; //5045 1pin
//sbit dout25=P1^4;
sbit x25_clk=P1^6; // 5045 6pin
sbit x25_din=P1^7; //5045 5pin //5045 3pin 接vcc ,4pin 接 gnd ,7pin 接 reset ,8pin 接 vcc
sbit dout=P1^5; //5045 2pin
/*-----------------*/
data union{
uchar tp[2];
uint temp;
}tt;
//uchar temp[2];
bit f_exit;
bit flag_sign;
sbit Inda=P3^1; //Inda=P1^7; //數(shù)據(jù)轉(zhuǎn)換中間變量
bdata uchar ab,bc;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
data uchar str2[6];
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void bit8_serial_input(uchar ix)
{
data uchar i,j,nc;
P_E=0; //clk=0; P_E為sclk P_RW為 sid
ab=ix;
for(i=0;i<8;i++){
P_RW=abit7; //din=abit7;
ab<<=1;
P_E=1;
for(j=0;j<10;j++)nc=0; //延時
P_E=0;
}
}
void instruct(uchar dat)
{
data uchar ch;
P_RS=1; //選通
ch=0xf8; ///1111 1110 按照時序前五位必須為1 六七位任意 八位為0
bit8_serial_input(ch); //sid前八位
ch=dat&0xf0; //連接dat與0xf0 取higher data
bit8_serial_input(ch);
ch=dat<<4; //左移動4位 取lower data
bit8_serial_input(ch); //80送到液晶里表示什么意義 instruct中無此命令
P_RS=0; //結(jié)束作業(yè) 1 byte發(fā)完
}
void write_abyte(uchar dat)
{
data uchar ch;
P_RS=1; //讀數(shù)據(jù)--選通 選通
ch=0xfa; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat&0xf0; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //結(jié)束作業(yè)
}
/*
寫一個漢字到x,Y坐標(biāo)處其中X為8列y為4行
*/
void write_word(uint w) //w為雙字節(jié)變量
{
data uchar ch,cl;
ch=w>>8;
cl=w; //w右移8位給ch 那cl直接取 w 低8位
write_abyte(ch);
write_abyte(cl);
}
dis_hz(uchar x, uchar y, uint *p_hz) //單個漢字、字符顯示、兩個字母
{
data uchar loc;
data uint hz;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home); //光標(biāo)home
loc=((x<<3)+y-9)|0x80; //??"|"
instruct(loc); hz=*p_hz; //loc 不同導(dǎo)致開始顯示層數(shù)不同?????
write_word(hz);
}
dis_hz_str(uchar x, uchar y, uint *p_hz) //功能 漢字字符串顯示
{
data uchar loc;
data uint *p;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home);
loc=((x<<3)+y-9)|0x80;
instruct(loc);
p=p_hz;
while(*p){
write_word(*p++);
}
}
/*
顯示字母數(shù)字在x,y處
*/
void dis_str(uchar x, uchar y, uchar *str) // 多個數(shù)字字母 顯示
{
data uchar loc,*p;
code uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1); //loc=16*(1-1)+10-1=9 如何
if(loc&0x01){
loc/=2;
instruct(loc|0x80);
//ch=' '; //字符串前加空格(0x20 )
write_abyte(' ');
}else{
loc/=2;
instruct(loc|0x80);
}
while(*p){
write_abyte(*p++); //str為字符串 p為字符串寫的時候一個一個字寫
}
}
void initial(void) //光標(biāo)置左上角
{
data uchar i,j;
P0=0xff;
P_RS=0; //串行--不選通
//P_PSB=0;
P_E=0; //串行方式
instruct(f_set); //0x30; //8位并行接口 基本指令 用串行方式 這句是不是沒用
for(i=0;i<30;i++){}
for(i=0;i<250;i++){} //等待液晶屏反應(yīng)
for(i=0;i<250;i++){}
instruct(f_set); //0x30; //8位并行接口 基本指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(dis_on); //0x0f); //開啟屏幕 光標(biāo) 閃爍
for(i=0;i<30;i++){} //維持高電平 等待液晶反應(yīng)
instruct(clear); //0x01); //清屏幕 clear
for(j=0;j<10;j++){
for(i=0;i<250;i++){} //1.6ms
}
instruct(in_mode); //0x06); //光標(biāo)右移、地址增1 方式 液晶屏接受信息的形式
for(i=0;i<30;i++){}
instruct(home); //光標(biāo)復(fù)位(行首)
}
/*---------------------------------------------------------*/
//void itoa(int x,unsigned char *str2)
void itoa(int x)
{ //功能 二進制轉(zhuǎn)為ascii碼
data unsigned int n;
data unsigned char chn,*p,*p2,str1[5];
data unsigned char i,j;
p2=str2;
if(x<0){
*p2++='-';
x=-x;
}
n=x;
p=&str1;
j=0;
while(n!=0){
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0){
p--;
for(i=0;i<j;i++)*p2++=*p--;
}
else *p2++='0';
*p2=0;
return;
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void rst_wdog(void)
{
x25_cs=0;
x25_cs=1;
}
/*----------------------------------------*/
void delay10(uchar j) /* time=j*10+7 */
{
uchar ch;
while(j--)
{
ch++; ch++;
}
/*
_nop_();
_nop_();};
*/
}
/*---------------------------------------*/
uchar inti(void)
{
data uchar i=3;
do{ //連續(xù)檢測4次,看是否存在溫度傳感器
Inda=0;
delay10(50); //發(fā)511us復(fù)位脈沖
Inda=1; //等待應(yīng)答脈沖
delay10(6);
if (!Inda) //存在應(yīng)答脈沖返回1
return(1);
delay10(250);
}
while(i--);
return(0); //4次檢測失敗返回?zé)o傳感器
}
/*----------------------------------------*/
void Outwrite(uchar str)
{
data uchar i;
ab=str;
for(i=0;i<8;i++){
Inda=0;
delay10(1);
Inda=abit0;
ab>>=1;
delay10(4);
Inda=1;
_nop_();
_nop_();
}
}
/*----------------------------------------*/
void Outread(void) /*讀失敗時 str=[0xff,0xff]*/
{
data uchar i,j;
for (i=0;i<2;i++){
for(j=0;j<8;j++){
ab>>=1;
Inda=1;
_nop_();
_nop_();
Inda=0;
_nop_();
_nop_();
Inda=1;
delay10(1);
abit7=Inda;
}
tt.tp[1-i]=ab;
//temp[i]=ab;
}
}
/*----------------------------------------*/
void Wroutds()
{
f_exit=inti();
if(f_exit)
{
delay10(250);
delay10(250);
Outwrite(0xcc); //省去與ROM的有關(guān)操作
Outwrite(0x44); //啟動溫度傳感器
}
}
/*----------------------------------------*/
uchar Rdoutds(void)
{
f_exit=inti();
if(f_exit){
delay10(250);
delay10(250);
Outwrite(0xcc);
Outwrite(0xbe);
Outread();
}
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
void delay(uchar n)
{
data uchar i,j,k,ch;
for(i=0;i<n;i++){
for(j=0;j<250;j++){
for(k=0;k<25;k++){
rst_wdog();
}
}
}
}
/*---------------------------------------------------------*/
/*void dis_7219(uchar iw,uchar ix,uchar chl,uchar chh)
{
uchar i,j,nc;
clk=0;
load=0;
for(j=0;j<5;j++)nc=0;
ab=iw;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout; dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
ab=ix;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
ab=chl;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout; dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
ab=chh;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
//abit0=dout;
clk=1;
for(j=0;j<5;j++)nc=0;
clk=0; for(j=0;j<5;j++)nc=0;
}
load=1;
}
/*---------------------------------------------------------*/
/*void itoa(int x,unsigned char *str)
{
unsigned int n;
unsigned char chn,*p,str1[5];
data unsigned char i,j;
if(x<0){
*str++='-';
x=-x;
}
n=x;
p=str1;
j=0;
while(n!=0){
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0){
p--;
for(i=0;i<j;i++)*str++=*p--;
}
else *str++='0';
*str=0;
return;
}
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
/*---------------------------------------------------------*/
/*void dis_7219(uchar iw,uchar ix) /*串性數(shù)據(jù)發(fā)送*/
/*{
uchar i,j,nc;
clk=1;
for(j=0;j<10;j++)nc=0;
load=1;
iw=~iw; //~????????????
ab=iw;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
clk=0;
for(j=0;j<10;j++)nc=0;
clk=1;
}
ix=~ix;
ab=ix;
for(i=0;i<8;i++){
din=abit7;
ab<<=1;
clk=0;
for(j=0;j<10;j++)nc=0;
clk=1;
}
load=0;
}
/*---------------------------------------*/
/*void dis_set(void)
{
data uchar i,j,nc;
dis_7219(0x0f,0x0); /*不測試*/
//dis_7219(0x0a,0x04);/*亮度選擇*/
//dis_7219(0x09,0x0f);/*譯碼選擇*/
//dis_7219(0x0b,0x07);/*掃描LED的個數(shù)*/
//dis_7219(0x0c,0x01);/*啟動*/
//for(i=1;i<5;i++)dis_7219(i,0x0f);
//for(i=5;i<9;i++)dis_7219(i,0x00);
//} */
/*----------------------------------------*/
void dis_play(void)
{
uchar qw,sw,gw,y,i;
data long int xx,bw;
code uint *me={"室內(nèi)溫度是:"};
code uint *lme={"the indoor tempe"} ;
code uint *llme={"rature is : "} ;
data uint str1[10];
code uint *str3={"."};
uint aa;
if(flag_sign)xx=~xx+1;
xx=85*tt.temp;
xx=xx/136;
aa=xx;
//if((!flag_sign)&&(aa>700)|(flag_sign)&&(aa<150))
//i=0;
// dis_7219(6,0xff);// dis_7219(6,0x4);
//else i=0; //dis_7219(6,0xff);//dis_7219(6,0x40);
qw=xx/1000;
bw=xx/100;
sw=xx/10%10;
gw=xx%10;
//if(flag_sign){
// dis_7219(1,0x0a);
// flag_sign=0;
//}
//else //dis_7219(1,0xff,0,0);
P_RS=0;
initial();
// delay10(250) ;
dis_str(1,1,lme);
delay10(250);
dis_str(2,1,llme);
delay10(250);
delay10(250);
strcpy(str1,me);
dis_hz_str(3,1,str1);
// delay(250);
// dis_hz_str(4,1,"美");
// delay(250);
bw=bw*100;
sw=sw*10;
bw=bw+sw+gw;
itoa(bw); //bw
str2[3]=str2[2]; str2[2]='.'; str2[4]=0;
//str1[0]=bw;
dis_str(4,1,str2);
dis_hz(4,3,"℃");
//delay(250);
//itoa(gw);
//str3[0]="." ;str3[1]=str2;
//strcat(str3,str2);
// dis_str(4,3,str2);
//itoa(gw);
//dis_str(4,5,str2);
// itoa(sw); //sw);
// dis_str(4,3,str2);
//dis_str(4,3,".");
//itoa(gw);
//dis_str(4,4,str2);
//delay(250); // dis_7219(2,bw,0,0);
// for (i=0;i<10;i++) { delay10(250) ;
// dis_7219(3,0xff,0,0);
// for(y=0;y<0xff;y++){}
// }
// dis_7219(3,sw|0x10,0,0);//第二位 和小數(shù)點(0x10)
/* for (i=0;i<10;i++) { delay10(250) ;
// dis_7219(4,0xff,0,0);
for(y=0;y<0xff;y++){}
}
// dis_7219(3,0x80,0,0);
for (i=0;i<10;i++) { delay10(250) ;
// dis_7219(4,0xff,0,0);
for(y=0;y<0xff;y++){}
}
// dis_7219(4,gw,0,0);
*/
i=0;
}
/*----------------------------------------*/
void main(void)
{
uchar ch,n,m,i,y;
flag_sign=0;
//temp[0]=0;
//temp[1]=0;
//dis_set(); //初始化7219
for(;;){
f_exit=inti(); /*初始化 檢測1820是否存在*/
if(f_exit){
Wroutds(); //省去ROM操作,啟動溫度轉(zhuǎn)換
for(n=0;n<100;n++){ // 延時等待溫度轉(zhuǎn)換完成
for(m=0;m<10;m++){
delay10(250);
}
rst_wdog();
}
Rdoutds();
if((0x7f|tt.tp[0])==0xff)
flag_sign=1;
/* for (i=0;i<10;i++) {
dis_7219(i,0xff,0,0);
for(y=0;y<0xff;y++){}
}
/*----------------------------------------*/
dis_play();
/* ch=9;
}
// else {
// dis_7219(1,2);
// dis_7219(2,0x0f);
// dis_7219(3,0x0f);
//dis_7219(4,0x0f);
// } */
rst_wdog();
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -