⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.c

📁 12864液晶显示多功能电子时钟
💻 C
📖 第 1 页 / 共 2 页
字号:
#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(unsigned char ord,unsigned char dd)
{
	unsigned char temp;
	clock_Rst=0;
	do{temp=clock_Rst;}while(temp==1);
	clock_clk=0;
	clock_Rst=1;
	do{temp=clock_Rst;}while(temp==0);
	clock_out(ord);
	clock_out(dd);
    clock_clk=1;
	clock_Rst=0;
	
}

/*==============================================================================/
 *函数名称:init_1302
 *函数功能:ds1302初始化
/=============================================================================*/
void init_1302(void)
{
	write_clock(0x8e,0x00);
//	write_clock(0x80,0x80);
	write_clock(0x90,0x00);
	write_clock(0x8c,0x08);//_nop_();
	write_clock(0x8a,0x02);//_nop_();
	write_clock(0x88,0x11);//_nop_();
	write_clock(0x86,0x01);//_nop_();
	write_clock(0x84,0x18);//_nop_();
	write_clock(0x82,0x00);//_nop_();
	write_clock(0x80,0x00);//_nop_();
//	write_clock(0x90,0xa5);//_nop_();
	write_clock(0x8e,0x80);
}
/*=================================================================================/
 *函数名称:clock_in
 *返回  值:ACC
 *函数功能:输出数据
/=================================================================================*/
unsigned char clock_in(void)
{

	unsigned char i,temp;
	temp=0x00;
	for(i=8;i>0;i--)
	{
		temp=temp>>1;
		if(clock_dat==1) temp|=0x80;
		clock_clk=1;
		clock_clk=0;	
    }
//	if(clock_dat==1) temp|=0x80;
	return(temp);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
	unsigned char dd,k;
	k=0x00;
	clock_Rst=0;
	do {dd=clock_Rst;} while(dd==1);
	clock_clk=0;	
	clock_Rst=1;
	do {dd=clock_Rst;} while(dd==0);
	clock_out(ord);
	dd=clock_in();
	clock_clk=1;
	clock_Rst=0;
	k=dd>>4;
	dd=dd&0x0f;
	dd=dd+k*10;
	return (dd);
}

 void read_clocks(void)
{
	sec=read_clock(0x81);
	min=read_clock(0x83);
	hour=read_clock(0x85);
	day=read_clock(0x87);
	mon=read_clock(0x89);
	week=read_clock(0x8b);
	year=read_clock(0x8d);	
}

 void write_clocks(void)
 {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -