|
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;//溫度傳感器DQ端接單片機P2.0口
sbit beep=P1^5;
// 12864液晶位定義
sbit key1=P3^2;
sbit key2=P3^1;
sbit key3=P3^4;
sbit lcdrs=P2^6;//液晶的RS端接P3.4口
sbit lcdrw=P2^5;//液晶的RW端接P3.6口
sbit lcden=P2^7;// 液晶的EN使能端接P3.7口
uchar shi,fen,miao;
uint wendu=0;
uchar AN;
/********************延時函數,延時一毫秒************************/
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
/**************************12864顯示****************************/
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay1ms(1);
lcden=1;
delay1ms(1);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay1ms(1);
lcden=1;
delay1ms(1);
lcden=0;
}
void write_str(uchar *str)
{
while(*str!='\0') //表示字符串的結束
{
write_date(*str++);
delay1ms(5);
}
}
void write_pos(uchar x,uchar y)//從第X行的第Y位置開始顯示? ?
{
uchar pos;
if(x==1)//第一行? ?
{ x=0x80;}
else if(x==2)//第二行? ?
{ x=0x90;}
else if(x==3)//第三行? ?
{ x=0x88;}
else if(x==4)
{ x=0x98;}
pos=x+y-1;
write_com(pos);
}
/***************************12864液晶初始化******************************/
void init_12864()
{
lcdrw=0;
lcden=0;
write_com(0x01);//清屏命令
delay1ms(5);
write_com(0x30);//設置基本指令集動作? ? ? ??
write_com(0x06); //進入顯示模式
write_com(0x0c); // 開顯示
write_com(0x88);
write_pos(1,1);
write_str("溫度測量實驗");
write_pos(2,1);
write_str("實時溫度:");
write_pos(2,8);
write_str("度");
write_pos(3,1);
write_str("單片機時鐘");
// write_pos(4,1);
// write_str("00時00分00秒");
}
void write_shu(uchar add,uchar date)
{
uchar ge,shi;
shi=date/10;
ge=date%10;
write_com(0x98+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void init(void)
{
write_com(0x98+3);
write_date(':');
delay1ms(10);
write_com(0x98+0x01);
write_date(':');
delay1ms(10);
write_shu(4,miao);
write_shu(2,fen);
write_shu(0,shi);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void di()
{
beep=1;
delay1ms(10);
beep=0;
}
void key_scan()
{
if(key1==0)
delay1ms(100);
if(key1==0)
{
TR0=0;
AN++;
while(!key1);
}
if(AN==1)
{
write_com(0x98+5); //光標顯示位
write_com(0x0f);
}
if(AN==2)
{
write_com(0x98+3); //光標顯示位
write_com(0x0f);
}
if(AN==3)
{
write_com(0x98+1); //光標顯示位
write_com(0x0f);
}
if(AN==4)
{
TR0=1;
AN=0;
write_com(0x0c); //開整體顯示,開游標
}
if(AN==1)
{
if(key2==0)
delay1ms(100);
if(key2==0)
{
while(!key2);
miao++;
if(fen==60)
{ fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
if(AN==2)
{
write_com(0x98+2); //光標顯示位
write_com(0x0f);
if(key2==0)
delay1ms(100);
if(key2==0)
{
while(!key2);
shi--;
if(shi==24)
shi=0;
write_shu(0,shi);
}
}
if(AN==3)
{
// write_com(0x98+0); //光標顯示位
// write_com(0x0f);
if(key3==0)
delay1ms(100);
if(key3==0)
{
while(!key2);
miao--;
if(miao==00)
shi=0;
write_shu(1,shi);
}
}
} }
剩下的程序可以在壓縮包里看
|
-
5.jpg
(100.42 KB, 下載次數: 44)
下載附件
2019-4-23 22:59 上傳
-
-
液晶1602顯示.zip
2019-4-23 23:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
172.66 KB, 下載次數: 40, 下載積分: 黑幣 -5
|