12864液晶电子时钟+温度显示
tab3[8]=0x3a;
tab3[9]=clock[4]/10+0x30;
tab3[10]=clock[4]%10+0x30;
tab3[11]=0x3a;
tab3[12]=clock[5]/10+0x30;
tab3[13]=clock[5]%10+0x30;
tab2[8]=clock[0]/10+0x30;
tab2[9]=clock[0]%10+0x30;
tab2[10]=0x2d;
tab2[11]=clock[1]/10+0x30;
tab2[12]=clock[1]%10+0x30;
tab2[13]=0x2d;
tab2[14]=clock[2]/10+0x30;
tab2[15]=clock[2]%10+0x30;
tab4[10]=temp/10+0x30;
tab4[11]=temp%10+0x30;
}
void display() //显示函数
{
uchar i;
write_com(0x80);
for(i=0;i16;i++)
{
write_dat(tab1[i]);
}
write_com(0x90);
for(i=0;i16;i++)
{
write_dat(tab2[i]);
}
write_com(0x88);
for(i=0;i14;i++)
{
write_dat(tab3[i]);
delay(1);
}
write_com(0x98);
for(i=0;i12;i++)
{
write_dat(tab4[i]);
}
}
void main()
{
init_clock();
init_12864();
while(1)
{
Read_temp();
iscii_change();
display();
tkey();
shan();
}
}
void clk()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
utime++;
if(utime ==20) //一秒钟时间到,秒加一
{
utime=0;
clock[5]++;
}
else if(clock[5]==60) //秒钟加到60分钟加一
{
clock[5]=0;
clock[4]++;
}
else if(clock[4]==60)
{
clock[4]=0;
clock[3]++ ;
}
else if(clock[3]==24)
{
clock[3]=0;
clock[2]++;
}
else if(clock[2]==31)
{
clock[2]=0;
clock[1]++;
}
else if(clock[1]==13)
{
clock[1]=0;
clock[0]++;
}
else if(clock[0]==100)
{
clock[0]=0;
}
}
按键扫描函数
uchar clock[6]={11,3,22,12,22,34}; //用来存放年的后两位,月,日,时,分,秒
sbit key1=P3^2; //位定义三个按键(用来调时)
sbit key2=P3^3;
sbit key3=P3^4;
void tkey(void)
{
/*******移位键*********/
if (key1==0)
{
//delay(10);
f++;
TR0=0; //调整时间时关闭定时器
}
if (f==8)
f=1;
/**********加一键*********/
if(key2==0)
{
// delay(10);
clock[f-1]++;
}
if (f==1)
{ if (clock[f-1]==100){
clock[f-1]=0;}
}
else if(f==2)
{
if(clock[f-1]==13)
clock[f-1]=0;
}
else if(f==3)
{
if(clock[f-1]==31)
clock[f-1]=0;
}
else if(f==4)
{
if(clock[f-1]==24)
clock[f-1]=0;
}
else{ if (clock[f-1]==60)
clock[f-1]=0;
}
/******减一键***********/
if(key3==0)
{
// delay(10);
clock[f-1]--;
}
else if (f==1)
{ if (clock[f-1]==0xff){
clock[f-1]=99;}
}
else if (f==2)
{ if (clock[f-1]==0xff){
clock[f-1]=12;}
}
else if (f==3)
{ if (clock[f-1]==0xff){
clock[f-1]=30;}
}
else if (f==1)
{ if (clock[f-1]==0xff){
clock[f-1]=23;}
}
else
{ if (clock[f-1]==0xff)
clock[f-1]=59;
}
}
18B20温度传感器控制函数:
#includereg52.h>
#includeintrins.h>
#include "lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
uchar temp=80,temp_L,temp_H;
sbit DQ=P2^3;
void delay_us(uchar i) //延时函数,计算公式:延时时间T=5+2*i;
{
while(--i);
}
bit Reset_DS18B20(void) //DS18B20复位函数
{
bit DS18B20_exist;
DQ=1;
DQ=0;
delay_us(250); //将DQ拉低480 ~ 960us,产生复位信号
DQ=1; //将总线释放,进入接收状态
delay_us(30); //等待15-60us,DS18b20发出存在信号,将总线拉低60-240us
DS18B20_exist=DQ;
delay_us(200); //存在信号持续60 ~ 240us
if(DS18B20_exist)
return 1; //返回1,DS18B20复位失败,总线上无DS18B20
else
return 0; //返回0,DS18B20复位成功,总线上存在DS18b20
}
//写数据--线低后高
void write_DS18B20(unsigned char value)
{
unsigned char i;
for(i=0;i8;i++)
{
DQ=1;
DQ=0; //将总线拉低,数据送入总线
_nop_();
DQ=value0x01;
delay_us(20); //DS18b20在之后的15-60us的时间对总线数据采样
DQ=1; //连续写入将须将总线释放至少1us
value=value>>1;
}
}
//读数据--先低后高
unsigned char Read_DS18B20(void)
{
unsigned char value,i;
for(i=0;i8;i++)
{
DQ=1;
DQ=0;
delay_us(1); //主机将总线拉低7us,!!!!时间不能过长
DQ=1; //之后释放总线,告诉DS18B20“读”数据
_nop_();
_nop_();
value=value>>1;
if(DQ)
value|=0x80; //数据读取
delay_us(20);
}
return value;
}
void Read_temp()
{
Reset_DS18B20();
write_DS18B20(0xCC);
write_DS18B20(0x44);
Reset_DS18B20();
write_DS18B20(0xcc);
write_DS18B20(0xBE);
temp_L=Read_DS18B20();
temp_H=Read_DS18B20();
temp=(temp_H*256+temp_L)/16;
}
-------------------------------------
#include
- 单片机的动手实践篇--51单片机玩转12864(01-10)
- 51单片机+带字库液晶12864+DS1302数字时钟C源程序(12-03)
- LCD12864指定位置反白显示程序(12-02)
- PIC单片机驱动LCD12864液晶显示闪动字体程序(12-02)
- RT12864M液晶模块单片机驱动程序(12-02)
- st7920控制的12864打点(12-02)