📄 rt1602c+pcf8563一号.c
字号:
//单片机RT1602_C语言程序__RT1602C+PCF8563P
//2006年3月8951_LCD_1602_Q_D_MCU适用
//AT89C54_Ver1.00
//KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式
//DB0=P1.0 DB1=P1.1 DB2=P1.2 DB3=P1.3 DB4=P1.4 DB5=P1.5
//DB6=P1.6 DB7=P1.7 R/W=P2.0 RS=P2.1 E=P2.7
//[注]:AT89C51的晶振频率为12MHz
#include <REGX51.H>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <SS89BIN.h>
sbit E_E=P3^3; //片选,下降沿触发
sbit R_S=P3^4; //H数据寄存器,L指令寄存器
sbit R_W=P3^5; //H读数据,L写数据
sbit sda=P0^0; //定义串行I/O口
sbit scl=P0^1;
idata unsigned char rom_sed[9];
idata unsigned char rom_rec[7];
idata unsigned char j,k;
bit flag,flag1;
void time8563(void) //延时子程序
{data unsigned char i;
for(i=0;i<6;i++);
}
void I_start(void) //发送I2C总线起始条件子程序
{sda=1;;
scl=1;
time8563();
sda=0;
time8563();
scl=0;;
}
void I_stop(void) //I2C总线停止条件子程序
{sda=0;;
scl=1;
time8563();
sda=1;
time8563();
}
bit I_send(unsigned char I_data) //字节数据传送子程序
{data unsigned char i;
for(i=0;i<8;i++)
{sda=(bit)(I_data&0x80);
I_data=I_data<<1;;
scl=1;
time8563();
scl=0;
}
;;
sda=1;;; //准备接收ACK位
scl=1;;; //开始接收ACK位
flag=0;
if(sda==0) flag=0;
else flag=1; //返回(~I_clock());
scl=0;
return(flag);
}
unsigned char I_receive(void) //字节数据接收子程序
{data unsigned char i;
unsigned char I_data=0;
sda=1;
for(i=0;i<8;i++)
{I_data*=2;;
scl=0;
time8563();
scl=1;;;
if(sda==1)I_data++;
;;
}
scl=0;;;;
sda=0;
if(flag1==0){;;scl=1;time8563();scl=0;} //not last receic _unsigned char ACK
else {sda=1;;;scl=1;time8563(); //the last receive_unsigned char ACK
scl=0;flag1=0;
}
return(I_data);
}
void TIME(int nt) //延时函数
{long int it=0;
for(it=0;it<nt*1000;it++);
return;
}
void DELAY(void) //判断液晶显示器是否忙的子程序
{P1=0xFF;
R_S=0;R_W=1;E_E=0;
_nop_();
E_E=1;
while(P1_7); //如果P1.7为高电平表示忙就循环等待
return;
}
void WR1602C(char mun,char rs) //写入控制命令的子程序
{P1=mun; //将代码送到P1口
R_S=rs; //1数据寄存器,0指令寄存器
R_W=0;E_E=0; //执行显示命令
DELAY(); //判断液晶模块是否忙
E_E=1; //显示完成,程序停车
return;
}
void main(void)
{ data unsigned char i;
rom_sed[0]=0x00; //时____秒寄存器1初始值=0x00__00秒
rom_sed[1]=0x36; //时__分钟寄存器1初始值=0x55__36分
rom_sed[2]=0x14; //时__小时寄存器1初始值=0x23__14点
rom_sed[3]=0x30; //日____日寄存器1初始值=0x31__30日
rom_sed[4]=0x04; //日__星期寄存器1初始值=0x06__星期4
rom_sed[5]=0x83; //日____月寄存器1初始值=0x92__03月
rom_sed[6]=0x06; //日____年寄存器1初始值=0x99__06年
rom_sed[7]=0x00; //控制状态寄存器2初始值=0x00
rom_sed[8]=0x00; //控制状态寄存器1初始值=0x00
for(i=0;i<255;i++)time8563(); //长时间延时
/* I_start(); //时间调整开始
if(~I_send(0xA2)) //写地址寄存器为0xA2
{if(~I_send(0x02)) //从地址寄存器0x02开始读数据
{for(i=0;i<9;i++)
{if(~I_send(rom_sed[i]));
else;
}I_stop();
}else;
}else;
*/
P3_1=0;P3_2=1;TIME(3); //指示灯闪烁
P3_1=1;P3_2=0;TIME(3);
P3_1=0;P3_2=1;TIME(3);
WR1602C(B0000_0001,0); //清屏并光标复位
WR1602C(B0011_1000,0); //设置显示模式:8位2行5x7点阵
WR1602C(B0000_1111,0); //显示器开,光标开,光标允许闪烁
WR1602C(B0000_0110,0); //文字不动,光标自动右移
WR1602C(B1110_1000,0); //写入显示起始地址(第一行第一个位置)
WR1602C(B0100_0001,1); //字母A的代码
WR1602C(B0100_0010,1);
WR1602C(B0100_0011,1);
TIME(5);
START:I_start(); //时间读取开始
if(~I_send(0xA2)) //写地址寄存器为0xA2
{if(~I_send(0x02)) //从地址寄存器0x02开始读数据
{I_start();
if(~I_send(0xA3)) //读地址寄存器为0xA3
{for(i=0;i<7;i++)
{if(i==6)flag1=1;
else flag1=0;
rom_rec[i]=I_receive();
switch(i)
{case 1:rom_rec[i]=rom_rec[i]&0x7f;break;
case 2:
case 3:rom_rec[i]=rom_rec[i]&0x3f;break;
case 4:rom_rec[i]=rom_rec[i]&0x07;break;
case 5:rom_rec[i]=rom_rec[i]&0x9f;break;
default:break;
}
}
I_stop();
}
}
}
WR1602C(B1100_0000,0); //写入显示起始地址(第二行第一个位置)
WR1602C(0x4E,1);WR1602C(0x6F,1); //第二排从头开始显示NowTime
WR1602C(0x77,1);WR1602C(0x54,1);
WR1602C(0x69,1);WR1602C(0x6D,1);
WR1602C(0x65,1);WR1602C(0x20,1);
WR1602C(rom_rec[2]/16+48,1); //时钟_时_十位
WR1602C(rom_rec[2]%16+48,1); //时钟_时_个位
WR1602C(0x3A,1); //显示:
WR1602C(rom_rec[1]/16+48,1); //时钟_分_十位
WR1602C(rom_rec[1]%16+48,1); //时钟_分_个位
WR1602C(0x3A,1); //显示:
WR1602C(rom_rec[0]/16+40,1); //时钟_秒_十位
WR1602C(rom_rec[0]%16+48,1); //时钟_秒_个位
WR1602C(B1110_1000,0); //写入显示起始地址(第一行第一个位置)
if(rom_rec[5]>0x12) //判断是99世纪还20世纪
{rom_rec[5]=rom_rec[5]-0x80;
WR1602C(0x32,1);WR1602C(0x30,1); //第一排从头开始显示20世纪
}
else {WR1602C(0x31,1);WR1602C(0x39,1); //第一排从头开始显示19世纪
}
WR1602C(rom_rec[6]/16+48,1); //时钟_年_十位
WR1602C(rom_rec[6]%16+48,1); //时钟_年_个位
WR1602C(0x2F,1); //显示/
WR1602C(rom_rec[5]/16+48,1); //时钟_月_十位
WR1602C(rom_rec[5]%16+48,1); //时钟_月_个位
WR1602C(0x2F,1); //显示/
WR1602C(rom_rec[3]/16+48,1); //时钟_日_十位
WR1602C(rom_rec[3]%16+48,1); //时钟_日_个位
WR1602C(0x20,1);
WR1602C(0x57,1);WR1602C(0x65,1); //显示Week
WR1602C(0x65,1);WR1602C(0x6B,1);
WR1602C(rom_rec[4]+48,1); //时钟_星期几
TIME(5);
goto START;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -