⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sz.c

📁 1302专用时钟芯片 1602 LCD 显示
💻 C
📖 第 1 页 / 共 2 页
字号:

//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 + -