時(shí)間:2011年3月26號(hào)
芯片:STC12C5A60S2, 當(dāng)采用stc89c52這類標(biāo)準(zhǔn)速度單片機(jī)的時(shí)候需要修改程序中的延時(shí)值
時(shí)鐘芯片:DS1302
溫度傳感器:18B20
TFT彩屏:320X240 26萬(wàn)色 8位數(shù)據(jù) 不帶觸摸 控制器-ILI9325
功能:只是簡(jiǎn)單的時(shí)間和溫度顯示,適合初學(xué)者學(xué)習(xí)彩屏顯示。
以上是本程序在51hei-5單片機(jī)開(kāi)發(fā)板上的顯示效果,2.4寸的tft手機(jī)彩屏是直接插入板子12864接口的,要注意12864是20pin ,而我們生產(chǎn)的彩屏是18pin的,第一pin對(duì)第一pin故左邊會(huì)多出2個(gè)腳,大家千萬(wàn)不要插錯(cuò)位了不然會(huì)燒毀的,由于篇幅有限以下僅僅列出主程序本程序完整代碼及hex文件下載:http://www.torrancerestoration.com/f/caip11.rar
主函數(shù): #include "STC.h" #include"18B20.h" #include"ILI9325.h" //#include"anjian.h" #include"1302.h" //======定義彩屏顯示的顏色,可以不定義,直接寫入16進(jìn)制代碼========// //0xF800 //紅 //0x07E0 //綠 //0x001F //藍(lán) //0xFFE0 //黃 //0x0000 //黑 //0xFFFF //白 //0xF81F //紫紅色 //0x7FFF //青色 //0x051F //青藍(lán) //====================主函數(shù)=========================// void main(void) { CS=1; delayms(10); RES=0; delayms(10); RES=1; delayms(10); ILI9325_Initial(); //彩屏初始化 ClearScreen(0x001F); //清屏 while(1) { LCD_PutString(10+0, 10+40, "溫度", 0xFFE0,0x001F); LCD_PutChar (10+60,10+40, '.', 0xFFE0,0x001F); LCD_PutString(10+85,10+40, "℃", 0xFFFF,0x001F); LCD_PutString(10+0, 10, "時(shí)間", 0xFFE0,0x001F); LCD_PutString(10+0, 10+20, "日期", 0xFFE0,0x001F); Write_DS1302Init(); Run_DS1302(); //經(jīng)過(guò)調(diào)試,必須將溫度程序加入1302程序中,才能正常測(cè)溫。 // if((a==qian)&&(b==bai)&&(c==shi)&&(d==ge)&&(miao2<1)) { bi(500); } //設(shè)定報(bào)警,響10秒鐘結(jié)束。 } } 時(shí)鐘程序: #include "STC.h" #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit T_CLK = P1^6; /*實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 */ sbit T_IO = P3^5; /*實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 */ sbit T_RST = P1^7; /*實(shí)時(shí)時(shí)鐘復(fù)位線引腳 */ sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; /******************************************************************** * 名稱 : v_RTInputByte() * 功能 : 往DS1302寫入1Byte數(shù)據(jù) * 輸入 : ucDa 寫入的數(shù)據(jù) * 輸出 : 無(wú) ***********************************************************************/ void v_RTInputByte(uchar ucDa) { uchar i; ACC = ucDa; T_RST = 1; for(i=8; i>0; i--) { T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************************************************** * 名稱 : uc_RTOutputByte() * 功能 : 從DS1302讀取1Byte數(shù)據(jù) * 輸入 : 無(wú) * 返回值: ACC ***********************************************************************/ uchar uc_RTOutputByte(void) { uchar i; T_RST = 1; for(i=8; i>0; i--) { ACC = ACC >>1; T_IO=1; ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /******************************************************************** * 名稱 : v_W1302(uchar ucAddr, uchar ucDa) * 功能 : 往DS1302寫入數(shù)據(jù) * 輸入 : ucAddr: DS1302地址, ucDa: 要寫的數(shù)據(jù) * 返回值 : 無(wú) ***********************************************************************/ void v_W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); // 寫地址 _nop_(); _nop_(); v_RTInputByte(ucDa); // 寫1Byte數(shù)據(jù) T_CLK = 1; T_RST = 0; } /******************************************************************** * 名稱 : uc_R1302(uchar ucAddr) * 功能 : 讀取DS1302某地址的數(shù)據(jù) * 輸入 : ucAddr: DS1302地址 * 返回值 : ucDa :讀取的數(shù)據(jù) ***********************************************************************/ uchar uc_R1302(uchar ucAddr) { uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); //寫地址,命令 _nop_(); _nop_(); ucDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù) T_CLK = 1; T_RST = 0; return(ucDa); } /******************************************************************** * 名稱 : v_BurstW1302T * 功能 : 往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式) * 輸入 : pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 控制 * 8Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B 1B * 返回值 : 無(wú) ***********************************************************************/ void v_BurstW1302T(uchar *pSecDa) { uchar i; v_W1302(0x8e, 0x00); //控制命令,WP=0,寫操作 T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbe); //0xbe:時(shí)鐘多字節(jié)寫命令 for(i=8; i>0; i--) //8Byte = 7Byte 時(shí)鐘數(shù)據(jù) + 1Byte 控制 { v_RTInputByte(*pSecDa); //寫1Byte數(shù)據(jù) pSecDa++; } T_CLK = 1; T_RST = 0; } /******************************************************************** * 名稱 : v_BurstR1302T(uchar *pSecDa) * 功能 : 讀取DS1302時(shí)鐘數(shù)據(jù) * 輸入 : pSecDa: 時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值 : ucDa :讀取的數(shù)據(jù) ***********************************************************************/ void v_BurstR1302T(uchar *pSecDa) { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbf); //0xbf:時(shí)鐘多字節(jié)讀命令 for(i=8; i>0; i--) { *pSecDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù) pSecDa++; } T_CLK = 1; T_RST = 0; } /******************************************************************** * 名稱 : v_BurstW1302R(uchar *pReDa) * 功能 : 往DS1302寄存器數(shù)寫入數(shù)據(jù)(多字節(jié)方式) * 輸入 : pReDa: 寄存器數(shù)據(jù)地址 * 返回值 : 無(wú) ***********************************************************************/ void v_BurstW1302R(uchar *pReDa) { uchar i; v_W1302(0x8e,0x00); //控制命令,WP=0,寫操作 T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xfe); //0xbe:時(shí)鐘多字節(jié)寫命令 for(i=31; i>0; i--) //31Byte 寄存器數(shù)據(jù) { v_RTInputByte(*pReDa); //寫1Byte數(shù)據(jù) pReDa++; } T_CLK = 1; T_RST = 0; } /******************************************************************** * 名稱 : v_BurstR1302R(uchar *pReDa) * 功能 : 讀取DS1302寄存器數(shù)據(jù) * 輸入 : pReDa: 寄存器數(shù)據(jù)地址 * 返回值 : 無(wú) ***********************************************************************/ void v_BurstR1302R(uchar *pReDa) { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xff); //0xbf:時(shí)鐘多字節(jié)讀命令 for(i=31; i>0; i--) //31Byte 寄存器數(shù)據(jù) { *pReDa = uc_RTOutputByte(); //讀1Byte數(shù)據(jù) pReDa++; } T_CLK = 1; T_RST = 0; } /******************************************************************** * 名稱 : v_Set1302(uchar *pSecDa) * 功能 : 設(shè)置初始時(shí)間 * 輸入 : pSecDa: 初始時(shí)間地址。初始時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值: 無(wú) ***********************************************************************/ 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); // 秒 分 時(shí) 日 月 星期 年 pSecDa++; ucAddr += 2; } v_W1302(0x8e, 0x80); //控制命令,WP=1,寫保護(hù) } /******************************************************************** * 名稱 : v_Get1302(uchar ucCurtime[]) * 功能 : 讀取DS1302當(dāng)前時(shí)間 * 輸入 : ucCurtime: 保存當(dāng)前時(shí)間地址。當(dāng)前時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年 * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B * 返回值 : 無(wú) ***********************************************************************/ void v_Get1302(uchar ucCurtime[]) { uchar i; uchar ucAddr = 0x81; for(i=0; i<7; i++) { ucCurtime[i] = uc_R1302(ucAddr); //格式為: 秒 分 時(shí) 日 月 星期 年 ucAddr += 2; } } /******************************************************************** * 名稱 : dectobcd(uchar dec) * 功能 : DEC碼轉(zhuǎn)換為BCD碼 * 輸入 : dec碼 * 輸出 : bcd碼 ***********************************************************************/ uchar dectobcd(uchar dec) { uchar bcd; bcd = 0; while(dec >= 10) { dec -= 10; bcd++; } bcd <<= 4; bcd |= dec; return bcd; } /******************************************************************** * 名稱 : bcdtodec(uchar bcd) * 功能 : BCD碼轉(zhuǎn)換為DEC碼 * 輸入 : bcd碼 * 輸出 : dec碼 ***********************************************************************/ uchar bcdtodec(uchar bcd) { uchar data1; data1 = bcd & 0x0f; //取BCD低4位 bcd = bcd & 0x70; //剔除BCD的最高位和低4位。 data1 += bcd >> 1; data1 += bcd >> 3; //用位移代替乘法運(yùn)算 return data1; } /******************************************************************** * 名稱 : Write_DS1302Init() * 功能 : 往DS1302中寫入數(shù)據(jù)。最開(kāi)始顯示的數(shù)據(jù)就是在這里設(shè)置的。 * 輸入 : 無(wú) * 輸出 : 無(wú) ***********************************************************************/ void Write_DS1302Init(void) { v_W1302(0x8e,0); v_W1302(0x80,0x50); //寫入秒 v_W1302(0x8e,0); v_W1302(0x82,0x59); //寫入分 v_W1302(0x8e,0); v_W1302(0x84,0x07); //寫入小時(shí) v_W1302(0x8e,0); v_W1302(0x86,0x08); //寫入日 v_W1302(0x8e,0); v_W1302(0x88,0x08); //寫入月 v_W1302(0x8e,0); v_W1302(0x8a,0x05); //寫入星期 v_W1302(0x8e,0); v_W1302(0x8c,0x08); //寫入年 } /******************************************************************** * 名稱 : Run_DS1302(void) * 功能 : 讀出DS1302中的數(shù)據(jù),并在液晶1602上進(jìn)行顯示 * 輸入 : 無(wú) * 輸出 : 無(wú) ***********************************************************************/ void Run_DS1302(void) { uchar sec, min, hour, day, month, year; while(1) { v_W1302(0x8f, 0); sec = bcdtodec(uc_R1302(0x81)); //讀出DS1302中的秒 v_W1302(0x8f, 0); min = bcdtodec(uc_R1302(0x83)); //讀出DS1302中的分 v_W1302(0x8f, 0); hour = bcdtodec(uc_R1302(0x85)); //讀出DS1302中的小時(shí) v_W1302(0x8f, 0); day = bcdtodec(uc_R1302(0x87)); //讀出DS1302中的日 v_W1302(0x8f, 0); month = bcdtodec(uc_R1302(0x89)); //讀出DS1302中的月 v_W1302(0x8f, 0); year = bcdtodec(uc_R1302(0x8d)); //讀出DS1302中的年 LCD_PutChar (10+40, 10, hour/10%10 +'0', 0xFFE0,0x001F); // LCD_PutChar (10+50, 10, hour%10 +'0', 0xFFE0,0x001F); //顯示DS1302中的時(shí) LCD_PutChar (10+60, 10, ':', 0xFFE0,0x001F); LCD_PutChar (10+70, 10, min/10%10 +'0', 0xFFE0,0x001F); // LCD_PutChar (10+80, 10, min%10 +'0', 0xFFE0,0x001F); //顯示DS1302中的分 LCD_PutChar (10+90, 10, ':', 0xFFE0,0x001F); LCD_PutChar (10+100, 10, sec/10%10 +'0', 0xFFE0,0x001F); // LCD_PutChar (10+110, 10, sec%10 +'0', 0xFFE0,0x001F); //顯示DS1302中的秒 LCD_PutChar (10+40, 10+20, +'2', 0xFFE0,0x001F); //獨(dú)立顯示年 LCD_PutChar (10+50, 10+20, +'0', 0xFFE0,0x001F); //獨(dú)立顯示年 LCD_PutChar (10+60, 10+20, year/10%10 +'0', 0xFFE0,0x001F); // LCD_PutChar (10+70, 10+20, year%10 +'0', 0xFFE0,0x001F); //顯示DS1302中的年 LCD_PutChar (10+80, 10+20, ':', 0xFFE0,0x001F); LCD_PutChar (10+90, 10+20, month/10%10 +'0', 0xFFE0,0x001F); // LCD_PutChar (10+100, 10+20, month%10 +'0', 0xFFE0,0x001F); //顯示DS1302中的月 LCD_PutChar (10+110, 10+20, ':', 0xFFE0,0x001F); LCD_PutChar (10+120, 10+20, day/10%10 +'0', 0xFFE0,0x001F); // LCD_PutChar (10+130, 10+20, day%10 +'0', 0xFFE0,0x001F); //顯示DS1302中的日 ReadTemperature(); //讀取溫度轉(zhuǎn)換后的值 LCD_PutChar (10+40,10+40, temp/10+'0', 0xFFE0,0x001F); //顯示溫度十位 LCD_PutChar (10+50,10+40, temp%10+'0', 0xFFE0,0x001F); //顯示溫度個(gè)位 LCD_PutChar (10+70,10+40, xs%10+'0', 0xFFE0,0x001F); //顯示溫度小數(shù)位 } }