51hei開發(fā)板+手機TFT彩屏+1302時鐘+溫度
時間:2011年3月26號
芯片:STC12C5A60S2, 當采用stc89c52這類標準速度單片機的時候需要修改程序中的延時值
時鐘芯片:DS1302
溫度傳感器:18B20
TFT彩屏:320X240 26萬色 8位數(shù)據(jù) 不帶觸摸控制器-ILI9325
功能:只是簡單的時間和溫度顯示,適合初學者學習彩屏顯示。
以上是本程序在51hei-5單片機開發(fā)板上的顯示效果,2.4寸的tft手機彩屏是直接插入板子12864接口的,要注意12864是20pin ,而我們生產(chǎn)的彩屏是18pin的,第一pin對第一pin故左邊會多出2個腳,大家千萬不要插錯位了不然會燒毀的,由于篇幅有限以下僅僅列出主程序本程序完整代碼及hex文件下載:http://www.51hei.com/f/caip11.rar
主函數(shù):#include "STC.h"#include"18B20.h"#include"ILI9325.h"http://#include"anjian.h"#include"1302.h"http://======定義彩屏顯示的顏色,可以不定義,直接寫入16進制代碼========////0xF800 //紅//0x07E0 //綠//0x001F //藍//0xFFE0 //黃//0x0000 //黑//0xFFFF //白//0xF81F //紫紅色//0x7FFF //青色//0x051F //青藍//====================主函數(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, "時間", 0xFFE0,0x001F);LCD_PutString(10+0, 10+20, "日期", 0xFFE0,0x001F);Write_DS1302Init(); Run_DS1302(); //經(jīng)過調(diào)試,必須將溫度程序加入1302程序中,才能正常測溫。 // if((a==qian)(b==bai)(c==shi)(d==ge)(miao21)) { bi(500); } //設(shè)定報警,響10秒鐘結(jié)束。 } } 時鐘程序:#include "STC.h"#includeintrins.h>#define uchar unsigned char#define uint unsigned intsbit T_CLK = P1^6; /*實時時鐘時鐘線引腳 */sbit T_IO = P3^5; /*實時時鐘數(shù)據(jù)線引腳 */sbit T_RST = P1^7; /*實時時鐘復位線引腳 */sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;/********************************************************************* 名稱 : v_RTInputByte()* 功能 : 往DS1302寫入1Byte數(shù)據(jù)* 輸入 : ucDa 寫入的數(shù)據(jù)* 輸出 : 無***********************************************************************/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ù)* 輸入 : 無* 返回值: 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ù)* 返回值 : 無***********************************************************************/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ù)據(jù)(多字節(jié)方式)* 輸入 : pSecDa: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年 控制* 8Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B 1B* 返回值 : 無***********************************************************************/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:時鐘多字節(jié)寫命令for(i=8; i>0; i--) //8Byte = 7Byte 時鐘數(shù)據(jù) + 1Byte 控制{v_RTInputByte(*pSecDa); //寫1Byte數(shù)據(jù)pSecDa++;}T_CLK = 1;T_RST = 0;}/********************************************************************* 名稱 : v_BurstR1302T(uchar *pSecDa)* 功能 : 讀取DS1302時鐘數(shù)據(jù)* 輸入 : pSecDa: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年* 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:時鐘多字節(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ù)地址* 返回值 : 無***********************************************************************/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:時鐘多字節(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ù)地址* 返回值 : 無***********************************************************************/void v_BurstR1302R(uchar *pReDa){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xff); //0xbf:時鐘多字節(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è)置初始時間* 輸入 : pSecDa: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年* 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B* 返回值: 無***********************************************************************/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); // 秒 分 時 日 月 星期 年pSecDa++;ucAddr += 2;}v_W1302(0x8e, 0x80); //控制命令,WP=1,寫保護}/********************************************************************* 名稱 : v_Get1302(uchar ucCurtime[])* 功能 : 讀取DS1302當前時間* 輸入 : ucCurtime: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年* 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B* 返回值 : 無***********************************************************************/void v_Get1302(uchar ucCurtime[]){uchar i;uchar ucAddr = 0x81;for(i=0; i7; i++){ucCurtime[i] = uc_R1302(ucAddr); //格式為: 秒 分 時 日 月 星期 年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; //用位移代替乘法運算return data1;}/********************************************************************* 名稱 : Write_DS1302Init()* 功能 : 往DS1302中寫入數(shù)據(jù)。最開始顯示的數(shù)據(jù)就是在這里設(shè)置的。* 輸入 : 無* 輸出 : 無***********************************************************************/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); //寫入小時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上進行顯示* 輸入 : 無* 輸出 : 無***********************************************************************/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中的小時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中的時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); //獨立顯示年LCD_PutChar (10+50, 10+20, +'0', 0xFFE0,0x001F); //獨立顯示年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); //顯示溫度個位LCD_PutChar (10+70,10+40, xs%10+'0', 0xFFE0,0x001F); //顯示溫度小數(shù)位} }
評論