




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、/Config.h文件/#ifndef _CONFIG_H#define _CONFIG_H/* 通用頭文件 */#include <reg52.h>#include <intrins.h>/* 數據類型定義 */*typedef signed char int8; / 8位有符號整型數typedef signed int int16; /16位有符號整型數typedef signed long int32; /32位有符號整型數 */typedef unsigned char u8; / 8位無符號整型數typedef unsigned int u16; /16位無符
2、號整型數typedef unsigned long u32; /32位無符號整型數/* 全局運行參數定義 */#define SYS_MCLK (11059200/12) /系統主時鐘頻率,即振蕩器頻率÷12/* IO引腳分配定義 sbit KEY_IN_1 = P24; /矩陣按鍵的掃描輸入引腳1sbit KEY_IN_2 = P25; /矩陣按鍵的掃描輸入引腳2sbit KEY_IN_3 = P26; /矩陣按鍵的掃描輸入引腳3sbit KEY_IN_4 = P27; /矩陣按鍵的掃描輸入引腳4sbit KEY_OUT_1 = P23; /矩陣按鍵的掃描輸出引腳1sbit KEY
3、_OUT_2 = P22; /矩陣按鍵的掃描輸出引腳2sbit KEY_OUT_3 = P21; /矩陣按鍵的掃描輸出引腳3sbit KEY_OUT_4 = P20; /矩陣按鍵的掃描輸出引腳4 */sbit ADDR0 = P10; /LED位選譯碼地址引腳0sbit ADDR1 = P11; /LED位選譯碼地址引腳1sbit ADDR2 = P12; /LED位選譯碼地址引腳2sbit ADDR3 = P13; /LED位選譯碼地址引腳3sbit ENLED = P14; /LED顯示部件的總使能引腳#define LCD12864_DB P0 /1602液晶數據端口sbit LCD12
4、864_RES = P10; /1602液晶指令/數據選擇引腳sbit LCD12864_RW = P11; /1602液晶讀寫引腳sbit LCD12864_EN = P15; /1602液晶使能引腳sbit DS1302_CE = P17; /DS1302片選引腳sbit DS1302_CK = P35; /DS1302通信時鐘引腳sbit DS1302_IO = P34; /DS1302通信數據引腳sbit I2C_SCL = P27; /I2C總線時鐘引腳sbit I2C_SDA = P26; /I2C總線數據引腳sbit BUZZER = P16; /蜂鳴器控制引腳sbit IO_1
5、8B20 = P32; /DS18B20通信引腳sbit IR_INPUT = P33; /紅外接收引腳#include "LCD12864.H"#include "I2C.H"#include "TSL2561.h"#endif/I2C通信協議/#include "config.h"#define I2CDelay() _nop_();_nop_();_nop_();_nop_();/* 產生總線起始信號 */void I2CStart() I2C_SDA = 1; /首先確保SDA、SCL都是高電平 I2C_S
6、CL = 1; I2CDelay(); I2C_SDA = 0; /先拉低SDA I2CDelay(); I2C_SCL = 0; /再拉低SCL/* 產生總線停止信號 */void I2CStop() I2C_SCL = 0; /首先確保SDA、SCL都是低電平 I2C_SDA = 0; I2CDelay(); I2C_SCL = 1; /先拉高SCL I2CDelay(); I2C_SDA = 1; /再拉高SDA I2CDelay();/* I2C總線寫操作,dat-待寫入字節,返回值-從機應答位的值 */bit I2CWrite(unsigned char dat) bit ack;
7、/用于暫存應答位的值 unsigned char mask; /用于探測字節內某一位值的掩碼變量 for (mask=0x80; mask!=0; mask>>=1) /從高位到低位依次進行 if (mask&dat) = 0) /該位的值輸出到SDA上 I2C_SDA = 0; else I2C_SDA = 1; I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL,完成一個位周期 I2C_SDA = 1; /8位數據發送完后,主機釋放SDA,以檢測從機應答 I2CDelay(); I2C_SCL
8、 = 1; /拉高SCL ack = I2C_SDA; /讀取此時的SDA值,即為從機的應答值 I2CDelay(); I2C_SCL = 0; /再拉低SCL完成應答位,并保持住總線 return (ack); /應答值取反以符合通常的邏輯: /0=不存在或忙或寫入失敗,1=存在且空閑或寫入成功/* I2C總線讀操作,并發送非應答信號,返回值-讀到的字節 */unsigned char I2CReadNAK() unsigned char mask; unsigned char dat; I2C_SDA = 1; /首先確保主機釋放SDA for (mask=0x80; mask!=0; m
9、ask>>=1) /從高位到低位依次進行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /讀取SDA的值 dat &= mask; /為0時,dat中對應位清零 else dat |= mask; /為1時,dat中對應位置1 I2CDelay(); I2C_SCL = 0; /再拉低SCL,以使從機發送出下一位 I2C_SDA = 1; /8位數據發送完后,拉高SDA,發送非應答信號 I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL完成非應答位
10、,并保持住總線 return dat;/* I2C總線讀操作,并發送應答信號,返回值-讀到的字節 *unsigned char I2CReadACK() unsigned char mask; unsigned char dat; I2C_SDA = 1; /首先確保主機釋放SDA for (mask=0x80; mask!=0; mask>>=1) /從高位到低位依次進行 I2CDelay(); I2C_SCL = 1; /拉高SCL if(I2C_SDA = 0) /讀取SDA的值 dat &= mask; /為0時,dat中對應位清零 else dat |= mask
11、; /為1時,dat中對應位置1 I2CDelay(); I2C_SCL = 0; /再拉低SCL,以使從機發送出下一位 I2C_SDA = 0; /8位數據發送完后,拉低SDA,發送應答信號 I2CDelay(); I2C_SCL = 1; /拉高SCL I2CDelay(); I2C_SCL = 0; /再拉低SCL完成應答位,并保持住總線 return dat; */LCD12864顯示/#include "config.h"u8 zhbuf="預覽" /中文數組u8 ehbuf="yulan" /英文字符數組u8 code i
12、mbuf= /圖片碼128*64 寬16,高320x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,;/*寫等待*/void Write_Ready()u8 sta=0;LCD12864_RES = 0;LCD12864_RW = 1;doLCD12864_EN = 1;sta = P0;LCD12864_EN = 0;while(sta&0x80);/*讀RAM中數據*/u8 Read_12864_RAM()u8 ram=0;LCD12864_RES = 1;LCD12864_
13、RW = 1;LCD12864_EN = 1;ram = P0;LCD12864_EN = 0;return ram;/*寫指令*/void Write_12864_Cmd(u8 cmd)Write_Ready();LCD12864_RES = 0;LCD12864_RW = 0;P0 = cmd;LCD12864_EN = 1;LCD12864_EN = 0;/*寫數據*/void Write_12864_Dat(u8 dat)Write_Ready();LCD12864_RES = 1;LCD12864_RW = 0;P0 = dat;LCD12864_EN = 1;LCD12864_EN
14、 = 0;/*設置起始坐標*/void Set_DDRAM_XY(u8 x,u8 y)if(x>=7)x=7;if(y>=3)y=3;switch(y)case 0:Write_12864_Cmd(0x80+x);break;case 1:Write_12864_Cmd(0x90+x);break;case 2:Write_12864_Cmd(0x88+x);break;case 3:Write_12864_Cmd(0x98+x);break;default : break;/*顯示連續的2個字符*/void Show_Double_12864_Char(u8 x,u8 y,u8
15、*c)Set_DDRAM_XY(x,y);Write_12864_Dat(*c);Write_12864_Dat(*(c+1); /*顯示單個字符*/void Show_Single_12864_Char(u8 x,u8 y,u8 *c)Set_DDRAM_XY(x,y);Write_12864_Dat(*c); /*顯示中文字符串*/void Show_12864_ZH(u8 x,u8 y,u8 *zh)u8* p=zh;Set_DDRAM_XY(x,y);while(*p)!='0')Write_12864_Dat(*p+);/*顯示一串數值*/*u8 dec 小數位 為0
16、不顯示小數*/void Show_12864_NUM(u8 x,u8 y,u8 dec,u16 num)u8 i;u8 numbuf6;for(i=0;num;i+)numbufi=num%10+'0'num/=10;Set_DDRAM_XY(x,y);for(;i;i-)if(i=dec)Write_12864_Dat(0X2E); /顯示小數點Write_12864_Dat(*(numbuf+(i-1); /顯示數值/*顯示英文字符串*/void Show_12864_EH(u8 x,u8 y,u8 *eh)u8* p=eh;Set_DDRAM_XY(x,y);while(
17、*p)!='0')Write_12864_Dat(*p+);/*顯示圖案*/void Show_12864_IM(u8 code *im)unsigned char x,y,i;unsigned int tmp=0;for(i=0;i<9;) /分兩屏,上半屏和下半屏,因為起始地址不同,需要分開for(x=0;x<32;x+) /32行Write_12864_Cmd(0x34);Write_12864_Cmd(0x80+x);/列地址Write_12864_Cmd(0x80+i);/行地址,下半屏,即第三行地址0X88Write_12864_Cmd(0x30);fo
18、r(y=0;y<16;y+)Write_12864_Dat(imtmp+y);/讀取數據寫入LCDtmp+=16;i+=8;Write_12864_Cmd(0x36);/擴充功能設定Write_12864_Cmd(0x30); /*初始化12864*/void Init_Lcd12864()Read_12864_RAM();Show_Single_12864_Char(0,0,'A');Show_Double_12864_Char(0,0,"AB");Show_12864_NUM(0,0,1,123);Show_12864_ZH(0,0,"預
19、覽");Show_12864_EH(0,0,"yulan");Show_12864_IM(imbuf); Write_12864_Cmd(0X30);/8位數據,基本指令 Write_12864_Cmd(0X0C);/開顯示,關游標 Write_12864_Cmd(0X01);/清屏 Write_12864_Cmd(0X02);/地址歸位 Write_12864_Cmd(0X80);/設置DDRAM地址/TSL2561代碼/#include "config.h"/*初始化TSL2561*/void Init_TSL2561()TSL2561_W
20、rite(0X80|TSL2561_CONTROL,0x03); /選擇控制寄存器/工作模式TSL2561_Write(0X80|TSL2561_TIME,0x01); /選擇轉換時間控制寄存器/*讀TSL2561寄存器中的數據,addr是寄存器地址*/u8 TSL2561_Read(u8 addr)u8 lx=0;I2CStart();I2CWrite(TSL2561_WR); /選擇TSL2561I2CWrite(0X80|addr); /選擇寄存器I2CStart();I2CWrite(TSL2561_RD);lx=I2CReadNAK(); /讀取寄存器中的值I2CStop();ret
21、urn lx;/*寫TSL2561命令或數據,addr是寄存器地址*/void TSL2561_Write(u8 addr,u8 cmd)I2CStart();I2CWrite(TSL2561_WR); /選擇TSL2561寫操作I2CWrite(0X80|addr); /選擇寄存器I2CWrite(cmd); /寫入命令或數據I2CStop();/*讀取光強*/u16 TSL_Read_LX()u8 lxl=0,lxh=0,lxp=0;double lx=0;u16 ch0=0,ch1=0;lxl=TSL2561_Read(TSL2561_DATA0_L);lxh=TSL2561_Read(TSL2561_DATA0_H);ch0=lxh*256+lxl;lxh=0,lxl=0;lxl=TSL2561_Read(TSL2561_DATA1_L);lxh=TSL2561_Read(TSL2561_DATA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司沉浸式展廳策劃方案
- 公司組織轟趴活動方案
- 公司文化圈策劃方案
- 公司月刊創刊策劃方案
- 公司歡迎儀式活動方案
- 公司老干部活動方案
- 公司激情文化活動方案
- 公司來新人了活動方案
- 公司匯演暖場活動方案
- 公司旅游年會策劃方案
- AI賦能與素養導向:初中英語智慧課堂的融合實踐研究
- 《2025年危險化學品企業安全生產執法檢查重點事項指導目錄》解讀與培訓
- 2025全國交通運輸行業職業技能競賽學生組技術方案
- 常用儀表使用方法鐵道信號綜合實訓課件
- 2025云南黃金礦業集團股份限公司招聘114人易考易錯模擬試題(共500題)試卷后附參考答案
- 預防職務犯罪交流課件
- 2025年初一下冊語文-課內現代文復習18課.《井岡翠竹》(教師版)
- 人工智能應用產業園及配套基礎設施項目可行性研究報告(范文模板)
- 未成年人權益保護法律解析
- 藥品售后服務承諾書示例
- 2025年南模中學自招試題及答案
評論
0/150
提交評論