📄 lcd12864.c
字号:
#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 + -