📄 text1.c
字号:
#include<reg51.h>
#include"zifuku.h"
//#include "delay11us().c"
//#include "PCF8563().C"
#define uchar unsigned char
#define uint unsigned int
sbit CS1=P2^0; //LCD右屏幕
sbit CS2=P2^1; //LCD左屏幕
sbit RS=P2^2; //LCD数据、指令寄存器
sbit RW=P2^3; //LCD读、写操作
sbit E=P2^4; //LCD使能信号,下降沿有效
void delay11us(unsigned char t)
{
for (;t>0;t--);
}
#define uchar unsigned char
#define uint unsigned int
uchar lcd16_1[16];
uchar lcd16_2[16] = {"welcome"};
struct time
{
uchar second;
uchar minute;
uchar hour;
uchar day;
uchar weekday;
uchar month;
uint year;
} time;
sbit tim_sda=P1^7;
sbit tim_scl=P1^6;
bit tim_ack; // i2c slave ack.
bit tim_err;
uchar tim_rd_buffer[16];
uchar tim_wr_buffer[16];
// i2c start.
void PCF8563_start() //start flag is when tim_scl 1, tim_sdafrom 1 to 0.
{
tim_sda = 1;
delay11us(1);
tim_scl = 1;
delay11us(1);
tim_sda = 0;
delay11us(1);
}
// i2c stop.
void PCF8563_stop() //start flag is when tim_scl 1, tim_sdafrom 0 to 1.
{
tim_sda = 0;
delay11us(1);
tim_scl = 1;
delay11us(1);
tim_sda = 0;
}
//i2c slave respons.
void PCF8563_respons()
{
uchar i;
tim_scl = 1;
delay11us(1);
while((tim_sda)&&(i<250)) i++;
if(!tim_sda)
tim_ack = 1;
else
tim_ack = 0;
tim_scl = 0;
delay11us(1);
}
// i2c master respons.
void PCF8563_master_respons(bit master_ack)
{
tim_scl = 0;
delay11us(1);
tim_sda = ~master_ack;
delay11us(1);
tim_scl = 1;
delay11us(1);
tim_scl = 0;
delay11us(1);
}
//i2c init.
void PCF8563_init()
{
tim_sda = 1;
delay11us(1);
tim_scl = 1;
delay11us(1);
}
// i2c write n byte.
void PCF8563_wr_byte(uchar dat)
{
uchar i , temp;
temp = dat;
for(i=0;i<8;i++)
{
// temp = temp<<1; //send high to low,
tim_scl = 0;
delay11us(1);
// tim_sda = CY;
if(temp&0x80)
tim_sda = 1;
else
tim_sda = 0;
temp = temp<<1;
delay11us(1);
tim_scl = 1;
delay11us(1);
// tim_scl = 0;
// delay11us(1);
}
tim_scl = 0;
delay11us(1);
tim_sda = 1; //set tim_sda to 1 to wait respons.
delay11us(1);
}
uchar PCF8563_rd_byte()
{
uchar i,k;
tim_scl = 0;
delay11us(1);
tim_sda = 1;
delay11us(1);
for(i=0;i<8;i++)
{
tim_scl = 1;
delay11us(1);
k = (k<<1)|tim_sda;
tim_scl = 0;
delay11us(1);
}
return k;
}
void PCF8563_write_n_byte(uchar add,uchar com,uchar *dat,uchar n_byte) //
{
uchar i = 0;
uchar temp;
temp = *dat; // send to begin address to 'temp'.
add = add<<1;
add = 0xa0+add+0x00;
PCF8563_start();
PCF8563_wr_byte(add); //send EEPROM address, bit 0 = 0 is write.
PCF8563_respons();
if(!tim_ack) //if i2c respons.
{
tim_err = 1;
return;
}
PCF8563_wr_byte(com); //send EEPROM beginning address.
PCF8563_respons();
if(!tim_ack) //if i2c respons.
{
tim_err = 1;
return;
}
while(n_byte) //write n byte.
{
PCF8563_wr_byte(temp);
PCF8563_respons();
if(!tim_ack)
{
tim_err = 1;
PCF8563_stop();
return;
}
temp++;
n_byte--;
}
PCF8563_stop();
}
void PCF8563_read_n_byte(uchar add,uchar com,uchar n_byte)
{
uchar *temp;
temp = tim_rd_buffer;
add = add<<1;
add = 0xa0+add+0x00;
// com = com - 1;
PCF8563_start();
PCF8563_wr_byte(add); //send address + wr.
PCF8563_respons();
PCF8563_wr_byte(com); // first byte address.
PCF8563_respons();
add = add+0x01;
PCF8563_start();
PCF8563_wr_byte(add); //send address + rd.
PCF8563_respons();
while(n_byte) // rd n byte .
{
*temp = PCF8563_rd_byte();
if(n_byte != 1) //if i2c respons.
{
PCF8563_master_respons(1); //if the number is not the last one, master send a ack bit.
// return;
}
temp++;
n_byte--;
}
PCF8563_stop();
}
void PCF8563_wr_time()
{
tim_wr_buffer[0] = 0x00; //second
tim_wr_buffer[1] = 0x11; //minute
tim_wr_buffer[2] = 0x22; //hour
tim_wr_buffer[3] = 0x15; //day
tim_wr_buffer[4] = 0x03; //weekday
tim_wr_buffer[5] = 0x06; //month
tim_wr_buffer[6] = 0x10; //year
PCF8563_write_n_byte(1,2,tim_wr_buffer,8);
}
void PCF8563_rd_time()
{
uchar temp;
PCF8563_read_n_byte(1,2,9);
time.second = ((tim_rd_buffer[1]&0x70)>>4)*10 + (tim_rd_buffer[1]&0x0f); //second
time.minute = ((tim_rd_buffer[2]&0x70)>>4)*10 + (tim_rd_buffer[2]&0x0f); //minute
time.hour = ((tim_rd_buffer[3]&0x30)>>4)*10 + (tim_rd_buffer[3]&0x0f); //hour
time.day = ((tim_rd_buffer[4]&0x30)>>4)*10 + (tim_rd_buffer[4]&0x0f); //day
time.weekday = tim_rd_buffer[5]&0x07; //weekday
time.month = ((tim_rd_buffer[6]&0x10)>>4)*10 + (tim_rd_buffer[6]&0x0f); //month
temp = (tim_rd_buffer[4]&0x80)>>7;
time.year = (temp+19)*100+((tim_rd_buffer[7]&0x70)>>4)*10 + (tim_rd_buffer[7]&0x0f); //year
lcd16_1[0] = time.hour/10+0x30; //hour
lcd16_1[1] = time.hour%10+0x30;
lcd16_1[2] = '-';
lcd16_1[3] = time.minute/10+0x30; //minute
lcd16_1[4] = time.minute%10+0x30;
lcd16_1[5] = '-';
lcd16_1[6] = time.second/10+0x30; //second
lcd16_1[7] = time.second%10+0x30;
lcd16_2[0] = time.year/1000+0x30; //year
lcd16_2[1] = (time.year%1000)/100+0x30;
lcd16_2[2] = (time.year%100)/10+0x30;
lcd16_2[3] = time.year%10+0x30;
lcd16_2[4] = '-';
lcd16_2[5] = time.month/10+0x30; //mon
lcd16_2[6] = time.month%10+0x30;
lcd16_2[7] = '-';
lcd16_2[8] = time.day/10+0x30; //day
lcd16_2[9] = time.day%10+0x30;
lcd16_2[10] = ' ';
lcd16_2[11] = time.weekday+0x30;
}
void w_com(uchar com)
{
//buys();
RW=0;
RS=0;
E=1;
P0=com;
E=0;
}
void w_date(uchar date)
{
//buys();
RW=0;
RS=1;
E=1;
P0=date;
E=0;
}
/*
LCD选屏函数
*/
void select_screen(uchar screen)
{
switch(screen)
{
case 0: //选择全屏
CS1=0;
CS2=0;
break;
case 1: //选择左屏
CS1=0;
CS2=1;
break;
case 2: //选择右屏
CS1=1;
CS2=0;
break;
/* case 3: //选择右屏
CS1=1;
CS2=1;
break;
*/
}
}
/*
LCDx向上滚屏显示
*/
/*
LCD清屏函数:清屏从第一页的第一列开始,总共8页,64列
*/
void clear_screen(screen)
{
int x,y;
select_screen(screen); //screen:0-选择全屏,1-选择左半屏,2-选择右半屏
for(x=0xb8;x<0xc0;x++) //从0xb8-0xbf,共8页
{
w_com(x);
w_com(0x40); //列的初始地址是0x40
for(y=0;y<64;y++)
{
w_date(0x00);
}
}
}
/*
LCD显示汉字字库函数
*/
void lcd_display_hanzi(uchar screen,uchar page,uchar col,uint mun)
{ //screen:选择屏幕参数,page:选择页参数0-3,col:选择列参数0-3,mun:显示第几个汉字的参数
int a;
mun=mun*32;
select_screen(screen);
w_com(0xb8+(page*2));
w_com(0x40+(col*16));
for ( a=0;a<16;a++)
{
w_date(hanzi[mun++]);
}
w_com(0xb8+(page*2)+1);
w_com(0x40+(col*16));
for ( a=0;a<16;a++)
{
w_date(hanzi[mun++]);
}
}
void lcd_display_shuzi(uchar screen,uchar page,uchar col,uchar mun)
{ //screen:选择屏幕参数,page:选择页参数0-3,col:选择列参数0-7,mun:显示第几个汉字的参数
int a;
mun=mun*16;
select_screen(screen);
w_com(0xb8+(page*2));
w_com(0x40+(col*8));
for ( a=0;a<8;a++)
{
w_date(shuzi[mun++]);
}
w_com(0xb8+(page*2)+1);
w_com(0x40+(col*8));
for ( a=0;a<8;a++)
{
w_date(shuzi[mun++]);
}
}
/*
LCD初始化函数
*/
void lcd_init()
{
w_com(0x3f); //LCD开显示
w_com(0xc0); //LCD行初始地址,共64行
w_com(0xb8); //LCD页初始地址,共8页
w_com(0x40); //LCD列初始地址,共64列
}
/*
LCD显示主函数
*/
void main()
{
lcd_init(); //LCD初始化
clear_screen(0); //LCD清屏幕
PCF8563_init();
PCF8563_wr_time();
while(1)
{ PCF8563_rd_time();
lcd_display_shuzi(1,1,0,lcd16_2[0]);
lcd_display_shuzi(1,1,1,lcd16_2[1]);
lcd_display_shuzi(1,1,2,lcd16_2[2]);
lcd_display_shuzi(1,1,3,lcd16_2[3]);
lcd_display_hanzi(1,1,2,0); //LCD显示汉字
lcd_display_shuzi(1,1,6,lcd16_2[5]);
lcd_display_shuzi(1,1,7,lcd16_2[6]);
lcd_display_hanzi(2,1,0,1);
lcd_display_shuzi(2,1,2,lcd16_2[8]);
lcd_display_shuzi(2,1,3,lcd16_2[9]);
lcd_display_hanzi(2,1,2,2);
lcd_display_shuzi(1,2,0,lcd16_1[0]);
lcd_display_shuzi(1,2,1,lcd16_1[1]);
lcd_display_hanzi(1,2,1,3);
lcd_display_shuzi(1,2,4,lcd16_1[3]);
lcd_display_shuzi(1,2,5,lcd16_1[4]);
lcd_display_hanzi(1,2,3,4);
lcd_display_shuzi(2,2,0,lcd16_1[6]);
lcd_display_shuzi(2,2,1,lcd16_1[7]);
lcd_display_hanzi(2,2,1,5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -