時間:2011年3月26號
芯片:STC12C5A60S2, 當采用stc89c52這類標準速度單片機的時候需要修改程序中的延時值
時鐘芯片:DS1302
溫度傳感器:18B20
TFT彩屏:320X240 26萬色 8位數據 不帶觸摸 控制器-ILI9325
功能:只是簡單的時間和溫度顯示,適合初學者學習彩屏顯示。

以上是本程序在51hei-5單片機開發板上的顯示效果,2.4寸的tft手機彩屏是直接插入板子12864接口的,要注意12864是20pin ,而我們生產的彩屏是18pin的,第一pin對第一pin故左邊會多出2個腳,大家千萬不要插錯位了不然會燒毀的,由于篇幅有限以下僅僅列出主程序本程序完整代碼及hex文件下載:http://m.raoushi.com/f/caip11.rar
主函數:
#include "STC.h"
#include"18B20.h"
#include"ILI9325.h"
//#include"anjian.h"
#include"1302.h"
//======定義彩屏顯示的顏色,可以不定義,直接寫入16進制代碼========//
//0xF800 //紅
//0x07E0 //綠
//0x001F //藍
//0xFFE0 //黃
//0x0000 //黑
//0xFFFF //白
//0xF81F //紫紅色
//0x7FFF //青色
//0x051F //青藍
//====================主函數=========================//
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(); //經過調試,必須將溫度程序加入1302程序中,才能正常測溫。
// if((a==qian)&&(b==bai)&&(c==shi)&&(d==ge)&&(miao2<1)) { bi(500); } //設定報警,響10秒鐘結束。
}
}
時鐘程序:
#include "STC.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit T_CLK = P1^6; /*實時時鐘時鐘線引腳 */
sbit T_IO = P3^5; /*實時時鐘數據線引腳 */
sbit T_RST = P1^7; /*實時時鐘復位線引腳 */
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
/********************************************************************
* 名稱 : v_RTInputByte()
* 功能 : 往DS1302寫入1Byte數據
* 輸入 : ucDa 寫入的數據
* 輸出 : 無
***********************************************************************/
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數據
* 輸入 : 無
* 返回值: 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寫入數據
* 輸入 : ucAddr: DS1302地址, ucDa: 要寫的數據
* 返回值 : 無
***********************************************************************/
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數據
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名稱 : uc_R1302(uchar ucAddr)
* 功能 : 讀取DS1302某地址的數據
* 輸入 : ucAddr: DS1302地址
* 返回值 : ucDa :讀取的數據
***********************************************************************/
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數據
T_CLK = 1;
T_RST = 0;
return(ucDa);
}
/********************************************************************
* 名稱 : v_BurstW1302T
* 功能 : 往DS1302寫入時鐘數據(多字節方式)
* 輸入 : pSecDa: 時鐘數據地址 格式為: 秒 分 時 日 月 星期 年 控制
* 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:時鐘多字節寫命令
for(i=8; i>0; i--) //8Byte = 7Byte 時鐘數據 + 1Byte 控制
{
v_RTInputByte(*pSecDa); //寫1Byte數據
pSecDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名稱 : v_BurstR1302T(uchar *pSecDa)
* 功能 : 讀取DS1302時鐘數據
* 輸入 : pSecDa: 時鐘數據地址 格式為: 秒 分 時 日 月 星期 年
* 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
* 返回值 : ucDa :讀取的數據
***********************************************************************/
void v_BurstR1302T(uchar *pSecDa)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbf); //0xbf:時鐘多字節讀命令
for(i=8; i>0; i--)
{
*pSecDa = uc_RTOutputByte(); //讀1Byte數據
pSecDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名稱 : v_BurstW1302R(uchar *pReDa)
* 功能 : 往DS1302寄存器數寫入數據(多字節方式)
* 輸入 : pReDa: 寄存器數據地址
* 返回值 : 無
***********************************************************************/
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:時鐘多字節寫命令
for(i=31; i>0; i--) //31Byte 寄存器數據
{
v_RTInputByte(*pReDa); //寫1Byte數據
pReDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名稱 : v_BurstR1302R(uchar *pReDa)
* 功能 : 讀取DS1302寄存器數據
* 輸入 : pReDa: 寄存器數據地址
* 返回值 : 無
***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xff); //0xbf:時鐘多字節讀命令
for(i=31; i>0; i--) //31Byte 寄存器數據
{
*pReDa = uc_RTOutputByte(); //讀1Byte數據
pReDa++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
* 名稱 : v_Set1302(uchar *pSecDa)
* 功能 : 設置初始時間
* 輸入 : 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; i<7; i++)
{
ucCurtime[i] = uc_R1302(ucAddr); //格式為: 秒 分 時 日 月 星期 年
ucAddr += 2;
}
}
/********************************************************************
* 名稱 : dectobcd(uchar dec)
* 功能 : DEC碼轉換為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碼轉換為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中寫入數據。最開始顯示的數據就是在這里設置的。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
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中的數據,并在液晶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(); //讀取溫度轉換后的值
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); //顯示溫度小數位
}
}
