程序視頻:自制鐘表
#include "S3C2440addr.h"
#include "math.h"
#define pi 3.141593
U16 SEC, MIN, HOUR, TmpSEC_10, TmpMIN_10, TmpHOUR_10,TmpSEC_1,TmpMIN_1,TmpHOUR_1;
U16 SEC_x, SEC_y, MIN_x, MIN_y, HOUR_x, HOUR_y, OldMIN=10000;
U16 PandColor_big[30][30];
U16 PandColor_sml[30][30];
extern U16 Flag;
extern U16 fz;
extern const unsigned char gImage_goback[7442];
extern const unsigned char gImage_yy[147968];
extern const unsigned char gImage_back[261120];
void DiyClk(void)
{
U16 k;
LCD_Img(gImage_back); //畫背景圖片
Paint_Clock(52,0,272,272,gImage_yy); //畫鐘表面板
Paint_Bmp_Rnd(200,95,61,61,2,30,gImage_goback);//畫返回圖標(右下角)
ReadPand( 347, 135, 5, 1 );//讀以點(347,135)為圓心 5 為半徑的
//像素點的信息,存入數組PandColor_big中
ReadPand( 311, 56, 5, 0 ); //讀以點(347,135)為圓心 5 為半徑的
//像素點的信息,存入數組PandColor_sml中
fz = 1 ;
while(Flag == 1) //Flag == 1表示進入時針子程序
{
//////////////////////////////////////////////////////////////
TmpSEC_1 = rBCDSEC & 0x0f;
TmpSEC_10 = rBCDSEC >> 4;
TmpMIN_1 = rBCDMIN & 0x0f;
TmpMIN_10 = rBCDMIN >> 4;
TmpHOUR_1 = rBCDHOUR & 0x0f;
TmpHOUR_10 = rBCDHOUR >> 4;
TmpHOUR_10 &= 0x0003;
SEC = (TmpSEC_10*10 + TmpSEC_1);
MIN = (TmpMIN_10*10 + TmpMIN_1);
HOUR = (TmpHOUR_10*10 + TmpHOUR_1);//把時間處理成常見的int
//變量形式,方便計算轉角
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
SEC_x = 240 + (int)(107*sin(pi*SEC/30.0));
SEC_y = 135 - (int)(107*cos(pi*SEC/30.0));
MIN_x = 240 + (int)(90*sin(pi*MIN/30.0));
MIN_y = 135 - (int)(90*cos(pi*MIN/30.0));//把角度轉化為坐標
HOUR_x = 240 + (int)(60*sin(pi*(30*HOUR+MIN/2)/180));
HOUR_y = 135 - (int)(60*cos(pi*(30*HOUR+MIN/2)/180));
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
if ( MIN != OldMIN ) //每分鐘刷新一次鐘面
{
Paint_Clock(52,0,272,272,gImage_yy); //顯示表盤圖片
heavyLine( MIN_x, MIN_y,0x3e0); //分針的位置和著色
heavyLine( HOUR_x, HOUR_y,0x01f); //時針的位置和著色
Pand(240,135,8,0x9871); //鐘的中心位置顯示一個
//半徑為8 著色為0x9871
//的小圓斑
}
///////////////////////////////////////////////////////////////
RedPix( SEC_x, SEC_y ); //秒,在對應位置打點
if ( SEC % 5 == 0 )
WritePand( SEC_x, SEC_y, 5 ,0 );//將數組PandColor_big中的像素信息寫入
//以(SEC_x,SEC_y)為圓心5 為半徑的顯示
//緩沖區內
else
WritePand( SEC_x, SEC_y, 5 ,1 );//將數組PandColor_sml中的像素信息寫入
//以(SEC_x,SEC_y)為圓心5 為半徑的顯示
//緩沖區內
OldMIN = MIN ;
///////////////////////////////////////////////////////////////////
}
OldMIN = 10000;
fz = 0 ;
}
|