體溫計編程
Ⅰ 51單片機製作溫度計的簡單程序
;這是關於DS18B20的讀寫程序,數據腳P2.2,晶振12MHZ
;溫度感測器18B20匯編程序,採用器件默認的12位轉化,最大轉化時間750微秒
;可以將檢測到的溫度直接顯示到AT89C51開發實驗板的兩個數碼管上
;顯示溫度00到99度,很准確哦~~無需校正!
ORG 0000H ;單片機內存分配申明!
TEMPER_L EQU 29H;用於保存讀出溫度的低8位
TEMPER_H EQU 28H;用於保存讀出溫度的高8位
FLAG1 EQU 38H;是否檢測到DS18B20標志位
a_bit equ 20h ;數碼管個位數存放內存位置
b_bit equ 21h ;數碼管十位數存放內存位置
TEMP_TH EQU
MAIN:
LCALL GET_TEMPER;調用讀溫度子程序 ,顯示範圍00到99度,顯示精度為1度
;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個新位元組,這個位元組就是實際測量獲得的溫度
MOV A,29H
MOV C,40H;將28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY ;調用數碼管顯示子程序
CPL P1.0
AJMP MAIN
; 這是DS18B20復位初始化子程序
INIT_1820:
SETB P3.5
NOP
CLR P3.5 ;主機發出延時537微秒的復位低脈沖
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P3.5 ;然後拉高數據線
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P3.5,TSR3 ;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3:
SETB FLAG1 ; 置標志位,表示DS1820存在
CLR P1.7 ;檢查到DS18B20就點亮P1.7LED
LJMP TSR5
TSR4:
CLR FLAG1 ; 清標志位,表示DS1820不存在
CLR P1.1 ;點亮P1。1腳LED表示溫度感測器通信失敗
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 時序要求延時一段時間
TSR7:
SETB P3.5
RET
; 讀出轉換後的溫度值
GET_TEMPER:
SETB P3.5
LCALL INIT_1820 ;先復位DS18B20
JB FLAG1,TSS2
CLR P1.2
RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
CLR P1.3 ;DS18B20已經被檢測到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H ;發出溫度轉換命令
LCALL WRITE_1820
;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒
LCALL DISPLAY
LCALL INIT_1820 ;准備讀溫度前先復位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數據保存到35H/36H
CLR P1.4
RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV R2,#8;一共8位數據
CLR C
WR1:
CLR P3.5
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.5,C
MOV R3,#23
DJNZ R3,$
SETB P3.5
NOP
DJNZ R2,WR1
SETB P3.5
RET
; 讀DS18B20的程序,從DS18B20中讀出兩個位元組的溫度數據
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;數據一共有8位
RE01:
CLR C
SETB P3.5
NOP
NOP
CLR P3.5
NOP
NOP
NOP
SETB P3.5
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,P3.5
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;顯示子程序
display: mov a,29H;將29H中的十六進制數轉換成10進制
mov b,#10 ;10進制/10=10進制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個位在b
mov dptr,#numtab ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;顯示1000次
dplop: mov a,a_bit ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
mov p1,a ;送出個位的7段代碼
setb p2.0 ;開個位顯示
acall d1ms ;顯示1ms
clr p2.0
mov a,b_bit ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
mov p1,a ;送出十位的7段代碼
setb p2.1 ;開十位顯示
acall d1ms ;顯示1ms
clr p2.1
djnz r1,dplop ;100次沒完循環
djnz r0,dpl1 ;4個100次沒完循環
ret
;1MS延時(按12MHZ算)
D1MS: MOV R7,#80
DJNZ R7,$
RET
numtab: ;數碼管共陽極0~9代碼
DB 0C0H,0F9H,0A4H,0B0H,99H, 92H,82H,0F8H,80H,90H
end
Ⅱ 關於製作簡易數字溫度計
單片機89C51,ADC0832,鉑電阻測溫PT1000,外接的穩壓電源TL431,一些外圍的器件電阻電容晶振,LED顯示的話需要LED驅動IC,或者用IO口控制三極體來驅動LED,溫度上限下限設定在程序中,到了限制就用IO口點亮發光二極體或者驅動小蜂鳴器,這些都是典型的,網上有不少常式
Ⅲ 基於AT89C51單片機和DS18B20溫度感測器、LCD1602液晶顯示的高精度數字溫度計程序,用c語言編程
/***********ds18b20子程序*************************/
/***********ds18b20延遲子函數(晶振12MHz )*******/
#include<reg51.h>
sbit DQ=P1^2;
#define uchar unsigned char
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函數**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay_18B20(80); //精確延時 大於 480us
DQ = 1; //拉高匯流排
delay_18B20(4);
x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(20);
}
/***********ds18b20讀一個位元組**************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20寫一個位元組****************/
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************讀取ds18b20當前溫度************/
ReadTemp(void)
{ float val;
uchar temp_value,value;
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
delay_18B20(100);
a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
value=a&0x0f;
val=temp_value+value;
return(val);
}
以上是DS18B20的驅動程序。然後在主程序中直接調用函數就可以了。
以上是在主程序中的調用,你看關於溫度的那個就可以。
#include "reg51.h"
#include "18b20.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="Welcome To" ;//初始化日期和星期
uchar code table1[]="Our System!";//初始化時間
uchar code table2[]="Temperature is:";//初始化時間
//以下三個是定義LCD的引腳
sbit lcden=P2^2;
sbit lcdwrite=P2^1;
sbit lcdrs=P2^0;
char wen;
//延時程序
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//lcd的寫指令
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//lcd的寫數據
void write_data(uchar da)
{ lcdrs=1;
lcden=0;
P0=da;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//初始化
void init()
{
uchar num;
lcdwrite=0;
lcden=0;
write_com(0x38); //16*2顯示,5*7點陣,8位數據
write_com(0x0c);//顯示開,關游標
write_com(0x06); //移動游標
write_com(0x01);//清除LCD的顯示內容
write_com(0x80);
for (num=0;num<10;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for (num=0;num<11;num++)
{
write_data(table1[num]);
delay(5);
}
}
void write_wen(uchar add, char da)
{
uchar shi,ge;
shi=da/10;
ge=da%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
//主函數
void main ()
{
uchar num;
init();
delay(2000);
delay(2000);
delay(2000);
write_com(0x01);//清除LCD的顯示內容
while(1)
{
write_com(0x80);
for (num=0;num<15;num++)
{
write_data(table2[num]);
delay(5);
}
wen = ReadTemp( );
write_wen(2,wen);
}
}
Ⅳ 請問數字溫度計的c語言程序
你有沒有個好點的嘛,我需要個電子體溫計的程序,如果能給我個我程序匹配個電路圖就更好了O(∩_∩)O~
Ⅳ 數字溫度計設計
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint c,d,i,ii,,1,aa,bb,cc,shu,1h,1l;
uchar o,p,q,a,b,x,x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8,y,s,r,rr;
uchar flag,mm,nn,ff,jian,add2;
sfr ADC_CONTR=0XBC;
sfr ADC_RES=0XBD;
sfr ADC_RESL=0XBE;
sfr P1ASF=0X9D;
sfr AUXR=0x8E;
sfr AUXR1=0xA2;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint temp,,shi,ge,qian;
void display(uint z);
sbit gew=P2^0;
sbit shiw=P2^1;
sbit w=P2^2;
sbit qianw=P2^3;
sbit geew=P2^4;
sbit shiew=P2^5;
sbit ew=P2^6;
sbit qianew=P2^7;
uchar add,cb;
sfr IAP_DATA=0xc2;
sfr IAP_ADDRH=0xc3;
sfr IAP_ADDRL=0xc4;
sfr IAP_CMD=0xc5;
sfr IAP_TRIN=0xc6;
sfr IAP_CONTR=0xc7;
void display2(uint z);
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=100;k>0;k--);
}
void anquan()//安全程序,沒什麼用 看資料
{
IAP_ADDRH=0xff;
IAP_ADDRL=0xff;
IAP_CONTR=0x00;
IAP_CMD=0x00;
IAP_TRIN=0x00;
}
void (uchar h,uchar l)//讀
{
IAP_ADDRH=h;
IAP_ADDRL=l;
IAP_CONTR=0x83;
IAP_CMD=0x01;
IAP_TRIN=0x5a;
IAP_TRIN=0xa5;
delay(1);
shu=IAP_DATA;
anquan();
}
void xie(uchar h,uchar l,uchar d)//寫
{
IAP_DATA=d;
IAP_ADDRH=h;
IAP_ADDRL=l;
IAP_CONTR=0x83;
IAP_CMD=0x02;
IAP_TRIN=0x5a;
IAP_TRIN=0xa5;
delay(1);
anquan();
}
void cha(uchar h,uchar l)//察
{
IAP_ADDRH=h;
IAP_ADDRL=l;
IAP_CONTR=0x83;
IAP_CMD=0x03;
IAP_TRIN=0x5a;
IAP_TRIN=0xa5;
delay(1);
anquan();
}
void init4()//初始化定時器
{
TMOD=0x11;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;}
void init()//初始化定時器
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;}
void init3()//初始化判斷各區寫了幾個數
{(0x00,0x30);
ff=shu;
(0x00,0x40);
x1=shu;
(0x00,0x41);
x2=shu;
(0x00,0x42);
x3=shu;
(0x00,0x43);
x4=shu;
(0x00,0x44);
x5=shu;
(0x00,0x45);
x6=shu;
(0x00,0x46);
x7=shu;
(0x00,0x47);
x8=shu;
if(x8==8)x=8;else
if(x7==7)x=7;else
if(x6==6)x=6;else
if(x5==5)x=5;else
if(x4==4)x=4;else
if(x3==3)x=3;else
if(x2==2)x=2;else
if(x1==1)x=1;
(0x02,0x40);
y1=shu;
(0x02,0x41);
y2=shu;
(0x02,0x42);
y3=shu;
(0x02,0x43);
y4=shu;
(0x02,0x44);
y5=shu;
(0x02,0x45);
y6=shu;
(0x02,0x46);
y7=shu;
(0x02,0x47);
y8=shu;
if(y8==8)y=8;else
if(y7==7)y=7;else
if(y6==6)y=6;else
if(y5==5)y=5;else
if(y4==4)y=4;else
if(y3==3)y=3;else
if(y2==2)y=2;else
if(y1==1)y=1;
if(ff!=0xff){nn=0;mm=0;}
else{nn=1;mm=1;}
}
void send()
{
ADC_CONTR=0x80;
delay(1);
ADC_CONTR=0x8f;
delay(5);
if (ADC_CONTR==0X97)
{
ADC_CONTR=0x00;
delay(5);
a=ADC_RES;
b=ADC_RESL;
delay(5);
c=4*a+b;
P3=~a;
d=c*34/10;
}
}
void pq ()//P1.7
{ AUXR1=0x00;
P1ASF=0x80;
ADC_RES=0X00;
ADC_RESL=0X00;
ADC_CONTR=0X80| 0x00 |0x0f | 0;
delay(50);
send();
}
void display(uint z)
{
temp=z;
if (temp>999)q=1;else q=0;
if (temp>99) p=1;else p=0;
if (temp>9) o=1;else o=0;
qian=temp/1000;
=temp%1000/100;
shi=temp%1000%100/10;
ge=temp%10;
if(q==1)
{ qianw=0;
w=1;
shiw=1;
gew=1;
P0=table[qian];
delay(50);}
if(p==1)
{ qianw=1;
w=0;
shiw=1;
gew=1;
P0=table[];
delay(50);}
if(o==1)
{ qianw=1;
w=1;
shiw=0;
gew=1;
P0=0x7f;
delay(50);
P0=table[shi];
delay(50);
}
qianw=1;
w=1;
shiw=1;
gew=0;
P0=table[ge];
delay(50);
gew=1;
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
r++;
if(r==60){r=0;rr=1;}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
ii++;
if(i==24){i=0;}
if(ii==961) {ii=0;}
}
void init2()
{
AUXR1=0x00;
P1ASF=0x40;
ADC_RES=0X00;
ADC_RESL=0X00;
ADC_CONTR=0X80| 0x00 |0x0e | 0;
delay(50);
}
void send2()
{
ADC_CONTR=0x80;
delay(1);
ADC_CONTR=0x8e;
delay(5);
if (ADC_CONTR==0X96)
{
ADC_CONTR=0x00;
delay(5);
aa=ADC_RES;
bb=ADC_RESL;
delay(5);
cc=4*aa+bb;
//dd=4*cc;
}
}
void pl ()//p1.6
{
init2();
send2();
}
void anjian()
{
if((0<=cc)&&(cc<20))flag=1;else
if((20<cc)&&(cc<100))flag=2;else
if((100<cc)&&(cc<200))flag=3;else
if((200<cc)&&(cc<300))flag=4;else
if((300<cc)&&(cc<400))flag=5;else
if((400<cc)&&(cc<500))flag=6;else
if((500<cc)&&(cc<600))flag=7;else
if((600<cc)&&(cc<700))flag=8;
switch(flag)
{
case 0: ;break;//無鍵按下
case 1:jian=1;s=0; break;//第1個按下
case 2:jian=2;s=2; break;//第2個按下
case 3: jian=3;s=4;break;//第3個按下
case 4: jian=4;s=6;break;//第4個按下
case 5:jian=5;s=8;break;//第5個按下
case 6: jian=6;s=10;break;//第6個按下
case 7:jian=7;s=12;break;//第7個按下
case 8: jian=8;s=14;break;//第8個按下
}
}
void main()
{
init();init3();
while(1)
{
pl();
if(cc<800)
{TR0=0;rr=0;
init4();
while(!rr){
init3();
pl();
anjian();
if (ff!=0xff)
{
if(jian>y)
{
(0x00,s);1h=shu;(0x00,(s+1));1l=shu;=((1h*4+1l)*34)/10;
}else
{
(0x02,s);1h=shu;(0x02,(s+1));1l=shu;=(1h*4+1l)*34/10;
}
}
else
{
if(jian>x)
{
(0x02,s);1h=shu;(0x02,(s+1));1l=shu;=((1h*4+1l)*34)/10;
}else
{
(0x00,s);1h=shu;(0x00,(s+1));1l=shu;=((1h*4+1l)*34)/10;
}
}
display2();
}
}
TR0=1;
TR1=0;
if(i==23)
{ pq();}
display(d);
if(mm==1){
if(ii==120)
{
cha(0x00,0x00);
delay(10);
xie(0x00,0x00,a);
xie(0x00,0x01,b);
add++;
xie(0x00,0x40,add);
}else
if(ii==240)
{
xie(0x00,0x02,a);
xie(0x00,0x03,b);
add++;
xie(0x00,0x41,add);
}else
if(ii==360)
{
xie(0x00,0x04,a);
xie(0x00,0x05,b);
add++;
xie(0x00,0x42,add);
}else
if(ii==480)
{
xie(0x00,0x06,a);
xie(0x00,0x07,b);
add++;
xie(0x00,0x43,add);
}else
if(ii==600)
{
xie(0x00,0x08,a);
xie(0x00,0x09,b);
add++;
xie(0x00,0x44,add);
}else
if(ii==720)
{
xie(0x00,0x0a,a);
xie(0x00,0x0b,b);
add++;
xie(0x00,0x45,add);
}else
if(ii==840)
{
xie(0x00,0x0c,a);
xie(0x00,0x0d,b);
add++;
xie(0x00,0x46,add);
}else
if(ii==960)
{
xie(0x00,0x0e,a);
xie(0x00,0x0f,b);
xie(0x00,0x30,0x05);
add++;
xie(0x00,0x47,add);
if(add==8){add=0;}
mm=0;
}
}else
if(mm==0)
{
if(ii==120)
{
cha(0x02,0x00);
xie(0x02,0x00,a);
xie(0x02,0x01,b);
add2++;
xie(0x02,0x40,add2);
}else
if(ii==240)
{
xie(0x02,0x02,a);
xie(0x02,0x03,b);
add2++;
xie(0x02,0x41,add2);
}else
if(ii==360)
{
xie(0x02,0x04,a);
xie(0x02,0x05,b);
add2++;
xie(0x02,0x42,add2);
}else
if(ii==480)
{
xie(0x02,0x06,a);
xie(0x02,0x07,b);
add2++;
xie(0x02,0x43,add2);
}else
if(ii==600)
{
xie(0x02,0x08,a);
xie(0x02,0x09,b);
add2++;
xie(0x02,0x44,add2);
}else
if(ii==720)
{
xie(0x02,0x0a,a);
xie(0x02,0x0b,b);
add2++;
xie(0x02,0x45,add2);
}else
if(ii==840)
{
xie(0x02,0x0c,a);
xie(0x02,0x0d,b);
add2++;
xie(0x02,0x46,add2);
}else
if(ii==960)
{
xie(0x02,0x0e,a);
xie(0x02,0x0f,b);
xie(0x02,0x30,0x05);
add2++;
xie(0x02,0x47,add2);
if(add2==8){add2=0;}
mm=1;
}
}
}
}
void display2(uint z)
{
temp=z;
if (temp>999)q=1;else q=0;
if (temp>99) p=1;else p=0;
if (temp>9) o=1;else o=0;
qian=temp/1000;
=temp%1000/100;
shi=temp%1000%100/10;
ge=temp%10;
if(q==1)
{ qianew=0;
ew=1;
shiew=1;
geew=1;
P0=table[qian];
delay(50);}
if(p==1)
{ qianew=1;
ew=0;
shiew=1;
geew=1;
P0=table[];
delay(50);}
if(o==1)
{ qianew=1;
ew=1;
shiew=0;
geew=1;
P0=0x7f;
delay(50);
P0=table[shi];
delay(50);
}
qianew=1;
ew=1;
shiew=1;
geew=0;
P0=table[ge];
delay(50);
geew=1;
Ⅵ 用AT89c51與DS18B20做數字溫度計proteus怎麼連接模擬圖和C語言編程
1、PROTEUS安裝好後,默認不會在桌面上產生快捷方式。先打開開始菜單,依次點擊「程序、Proteus 7 Professional、ISIS 7 Professional」打開PROTEUS。
Ⅶ 請教高手:設計一個數字溫度計
首先是要用熱敏電阻,通過熱敏電阻把溫度轉化為電壓,再得到每一度熱敏電阻的電壓變化值,用LM324運放做成乘法器,使電壓乘以一個比例系數,使一度的變化得到一個整數變化的電壓值,然後送入CC7107進行數模轉換和數字顯示.
提
Ⅷ 基於AT89C51單片機和DS18B20溫度感測器,LCD1602液晶顯示的高精度數字溫度計程序,用C語言編程
LCD驅動程序
/*************************************************************/
/* */
/*檢查LCD忙狀態 */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據 */
/* */
/*************************************************************/
static bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_DB_Port&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*寫指令數據到LCD */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
#ifdef LCD_8DB
LCD_DB_Port = cmd;
#endif
delayNOP();
LCD_EN = 1; //上跳沿時輸入數據
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*寫顯示數據到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
#ifdef LCD_8DB
LCD_DB_Port = dat;
#endif
delayNOP();
LCD_EN = 1;
delayNOP(); //上跳沿時輸入數據
LCD_EN = 0;
}
/*************************************************************/
/* */
/* LCD初始化設定 */
/* */
/*************************************************************/
void lcd_init()
{
delay(15); //等待電源穩定
lcd_wcmd(LCD_MODE); //設置顯示模式
delay(5);
lcd_wcmd(LCD_MODE);
delay(5);
lcd_wcmd(LCD_MODE);
delay(5);
lcd_wcmd(0x0c); //顯示開,關游標
delay(5);
lcd_wcmd(0x06); //移動游標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
}