?? 2402test.c
字號:
/********************************************************************************************
//Dy-2402C 桌面控制鐘
//應用程序 C
//杜洋
//V1.0 2007-4-20
//MCS-51 12MHZ C語言
//LCM2402 89S52 DS18B20 DS1302 AT24C02 紅外接收IC
*********************************************************************************************/
/********************************************************************************************/
#include <AT89X52.h>
#include <string.h> // 包含頭文件
/********************************************************************************************/
typedef unsigned char uint8; // 無符號8位整型變量
typedef unsigned short uint16; // 無符號16位整型變量
typedef signed char int8; // 有符號8位整型變量
sbit LED1 = P2 ^ 3; // 定義LCM2402的RS控制線
/********************************************************************************************/
//全局變量
static unsigned char data IRCode[3],IRCON,IRCON2;//遙控器中斷專用
static unsigned char data DT,menu,rom,alarm_con;//遙控寄存值/菜單值/定時器組值/報警開關選擇
/********************************************************************************************/
//=================================LCM2402模塊驅動===========================================//
/********************************************************************************************/
#define LCM2402_DB0_DB7 P0 // 定義LCM2402的數據總線
sbit LCM2402_RS = P1 ^ 0; // 定義LCM2402的RS控制線
sbit LCM2402_RW = P1 ^ 2; // 定義LCM2402的RW控制線
sbit LCM2402_E = P1 ^ 1; // 定義LCM2402的E控制線
sbit LCM2402_Busy = P0 ^ 7; // 定義LCM2402的測忙線(與LCM2402_DB0_DB7關聯)
/********************************************************************************************/
//定義LCM2402指令集//
#define CMD_clear 0x01 // 清除屏幕
#define CMD_back 0x02 // DDRAM回零位
#define CMD_dec1 0x04 // 讀入后AC(指針)減1,向左寫
#define CMD_add1 0x06 // 讀入后AC(指針)加1,向右寫
#define CMD_dis_gb1 0x0f // 開顯示_開光標_開光標閃爍
#define CMD_dis_gb2 0x0e // 開顯示_開光標_關光標閃爍
#define CMD_dis_gb3 0x0c // 開顯示_關光標_關光標閃爍
#define CMD_OFF_dis 0x08 // 關顯示_關光標_關光標閃爍
#define CMD_set82 0x38 // 8位總線_2行顯示
#define CMD_set81 0x30 // 8位總線_1行顯示(上邊行)
#define CMD_set42 0x28 // 4位總線_2行顯示
#define CMD_set41 0x20 // 4位總線_1行顯示(上邊行)
#define lin_1 0x80 // 4位總線_1行顯示(上邊行)
#define lin_2 0xc0 // 4位總線_1行顯示(上邊行)
/********************************************************************************************[底層協議]
* 函數名稱:DelayS()
* 功 能:延時
*********************************************************************************************/
void DelayS(unsigned int a){
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一個 ; 表示空語句,CPU空轉。
} //i 從0加到125,CPU大概就耗時1毫秒
}
void DelayS250(void){
DelayS(250);
}
/********************************************************************************************[底層協議]
* 函數名稱:LCM2402_TestBusy()
* 功 能:LCM2402測忙,若LCM2402處于忙狀態,本函數將繼續測忙,直到LCM2402處于非忙狀態。
*********************************************************************************************/
void LCM2402_TestBusy(void){
LCM2402_DB0_DB7 = 0xff;//設備讀狀態
LCM2402_RS = 0;
LCM2402_RW = 1;
LCM2402_E = 1;
while(LCM2402_Busy);//等待LCM不忙
LCM2402_E = 0;//
}
/********************************************************************************************[底層協議]
* 函數名稱:LCM2402_WriteCMD()
* 功 能:向LCM2402寫命令。
* 入口參數:LCM2402_command 要寫入LCM2402的命令字節
* 出口參數:無
*********************************************************************************************/
void LCM2402_WriteCMD(uint8 LCM2402_command) {
LCM2402_TestBusy();
LCM2402_DB0_DB7 = LCM2402_command;
LCM2402_RS = 0;
LCM2402_RW = 0;
LCM2402_E = 1;
LCM2402_E = 0;
}
/********************************************************************************************[底層協議]
* 函數名稱:LCM2402_WriteData()
* 功 能:向LCM2402寫數據。
* 入口參數:LCM2402_data 要寫入LCM2402的數據字節
* 出口參數:無
*********************************************************************************************/
void LCM2402_WriteData(uint8 LCM2402_data){
LCM2402_TestBusy();
LCM2402_DB0_DB7 = LCM2402_data;
LCM2402_RS = 1;
LCM2402_RW = 0;
LCM2402_E = 1;
LCM2402_E = 0;
}
/********************************************************************************************
* 函數名稱:LCM2402_Init()
* 功 能:LCM2402初始化
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void LCM2402_Init(void){
LCM2402_WriteCMD(CMD_set82);// 顯示模式設置:顯示2行,每個字符為5*7個像素
LCM2402_WriteCMD(CMD_clear);// 顯示清屏
LCM2402_WriteCMD(CMD_back);// 數據指針指向第1行第1個字符位置
LCM2402_WriteCMD(CMD_add1);// 顯示光標移動設置:文字不動,光標右移
LCM2402_WriteCMD(CMD_dis_gb3); // 顯示開及光標設置:顯示開,光標開,閃爍開
}
/********************************************************************************************
* 函數名稱:print()
* 功 能:向LCM發送一個字符串,長度48字符之內。//應用:print("doyoung.net");
* 入口參數:字符串
* 出口參數:無
*********************************************************************************************/
void print(uint8 a,uint8 *str){
LCM2402_WriteCMD(a);
while(*str != '\0'){
LCM2402_WriteData(*str++);
}
*str = 0;
}
/********************************************************************************************
* 函數名稱:print2()
* 功 能:向LCM發送一個字符串,長度48字符之內。//應用:print("doyoung.net");
* 入口參數:字符串
* 出口參數:無
*********************************************************************************************/
void print2(uint8 a,uint8 t){//設置寫入地址和數據//
LCM2402_WriteCMD(a);
LCM2402_WriteData(t);
}
//=================================AT24C02模塊驅動===========================================//
//應用舉例//
//AT24C02_Write1Byte(0x02,0xaa); // 向AT24C02的地址0x02寫入0xaa
//i = AT24C02_Read1Byte(0x02); // 從AT24C02的地址0x02讀出數據給變量i
/*********************************************************************************************/
#define AT24C02_WriteDeviceAddress 0xa0 /* 定義器件在I2C總線中的地址 */
#define AT24C02_ReadDeviceAddress 0xa1
sbit SCL=P2^1; /* 定義位變量 */ // I2C總線的時鐘信號
sbit SDA=P2^2; // I2C總線的數據信號
#define TRUE 1
#define FALSE 0
#define I2C_DelayTime 60 // 不要小于50,否則可能造成時序混亂
/********************************************************************************************
* 函數名稱:I2C_Delay()
* 功 能:I2C總線軟件延時
* 入口參數:count 延時參數,值越大,延時越長
* 出口參數:無
*********************************************************************************************/
void I2C_Delay(uint16 count){
while(count!=0) count--;
}
/********************************************************************************************
* 函數名稱:I2C_Start()
* 功 能:啟動I2C總線
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void I2C_Start(void){
SDA=1;
SCL=1;
I2C_Delay(I2C_DelayTime);
SDA=0;
I2C_Delay(I2C_DelayTime);
SCL=0;
I2C_Delay(I2C_DelayTime);
}
/********************************************************************************************
* 函數名稱:I2C_Stop()
* 功 能:終止I2C總線
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void I2C_Stop(void){
SDA=0;
SCL=1;
I2C_Delay(I2C_DelayTime);
SDA=1;
I2C_Delay(I2C_DelayTime);
SCL=0;
I2C_Delay(I2C_DelayTime);
}
/********************************************************************************************
* 函數名稱:I2C_Send_Bit_0()
* 功 能:發送比特0
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void I2C_Send_Bit_0(void){
SDA=0;
SCL=1;
I2C_Delay(I2C_DelayTime);
SCL=0;
I2C_Delay(I2C_DelayTime);
}
/********************************************************************************************
* 函數名稱:I2C_Send_Bit_1()
* 功 能:發送比特1
* 入口參數:無
* 出口參數:無
*********************************************************************************************/
void I2C_Send_Bit_1(void){
SDA=1;
SCL=1;
I2C_Delay(I2C_DelayTime);
SCL=0;
I2C_Delay(I2C_DelayTime);
}
/********************************************************************************************
* 函數名稱:I2C_Check_Ack()
* 功 能:發送完一個字節后檢驗設備的應答信號
* 入口參數:無
* 出口參數:返回值為True,成功
* 返回值為False,失敗
*********************************************************************************************/
bit I2C_Check_Ack(void){
SDA=1;
SCL=1;
I2C_Delay(I2C_DelayTime/2);
F0=SDA;
I2C_Delay(I2C_DelayTime/2);
SCL=0;
I2C_Delay(I2C_DelayTime);
if(F0==1) return FALSE;
return TRUE;
}
/********************************************************************************************
* 函數名稱:I2C_Write8Bit()
* 功 能:向I2C總線寫入8bit數據
* 入口參數:I2C_data 將要寫入I2C總線的8bit數據
* 出口參數:無
*********************************************************************************************/
void I2C_Write8Bit(uint8 I2C_data)reentrant{
uint8 i;
for(i=0;i<8;i++){
if((I2C_data<<i)&0x80){
I2C_Send_Bit_1();
}
else{
I2C_Send_Bit_0();
}
}
}
/********************************************************************************************
* 函數名稱:I2C_Read8Bit()
* 功 能:從I2C總線接收8bit數據
* 入口參數:無
* 出口參數:返回值為從I2C總線上接收到的8bit數據
*********************************************************************************************/
uint8 I2C_Read8Bit(void)reentrant{
uint8 I2C_data=0,i;
for(i=0;i<8;i++){
SDA=1;
SCL=1;
I2C_Delay(10);
F0=SDA;
I2C_Delay(10);
SCL=0;
if(F0==1){
I2C_data=I2C_data<<1;
I2C_data=I2C_data|0x01;
}
else{
I2C_data=I2C_data<<1;
}
}
return I2C_data;
}
/********************************************************************************************
* 函數名稱:AT24C02_Write1Byte()
* 功 能:向AT24C02指定地址上寫入1字節數據
* 入口參數:AT24C02_Address AT24C02內的地址
* AT24C02_1Byte 將要寫入AT24C02的1字節數據
* 出口參數:無
*********************************************************************************************/
void AT24C02_Write1Byte( uint8 AT24C02_Address,
uint8 AT24C02_1Byte){
bit AckTemp=1;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_Address);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_1Byte);
AckTemp=I2C_Check_Ack();
I2C_Stop();
}
/********************************************************************************************
* 函數名稱:AT24C02_Read1Byte()
* 功 能:從AT24C02指定地址上讀出1字節數據
* 入口參數:AT24C02_Address AT24C02內的地址
* 出口參數:從AT24C02指定地址上讀出的1字節數據
*********************************************************************************************/
uint8 AT24C02_Read1Byte(uint8 AT24C02_Address){
bit AckTemp=1;
uint8 AT24C02_1Byte;
I2C_Start();
I2C_Write8Bit(AT24C02_WriteDeviceAddress);
AckTemp=I2C_Check_Ack();
I2C_Write8Bit(AT24C02_Address);
AckTemp=I2C_Check_Ack();
I2C_Start();
I2C_Write8Bit(AT24C02_ReadDeviceAddress);
AckTemp=I2C_Check_Ack();
AT24C02_1Byte=I2C_Read8Bit();
AckTemp=I2C_Check_Ack();
I2C_Stop();
return AT24C02_1Byte;
}
/********************************************************************************************/
//設置定時值程序
void Set_alarm(unsigned char m,unsigned char sel,bit a){ //根據選擇調整的相應項目加1并寫入DS1302
signed char address,item,item2;
signed char max,mini;
if(sel==7) {address=0x0B; max=59;mini=0;} //秒7
if(sel==6) {address=0x0A; max=59;mini=0;} //分鐘6
if(sel==5) {address=0x09; max=23;mini=0;} //小時5
if(sel==4) {address=0x08; max=7;mini=1;} //星期4
if(sel==3) {address=0x07; max=31;mini=0;} //日3
if(sel==2) {address=0x06; max=12;mini=0;} //月2
if(sel==1) {address=0x05; max=99; mini=0;} //年1
if(sel==8) {address=0x04; max=99; mini=0;} //鍵號值
address=address+(m*10);//選擇定時項組
if (a == 0){//如果a是0則表示現在鍵入的是 十位 數據
AT24C02_Write1Byte(address,0x00);//將 個位 的數據清0 防止數值范圍計算有錯
item = DT;//鍵值數給 十位
item2 = 0;// 個位 填入 0
}
else{//否則是 個位數據
if(sel == 4){
item = 0;
}
else{
item = (AT24C02_Read1Byte(address))/16;//先讀出 十位 數據
}
item2 = DT;//鍵值放入 個位
}
item=(item)*10 + (item2);//將 十位 和 個位 數據合成
if(item>max) item=mini;//查看數值有效范圍
if(item<mini) item=max;
AT24C02_Write1Byte(address,(item/10)*16+item%10);//轉換成16進制寫入24C00
if(DT == 0x12){
AT24C02_Write1Byte(address,0xff);
}
}
/*****************************************************************************/
//===================================DS18B20驅動===========================================//
sbit DQ = P2 ^ 0; // 定義DS18B20數據線
/******************************************************************************/
void Delay(int num)//延時函數
{
while(num--) ;
}
/******************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -