#include <reg52.h>
#include <intrins.h>
#define SENDCOMM 0XF8 //0XF1000
#define READCOMM 0XFC //0XF1100
#define SENDDATA 0XFA //0XF1010
#define READDATA 0XFE //0XF1110
void LCD_send_byte(unsigned char a);
unsigned char LCD_read_byte(void);
unsigned char LCD_bf(void);
unsigned char TEMP_BUFF[5];
void LCD_comm(unsigned char comm);
void LCD_setxy(unsigned char x,unsigned char y);
void LCD_PORTInit(void);
void LCD_WriteStr(unsigned char dis_addr_x,unsigned char dis_addr_y,char* str);
void LCD_WriteDBC(unsigned char dis_addr_x,unsigned char dis_addr_y,unsigned char dis_dat);
sbit E_CLK =P2^2; //clock input
sbit RW_SID=P2^1; //data input/output
sbit RS_CS =P2^0; //chip select
sbit LCD_PSB=P2^3;
sbit LCD_A =P2^4;
sbit Beep = P1^0;
sbit power = P1^1;
sbit tell_charge = P1^2;
void delay(unsigned int n)
{
unsigned int i;
for(i=0; i<n; i++) {;}
}
void LCD_PORTInit(void)
{
E_CLK=0;
RS_CS=0;
}
void LCD_send_byte(unsigned char a)
{
unsigned char i;
for(i=8;i>0;i--)
{
if(a&(0x01<<(i-1)))
RW_SID=1;
else
RW_SID=0;
delay(2);
E_CLK=1;
delay(2);
E_CLK=0;
delay(2);
}
}
unsigned char LCD_read_byte(void)
{
unsigned char i,dat=0;
for(i=8;i>0;i--)
{
E_CLK=1;
delay(2);
if(RW_SID==1)
dat|=(0x01<<(i-1));
E_CLK=0;
delay(2);
}
return dat;
}
unsigned char LCD_bf(void)
{
unsigned char readh,readl,bf;
RS_CS=1;
delay(2);
LCD_send_byte(READCOMM);
readh=LCD_read_byte();
readl=LCD_read_byte();
delay(2);
RS_CS=0;
readl=(readl>>4);
bf=(readh&0xf0)|(readl&0x0f);
return bf;
}
void LCD_comm(unsigned char comm)
{
unsigned char temp;
do{
temp=LCD_bf();
}while(temp&0X80);
RS_CS=1;
delay(2);
LCD_send_byte(SENDCOMM);
temp=comm&0XF0;
LCD_send_byte(temp);
temp=((comm&0X0F)<<4)&0XF0;
LCD_send_byte(temp);
delay(2);
RS_CS=0;
}
void LCD_data(unsigned char lcd_data)
{
unsigned char temp;
RS_CS=1;
delay(2);
LCD_send_byte(SENDDATA);
temp=lcd_data&0xf0;
LCD_send_byte(temp);
temp=(lcd_data&0X0F)<<4;
LCD_send_byte(temp);
delay(2);
RS_CS=0;
}
/*******************************************************************/
// 设置显示位置 X(1~16),Y(1~4)
/*******************************************************************/
void LCD_setxy(unsigned char x,unsigned char y)
{
switch(y)
{
case 1:
LCD_comm(0X7F+x);break;
case 2:
LCD_comm(0X8F+x);break;
case 3:
LCD_comm(0X87+x);break;
case 4:
LCD_comm(0X97+x);break;
default:break;
}
}
/*******************************************************************/
// 在指定位置显示一半角字符
/*******************************************************************/
/*void LCD_WriteDBC(unsigned char dis_addr_x,unsigned char dis_addr_y,unsigned char dis_dat)
{
LCD_setxy(dis_addr_x,dis_addr_y);
LCD_data(dis_dat);
}*/
/*******************************************************************/
// 在指定位置显示字符串
/*******************************************************************/
void LCD_WriteStr(unsigned char dis_addr_x,unsigned char dis_addr_y,char* str)
{
unsigned char LCD_temp;
LCD_setxy(dis_addr_x,dis_addr_y);
LCD_temp=*str;
while(LCD_temp != 0x00)
{
LCD_data(LCD_temp);
LCD_temp=*(++str);
}
}
void LCD_WriteData(unsigned char dis_addr_x,unsigned char dis_addr_y,unsigned char dat)
{
LCD_setxy(dis_addr_x,dis_addr_y);
LCD_data(dat);
}
void LCD_init(void)
{
unsigned char i;
LCD_A=0; //开背光
LCD_PSB=0; //串行通信
LCD_PORTInit();
i=LCD_bf();
while(i==0x80)
{
delay(80);
i=LCD_bf();
}
//RST=0;
RS_CS=0;
//serial mode
delay(100);
// RST=1;
LCD_comm(0x30);//功能设置,一次送8位数据,基本指令集
LCD_comm(0x0C);//0000,1100 整体显示,游标off,游标位置off
LCD_comm(0x01);//0000,0001 清DDRAM
LCD_comm(0x02);//0000,0010 DDRAM地址归位
LCD_comm(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
//LCD_comm(0x04);//点设定,显示字符/光标从左到右移位,DDRAM地址加 一
//LCD_comm(0x0F);//显示设定,开显示,显示光标,当前显示位反白闪动
}
#define jump_ROM 0xCC
#define start 0x44
#define read_EEPROM 0xBE
unsigned int TMPH,TMPL;
sbit DQ=P3^0;
/*============================================================================/
*函数名称:reset
*入口参数:无;返回deceive_ready
*函数功能:复位
/============================================================================*/
void reset(void)
{
DQ=0;
delay(48);
DQ=1;
delay(5);
while(DQ);
delay(48);
}
/*==============================================================================/
*函数名称:read_bit
*入口参数:无;返回接收的数据
*函数功能:读1bit子程序
/==============================================================================*/
unsigned char read_bit(void)
{
unsigned char i;
DQ=0;
DQ=1;
for(i=0;i<3;i++);
return(DQ);
}
/*================================================================================/
*函数名称:vrite_bit
*入口参数:bitval
*函数功能:写1bit子程序
/=================================================================================*/
void write_bit(unsigned char bitval)
{
DQ=0;
if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/*===============================================================================/
*函数名称:write_byte
*入口参数:val
*函数功能:写1byte子程序
/================================================================================*/
void write_byte(unsigned char val)
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
delay(5);
}
}
/*=============================================================================/
*函数名称:read_byte
*入口参数:无
*返回值:接收的数据value
*函数功能:读一个byte子程序
/==============================================================================*/
unsigned char read_byte(void)
{
unsigned char i,m,receive_data;
receive_data=0;
for(i=0;i<8;i++)
{
m=read_bit();
receive_data=(m<<7)|(receive_data>>1);
delay(6);
}
return(receive_data);
}
/*==========================================================================/
*函数名称:getTemValue
*入口参数:无
*返回值:value
*函数功能:取得温度值
/==========================================================================*/
void getTemValue(void)
{
unsigned int value;
float t;
reset();
write_byte(jump_ROM);
write_byte(start);
reset();
write_byte(jump_ROM);
write_byte(read_EEPROM);
TMPL=read_byte();
TMPH=read_byte();
value=TMPH;
value<<=8;
value|=TMPL;
t=value*0.0625;
TMPH=t;
TMPL=(t-TMPH)*10+0.5;
}
sbit clock_Rst = P3 ^ 3;
sbit clock_dat = P3 ^ 4;
sbit clock_clk = P3 ^ 5;
unsigned char sec=0xff,min=0xff,hour=0xff,day=0xff,mon=0xff,week=0xff,year=0xff;
void clock_out(unsigned char dd);
void write_clock(unsigned char ord,unsigned char dd);
void init_1302(void);
unsigned char clock_in(void);
unsigned char read_clock(unsigned char ord);
void update(void);
void LCD_Week(void);
/*===============================================================================/
*函数名称:clock_out
*入口参数:dd
*函数功能:写入指令或数据
/===============================================================================*/
void clock_out(unsigned char dd)
{
unsigned char i,temp;
temp=dd;
for(i=8;i>0;i--)
{
if((temp&0x01)==1)
clock_dat=1;
else clock_dat=0;
_nop_();
clock_clk=1;
_nop_();
clock_clk=0;
temp=temp>>1;
}
}
/*===============================================================================/
*函数名称:write_clock
*入口参数:命令ord,数据dd
*函数功能:时钟调整
/================================================================================*/
void write_clock(u
评论0