?? ds12887._c
字號(hào):
/*******************************************
文件:hongwai.C
環(huán)境:編譯為ICC AVR6.25A,仿真為AVR Studio4.10
硬件:ATMEGA16芯片
日期:2008年12月10日
功能:紅外遙控器數(shù)碼管鍵值顯示
備注:
/******************************************/
#include <D:\開(kāi)發(fā)板\OK400C\程序\avr程序\OK400C.H>
#include <stdio.h> //標(biāo)準(zhǔn)輸入輸出頭文件
/* 命令常量定義 */
#define CMD_START_DS12C887 0x20
/* 開(kāi)啟時(shí)鐘芯片 */
#define CMD_START_OSCILLATOR 0x70
/* 開(kāi)啟振蕩器,處于抑制狀態(tài) */
#define CMD_CLOSE_DS12C887 0x30
/* 關(guān)掉時(shí)鐘芯片 */
/* 所有的置位使用或操作,清除使用與操作 */
#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小時(shí)模式 */
#define MASK_CLR_2412 0xfd
/* 使用12小時(shí)模式 */
#define MASK_SETB_DSE 0x01
/* 使用夏令時(shí) */
#define MASK_CLR_DSE 0xfe
/* 不使用夏令時(shí) */
// 寄存器地址通道定義
#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};
/*******************************************
函數(shù)名稱: LCD1602_portini
功 能: 初始化1602液晶用到的IO口
參 數(shù): 無(wú)
返回值 : 無(wú)
/********************************************/
void LCD1602_portini(void)
{
LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管腳為輸出
LCDa_DATA_DDR |= 0xFF;//配置數(shù)據(jù)管腳為輸出
}
/*******************************************
函數(shù)名稱: LCD1602_readbyte
功 能: 從1602液晶讀出一個(gè)字節(jié)數(shù)據(jù)或者指令
參 數(shù): DatCmd--為iDat時(shí)是數(shù)據(jù),為iCmd時(shí)是指令
返回值 : dByte--讀回的數(shù)據(jù)或者指令
/********************************************/
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; //數(shù)據(jù)總線定義為輸入
dByte=LCDa_DI; //讀數(shù)據(jù)或者指令
Delayms(1); //時(shí)序調(diào)整
LCDa_CLR_E;
LCDa_DATA_DDR|=0xff; //數(shù)據(jù)總線還原為輸出
return dByte;
}
/*******************************************
函數(shù)名稱: LCD1602_sendbyte
功 能: 向1602液晶寫(xiě)入一個(gè)字節(jié)數(shù)據(jù)或者指令
參 數(shù): DatCmd--為iDat時(shí)是數(shù)據(jù),為iCmd時(shí)是指令
dByte--為寫(xiě)入1602的數(shù)據(jù)或者指令
返回值 : 無(wú)
/********************************************/
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
if (DatCmd == iCmd) //指令操作
LCDa_CLR_RS;
else
LCDa_SET_RS; //數(shù)據(jù)操作
LCDa_CLR_RW; //寫(xiě)操作操作
LCDa_SET_E;
LCDa_DO = dByte; //寫(xiě)入數(shù)據(jù)
Delayms(1);
LCDa_CLR_E;
}
/*******************************************
函數(shù)名稱: LCD1602_sendstr
功 能: 向1602液晶寫(xiě)入一個(gè)字符串
參 數(shù): ptString--字符串指針
返回值 : 無(wú)
/********************************************/
void LCD1602_sendstr(uchar *ptString)
{
while((*ptString)!='\0') //字符串未結(jié)束就一直寫(xiě)
{
LCD1602_sendbyte(iDat, *ptString++);
}
}
/*******************************************
函數(shù)名稱: LCD1602_clear
功 能: 1602液晶清屏
參 數(shù): 無(wú)
返回值 : 無(wú)
/********************************************/
void LCD1602_clear(void)
{
LCD1602_sendbyte(iCmd,LCDa_CLS);//寫(xiě)入清屏指令
Delayms(2);// 清屏指令寫(xiě)入后,2ms 的延時(shí)是很必要的!!!
}
/*******************************************
函數(shù)名稱: LCD1602_readBF
功 能: 1602液晶清屏
參 數(shù): 無(wú)
返回值 : busy--為1時(shí)是忙狀態(tài),為0時(shí)可以接收指令
/********************************************/
uchar LCD1602_readBF(void)
{
uchar busy;
busy=LCD1602_readbyte(iCmd); //讀回BF標(biāo)志(忙標(biāo)志)和地址
if(busy&0x80) //如果忙返回正在忙的狀態(tài)
busy=1;
else //如果不忙,可以寫(xiě)入
busy=0;
return busy;
}
/*******************************************
函數(shù)名稱: LCD1602_gotoXY
功 能: 移動(dòng)到指定位置
參 數(shù): Row--指定的行
Col--指定的列
返回值 : 無(wú)
/********************************************/
void LCD1602_gotoXY(uchar Row, uchar Col)
{
switch (Row) //選擇行
{
case 2:
LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break; //寫(xiě)入第2行的指定列
default:
LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break; //寫(xiě)入第1行的指定列
}
}
/*******************************************
函數(shù)名稱: LCD1602_initial
功 能: 1602液晶初始化
參 數(shù): 無(wú)
返回值 : 無(wú)
/********************************************/
void LCD1602_initial(void)
{
Delayms(100); //上電后等待內(nèi)部復(fù)位
LCD1602_portini(); //端口初始化
LCD1602_sendbyte(iCmd, LCDa_FUNCTION); //功能、模式設(shè)定,具體的設(shè)定功能可以看C:\icc\include\AVR_PQ1A.H里面的常量定義
while(LCD1602_readBF()); //等待不忙為止
LCD1602_sendbyte(iCmd, LCDa_ON); //打開(kāi)顯示
while(LCD1602_readBF()); //等待不忙為止
LCD1602_clear(); //清屏
while(LCD1602_readBF()); //等待不忙為止
LCD1602_sendbyte(iCmd, LCDa_ENTRY); //輸入模式設(shè)定
}
void write_ds(uchar add,uchar date)
{
PORTC&=~BIT(RTC_CS); //選通時(shí)鐘
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); //寫(xiě)數(shù)據(jù)
PORTD|=BIT(RTC_AS);
PORTC|=BIT(RTC_CS);
}
uchar read_ds(uchar add)
{
uchar ds_date;
PORTC&=~BIT(RTC_CS); //選通時(shí)鐘
PORTD|=BIT(RTC_AS);
PORTD|=BIT(RTC_DS);
PORTD|=BIT(RTC_RW);
// PORTC&=~BIT(RTC_CS); //選通時(shí)鐘
PORTA=add;
Delayus(5);
PORTD&=~BIT(RTC_AS); //鎖存地址
PORTD&=~BIT(RTC_DS);
DDRA=0;
// PORTA=0XFF;
Delayus(5);
ds_date=PINA; //讀數(shù)據(jù)
DDRA=0XFF;
PORTD|=BIT(RTC_DS);
PORTD|=BIT(RTC_AS);
PORTC|=BIT(RTC_CS);
return ds_date;
}
/*************************************************************
函數(shù)功能:該函數(shù)用來(lái)啟動(dòng)時(shí)鐘芯片工作
應(yīng)用范圍:僅在時(shí)鐘芯片首次使用時(shí)用到一次
入口參數(shù):
出口參數(shù):
*************************************************************/
void StartDs12c887(void)
{
write_ds(chRegA,CMD_START_DS12C887);
}
/*************************************************************
函數(shù)功能:該函數(shù)用來(lái)關(guān)閉時(shí)鐘芯片
應(yīng)用范圍:一般用不到
入口參數(shù):
出口參數(shù):
*************************************************************/
void CloseDs12c887(void)
{
write_ds(chRegA,CMD_CLOSE_DS12C887);
}
/*************************************************************
函數(shù)功能:初始化ds12c887
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -