📄 wgx_1302_lcd.c
字号:
/*****************************************
程序名:wgx_1302_lcd.c
设计者:wanggguangxi11@163.com
时 间:2007-12-14
功 能:基于1302时钟芯片用LCD12864液晶显
******************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include "12864.h" //注意掉用子程序的次序
#include "code_12864.h"
#include "12864_declar.h"
#include "INTRINS.H"
#include "lcd_12864.h"
sbit T_CLK = P2^0; //*实时时钟时钟线引脚
sbit T_IO = P2^1; //*实时时钟数据线引脚
sbit T_RST = P2^2; //*实时时钟复位线引脚
uchar data day[7]={0x00,0x59,0x23,0x14,0x12,0x04,0x07};//时钟赋初值
uchar data g_day[7];
uchar data b[30];
//延时大约0.5S
void delay1 (uint n)
{
while(--n);
}
void delay(void)
{
uchar i,j=8;
while(j--)
delay1(6000);
}
//十进转换成BCD码
void BCD(void)
{ uchar i,j=0;
for (i=0;i<7;i++)
{
b[j]=g_day[i]&0x0f;
j++;
b[j]=(g_day[i]&0xf0)>>4;
j++;
}
}
//往1302写入1Byte数据,输入:ucDa数据
void inputByte(uchar ucDa)
{
uchar i;
ACC = ucDa;
for (i=8; i>0; i--)
{
T_IO = ACC_0; //*相当于汇编中的 RRC
T_CLK = 1;
_nop_();
T_CLK = 0;
ACC = ACC >> 1;
}
}
//从1302中读取1Byte数据,返回值:ACC
uchar outputByte(void)
{
uchar i;
for (i=8; i>0; i--)
{
ACC = ACC >>1; //*相当于汇编中的 RRC
ACC_7 = T_IO;
T_CLK = 1;
_nop_();
T_CLK = 0;
}
return(ACC);
}
//往1302中写入数据
void w_adr_data(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
_nop_();
inputByte(ucAddr); //*地址、命令(写数据:0X80)
inputByte(ucDa); //* 写1Byte数据
T_CLK = 1;
T_RST =0;
}
//读取1302某地址的数据
uchar R_1data(uchar ucAddr) //*读1地址数据
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
_nop_();
inputByte(ucAddr); //* 地址,命令(读数据:0X81)
ucDa = outputByte(); //* 读1Byte数据
T_CLK = 1;
T_RST =0;
return(ucDa);
}
//住1302写入时钟数据
void W_8data(uchar *pSecDa) //*写8个数据*/
{
uchar i;
w_adr_data(0x8e,0x00); //* 控制命令,WP=0,写操作*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
_nop_();
inputByte(0xbe); //* 0xbe:时钟多字节写命令 */
for (i=8;i>0;i--) //*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
inputByte(*pSecDa);//* 写1Byte数据*/
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
/********************************************************************
* 名称: R_8_time
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: inputByte() , outputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
void R_8_time(uchar *pSecDa)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
_nop_();
inputByte(0xbf); //* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pSecDa = outputByte(); //* 读1Byte数据 */
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
/********************************************************************
* 名称: W_ram
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: inputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void W_ram(uchar *pReDa)
{
uchar i;
w_adr_data(0x8e,0x00); //* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
inputByte(0xfe); //* 0xbe:时钟多字节写命令 */
for (i=31;i>0;i--) //*31Byte 寄存器数据 */
{
inputByte(*pReDa); //* 写1Byte数据*/
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
/********************************************************************
* 名称: R_ram
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: inputByte() , outputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void R_ram(uchar *pReDa)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
inputByte(0xff); //* 0xFF 时钟多字节读命令
for (i=31; i>0; i--) //*31Byte 寄存器数据
{
*pReDa = outputByte();//* 读1Byte数据
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
/*********************************************************************
* 名称: init
* 说明:
* 功能: 设置初始时间
* 调用: w_adr_data()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 返回值: 无
***********************************************************************/
void init(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80; //写数据:0X80
w_adr_data(0x8e,0x00); //* 控制命令,WP=0,写操作
for (i =7;i>0;i--)
{
w_adr_data(ucAddr,*pSecDa); //* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
w_adr_data(0x8e,0x80);
}
/*********************************************************************
* 名称: get_day
* 说明:
* 功能: 读取DS1302当前时间
* 调用: R_1data()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 返回值: 无
***********************************************************************/
void get_day(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81; // 读数据:0X81
for (i=0;i<7;i++)
{
ucCurtime[i] = R_1data(ucAddr);//*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
//时间显示程序
void show_time(uchar row)
{
uchar i;
uchar one_time[8]={0,0,10,0,0,10,0,0};
get_day(g_day);
BCD();
one_time[0]=b[5]; one_time[1]=b[4]; //(时间处理程序)前为个位,后为十位
one_time[3]=b[3]; one_time[4]=b[2];
one_time[6]=b[1]; one_time[7]=b[0];
for(i=0;i<4;i++)
{
Left_Show_letter(row,32+i*8,one_time[i]); //左屏时间显示
Right_Show_letter(row,i*8,one_time[4+i]); //右屏时间显示
}
}
void show_date(void)
{
get_day(g_day);
BCD();
Left_Show_letter(0,0,2); //左屏"年份"显示(初始化为2007)
Left_Show_letter(0,8,0);
Left_Show_letter(0,16,b[13]);
Left_Show_letter(0,24,b[12]);
Left_Show_Word(0,32,0); //左屏"年"显示
Right_Show_letter(0,0,b[9]); //右屏"月份"显示
Right_Show_letter(0,8,b[8]);
Right_Show_Word(0,16,1); //右屏"月"显示
Right_Show_letter(0,32,b[7]); //右屏"日期"显示
Right_Show_letter(0,40,b[6]);
Right_Show_Word(0,48,2);
}
//主函数
void main (void )
{
Show_Null(); //清屏
T_CLK=1;
_nop_();
T_CLK=0;
init(day);
T_CLK=0;
w_adr_data(0x80,0x00) ;
while (1)
{ show_date();
show_time(3); //时间从第四行开始(屏幕总8行"0~7")
Left_Show_Word(6,32,3); //左屏"星"显示
Left_Show_Word(6,48,4); //左屏"期"显示
Right_Show_Word(6,16,b[10]+5); //右屏"五"显示(初始化)
delay();
Left_Show_letter(3,48,11); //显示秒闪 ":"
Right_Show_letter(3,8,11);
delay();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -