📄 ds12887.c
字号:
/*******************************************
文件:hongwai.C
环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
硬件:ATMEGA16芯片
日期:2008年12月10日
功能:红外遥控器数码管键值显示
备注:
/******************************************/
#include <D:\开发板\OK400C\程序\avr程序\OK400C.H>
#include <stdio.h> //标准输入输出头文件
/* 命令常量定义 */
#define CMD_START_DS12C887 0x20
/* 开启时钟芯片 */
#define CMD_START_OSCILLATOR 0x70
/* 开启振荡器,处于抑制状态 */
#define CMD_CLOSE_DS12C887 0x30
/* 关掉时钟芯片 */
/* 所有的置位使用或操作,清除使用与操作 */
#define MASK_SETB_SET 0x80
/* 禁止刷新 */
#define MASK_CLR_SET 0x7f
/* 使能刷新 */
#define MASK_SETB_DM 0x04
/* 使用HEX格式 */
#define MASK_CLR_DM 0xfb
/* 使用BCD码格式 */
#define MASK_SETB_2412 0x02
/* 使用24小时模式 */
#define MASK_CLR_2412 0xfd
/* 使用12小时模式 */
#define MASK_SETB_DSE 0x01
/* 使用夏令时 */
#define MASK_CLR_DSE 0xfe
/* 不使用夏令时 */
// 寄存器地址通道定义
#define chSecondsChannel 0X00
#define chMinutesChannel 0X02
#define chHoursChannel 0X04
#define chDofWChannel 0X06
#define chDateChannel 0X07
#define chMonthChannel 0X08
#define chYearChannel 0X09
#define chCenturyChannel 0X32
#define chRegA 0X0a
#define chRegB 0X0b
#define chRegC 0X0c
#define chRegD 0X0d
uchar temp_data1[3] = {0x00,0x00,0x00};
uchar temp_data2[3] = {0x00,0x00,0x00};
uchar display[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
/*******************************************
函数名称: LCD1602_portini
功 能: 初始化1602液晶用到的IO口
参 数: 无
返回值 : 无
/********************************************/
void LCD1602_portini(void)
{
LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
}
/*******************************************
函数名称: LCD1602_readbyte
功 能: 从1602液晶读出一个字节数据或者指令
参 数: DatCmd--为iDat时是数据,为iCmd时是指令
返回值 : dByte--读回的数据或者指令
/********************************************/
uchar LCD1602_readbyte(uchar DatCmd)
{
uchar dByte;
if (DatCmd == iCmd) //指令操作
LCDa_CLR_RS;
else
LCDa_SET_RS;
LCDa_SET_RW; //读操作
LCDa_SET_E;
LCDa_DATA_DDR=0x00; //数据总线定义为输入
dByte=LCDa_DI; //读数据或者指令
Delayms(1); //时序调整
LCDa_CLR_E;
LCDa_DATA_DDR|=0xff; //数据总线还原为输出
return dByte;
}
/*******************************************
函数名称: LCD1602_sendbyte
功 能: 向1602液晶写入一个字节数据或者指令
参 数: DatCmd--为iDat时是数据,为iCmd时是指令
dByte--为写入1602的数据或者指令
返回值 : 无
/********************************************/
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
if (DatCmd == iCmd) //指令操作
LCDa_CLR_RS;
else
LCDa_SET_RS; //数据操作
LCDa_CLR_RW; //写操作操作
LCDa_SET_E;
LCDa_DO = dByte; //写入数据
Delayms(1);
LCDa_CLR_E;
}
/*******************************************
函数名称: LCD1602_sendstr
功 能: 向1602液晶写入一个字符串
参 数: ptString--字符串指针
返回值 : 无
/********************************************/
void LCD1602_sendstr(uchar *ptString)
{
while((*ptString)!='\0') //字符串未结束就一直写
{
LCD1602_sendbyte(iDat, *ptString++);
}
}
/*******************************************
函数名称: LCD1602_clear
功 能: 1602液晶清屏
参 数: 无
返回值 : 无
/********************************************/
void LCD1602_clear(void)
{
LCD1602_sendbyte(iCmd,LCDa_CLS);//写入清屏指令
Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
}
/*******************************************
函数名称: LCD1602_readBF
功 能: 1602液晶清屏
参 数: 无
返回值 : busy--为1时是忙状态,为0时可以接收指令
/********************************************/
uchar LCD1602_readBF(void)
{
uchar busy;
busy=LCD1602_readbyte(iCmd); //读回BF标志(忙标志)和地址
if(busy&0x80) //如果忙返回正在忙的状态
busy=1;
else //如果不忙,可以写入
busy=0;
return busy;
}
/*******************************************
函数名称: LCD1602_gotoXY
功 能: 移动到指定位置
参 数: Row--指定的行
Col--指定的列
返回值 : 无
/********************************************/
void LCD1602_gotoXY(uchar Row, uchar Col)
{
switch (Row) //选择行
{
case 2:
LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break; //写入第2行的指定列
default:
LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break; //写入第1行的指定列
}
}
/*******************************************
函数名称: LCD1602_initial
功 能: 1602液晶初始化
参 数: 无
返回值 : 无
/********************************************/
void LCD1602_initial(void)
{
Delayms(100); //上电后等待内部复位
LCD1602_portini(); //端口初始化
LCD1602_sendbyte(iCmd, LCDa_FUNCTION); //功能、模式设定,具体的设定功能可以看C:\icc\include\AVR_PQ1A.H里面的常量定义
while(LCD1602_readBF()); //等待不忙为止
LCD1602_sendbyte(iCmd, LCDa_ON); //打开显示
while(LCD1602_readBF()); //等待不忙为止
LCD1602_clear(); //清屏
while(LCD1602_readBF()); //等待不忙为止
LCD1602_sendbyte(iCmd, LCDa_ENTRY); //输入模式设定
}
void write_ds(uchar add,uchar date)
{
PORTC&=~BIT(RTC_CS); //选通时钟
PORTD|=BIT(RTC_AS);
PORTD|=BIT(RTC_DS);
PORTD|=BIT(RTC_RW);
PORTA=add;
Delayus(5);
PORTD&=~BIT(RTC_AS); //锁存地址
PORTD&=~BIT(RTC_RW);
PORTA=date;
Delayus(5);
PORTD|=BIT(RTC_RW); //写数据
PORTD|=BIT(RTC_AS);
PORTC|=BIT(RTC_CS);
}
uchar read_ds(uchar add)
{
uchar ds_date;
PORTC&=~BIT(RTC_CS); //选通时钟
PORTD|=BIT(RTC_AS);
PORTD|=BIT(RTC_DS);
PORTD|=BIT(RTC_RW);
// PORTC&=~BIT(RTC_CS); //选通时钟
PORTA=add;
Delayus(5);
PORTD&=~BIT(RTC_AS); //锁存地址
PORTD&=~BIT(RTC_DS);
DDRA=0;
// PORTA=0XFF;
Delayus(5);
ds_date=PINA; //读数据
DDRA=0XFF;
PORTD|=BIT(RTC_DS);
PORTD|=BIT(RTC_AS);
PORTC|=BIT(RTC_CS);
return ds_date;
}
/*************************************************************
函数功能:该函数用来启动时钟芯片工作
应用范围:仅在时钟芯片首次使用时用到一次
入口参数:
出口参数:
*************************************************************/
void StartDs12c887(void)
{
write_ds(chRegA,CMD_START_DS12C887);
}
/*************************************************************
函数功能:该函数用来关闭时钟芯片
应用范围:一般用不到
入口参数:
出口参数:
*************************************************************/
void CloseDs12c887(void)
{
write_ds(chRegA,CMD_CLOSE_DS12C887);
}
/*************************************************************
函数功能:初始化ds12c887
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -