📄 sz.c
字号:
//20060921晚 含温度 一个闹钟 可调时间
//P1。0~P1。7接DB0~DB7 P1。7即接BF位 LCD_RS=P2^6 LCD_RW=P2^5 LCD_EN=P2^4 ;
//1地 2VCC 3对比 4 RS 5 RW 6 EN 7~14 DB0~DB7
#include<at89x51.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^7;
sbit DQ1=P1^6;
sbit T_CLK = P1^2; /*实时时钟时钟线引脚 */
sbit T_IO = P1^1; /*实时时钟数据线引脚 */
sbit T_RST = P1^0; /*实时时钟复位线引脚 */
//按键 P1-0 P1-1 P1-2
//#define LCD_DATA P0 //液晶数据口
//#define BUSY_FLAG P0_7 //液晶模块忙标志
//#define MPU_RS_CH P2_0 //寄存器选择输入-----------------4
//#define MPU_RW_CH P2_1 //读写控制--------------------------5
//#define MPU_ENABLE P2_2 //使能控制----------------------- 6
//#define MPU_RESET P2_3 //液晶复位控制----------------17
#define sure P2_0
#define up P2_1
#define down P2_2
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uint n=0;
sbit LCD_RS=P2^7 ;
sbit LCD_RW=P2^6 ;
sbit LCD_EN=P2^5 ;// 0123456789
unsigned char data xian0[16]={"2006-09-18 WEEK1"};//显示用
unsigned char data xian2[16]={"22:23:45 L-22:24"};//显示用22:23:45 ∩22
uchar mid[7]={0x00,0x00,0x00,0x01,0x01,0x06,0x00 };
// 秒 分 时 日 月 星期 年 实际上不是16进制
int i, zhi=1;
int ci=0,k;
int mi=0;
int zhou;
/*
unsigned char xian2[16]={"22:23:45 22:23"};
unsigned char xian0[16]={"公2006年09月18日"};
unsigned char xian1[16]={"农2006年08月18日"};
unsigned char xian[16]={"T:29.3`C 星期 6"};
*/
#define nianshi xian0[2]//0
#define niange xian0[3]//6
#define yueshi xian0[5]//0
#define yuege xian0[6]//9
#define rishi xian0[8]//1
#define rige xian0[9]//8
#define shishi xian2[0]//2
#define shige xian2[1]//2
#define fenshi xian2[3]//2
#define fenge xian2[4]//3
#define miaoshi xian2[6]//4
#define miaoge xian2[7]//5
#define nshishi xian2[11]//2
#define nshige xian2[12]//2
#define nfenshi xian2[14]//2
#define nfenge xian2[15]//4
int nshi,nfen,nshishi_1,nshige_1,nfenshi_1,nfenge_1;
//#define wenshi xian[2]
//#define wenge xian[3]
//#define wenxiao xian[5]
#define week xian0[15] // 6
void xianshi();
#define delayNOP(); { _nop_(); _nop_(); _nop_(); _nop_(); } ; //延时 宏定义
void delay(int t) {while(t){t--;}}
void delayMs (unsigned char ms) {unsigned char i;while (--ms){for (i = 0; i < 250; i++);}}
/*************************************************************/
/*
/*以下函数为检查LCD忙状态
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据
/*
/*************************************************************/
bit lcd_busy() //BIT类型的函数 不是0就是1
{
bit result ; //BIT 类型的返回值
LCD_RS = 0 ;LCD_RW = 1 ; LCD_EN = 1 ; //RS=0,R/W=1,在E高电瓶的作用下,BF和AC6~AC0被读到DB7~DB0的相应位
delayNOP() ; //短暂延时
result =(bit)(P0&0x80) ;// 0x80=1000 0000,取出DB7位 强制位BIT型的变量:(bit) !!%%%%%%%!!*****%%%%%
LCD_EN = 0 ;
return(result) ; //带回BIT类型的返回值
}
/*******************************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 !! 写指令数据 !!
/*
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()) ; //LCD繁忙就等 直到读取到的BF位为0
LCD_RS = 0 ; //RS=0,指向指令寄存器 //RS=1,指向数据寄存器
LCD_RW = 0 ; //RW=0,写操作 //RW=1,读操作
LCD_EN = 0 ;
_nop_() ; _nop_() ; //短暂延时
P0=cmd ; //将控制指令数据放到P0口输出
delayNOP() ; //短暂延时
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/*******************************************************************/
/*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_RS = 1 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
P0= dat;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/*************************************************************/
/*
/* LCD初始化设定
/*
/*************************************************************/
void lcd_init() //LCD初始化设定
{
delay(15) ;
lcd_wcmd(0x38) ; //6功能设定:16*2行显示,5*7点阵,8位数据总线
delay(5) ;
lcd_wcmd(0x38) ; //0x38= 0011(DL=1即8位数据总线,0为4位数据总线)
//1(N=1即双行显示,0为单行显示)0(F=0为5*7显示,1为5*10显示)00
delay(5) ;
lcd_wcmd(0x38) ;
delay(5) ;
lcd_wcmd(0x0f) ; //4:显示开关控制:显示开,关光标,光标不闪烁
delay(5) ;
lcd_wcmd(0x06) ; //设置输入模式:I/D=1:完成一个字符码后AC自动加1;移动光标
delay(5) ; ////设置输入模式:S=0:显示不发生移位
lcd_wcmd(0x01) ; //清除LCD的显示内容
delay(5) ;
}
/*************************************************************/
/*
/* 设定显示位置
/*
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量
} //因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入
//的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
//===============================================
/********************************************************************
* 名称: v_RTInputByte
* 功能: 往DS1302写入1Byte数据 * 输入: ucDa 写入的数据 * 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{ uchar i;ACC = ucDa;for(i=8; i>0; i--){T_IO = ACC0; T_CLK = 1;T_CLK = 0;ACC = ACC >> 1; } }
/********************************************************************
* 名称: uchar uc_RTOutputByte * 功能: 从DS1302读取1Byte数据
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{ uchar i;for(i=8; i>0; i--){ACC = ACC >>1;ACC7 = T_IO;T_CLK = 1;T_CLK = 0;} return(ACC); }
/********************************************************************
* 名称: v_W1302 * 说明: 先写地址,后写命令/数据 * 功能: 往DS1302写入数据
* 调用: v_RTInputByte() * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); /* 地址,命令 */v_RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST =0;}
/********************************************************************
* 说明: 先写地址,后读命令/数据 * 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte() * 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;T_CLK = 0;T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;T_RST =0;
return(ucDa);
}
/********************************************************************
* 名称: v_Set1302 * 功能: 设置初始时间 * 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
* 名称: v_Get1302* 功能: 读取DS1302当前时间* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
***********************************************************************/
void v_Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
void scan()
{
P2=0xff;
if(sure==0)
{
DQ1=0;
//------------------以下是年
while(!sure);//等待 按键撤消
delayMs (80);
while(sure) //直到 确认 键再次被按下时 才退出
{
if(up==0)
{
while(!up); delayMs (40);
mid[6]++;
if((mid[6]&0x0f)>9){mid[6]=mid[6]+6;}
if(mid[6]>=0x99){mid[6]=0;}
v_Set1302(mid); xianshi();
}
if(down==0)
{while(!down); delayMs (40);
if(mid[6]==0){mid[6]=0x99;}
else {mid[6]--;}
if((mid[6]&0x0f)==0x0f){mid[6]=mid[6]-6;}
v_Set1302(mid); xianshi();}
}
while(!sure);
delayMs (80);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -