?? 12864指針式時鐘.txt
字號:
else
{
if(tx>xe&&ty>ye)
{
xe=tx-xe;
ye=ty-ye;
}
}
}
}
if(xe>ye)
dist=xe;
else
dist=ye;
xerr=yerr=0;
for(t=0;t<=dist;t++)
{
xerr=xerr+xe;
yerr=yerr+ye;
if(xerr>dist)
{
xerr=xerr-dist;
if(incx>1)
tx++;
if(incx<1)
tx--;
}
if(yerr>dist)
{
yerr=yerr-dist;
if(incy>1)
ty++;
if(incy<1)
ty--;
}
LCM12864_dot(tx,ty,mode);
}
LCM12864_dot(tx+1,ty,1); //清除畫線后最后一點的右邊一點.
}
/****************************************************************************
函 數 名:box()
功 能:畫框
說 明:邊框:mode=0:畫 1:清 2:反顯
填充:tc=0 填充黑色.1:清除填充.2:框內反顯.3:不填充
入口參數:sx,sy,ex,ey,mode
sx,sy:左上角坐標.ex,ey:右下角坐標
返 回 值:無
*****************************************************************************/
void box(unsigned char sx,unsigned char sy,unsigned char ex,unsigned char ey,unsigned char mode,unsigned char tc)
{
unsigned char n;
line(sx,sy,ex,sy,mode);
line(sx,ey,sx,sy,mode);
line(sx,ey,ex,ey,mode);
line(ex,ey,ex,sy,mode);
if(tc!=3)
{
for(n=sy;n<ey;n++)
line(sx+1,n,ex-1,n,tc);
}
}
/****************************************************************************
函 數 名:circle()
功 能:畫圓
說 明:flay=0:畫 1:清 2:反顯
入口參數:xxx,yyy,Rx,flay
xxx,yyy:圓點坐標.Rx:半徑
返 回 值:無
*****************************************************************************/
void circle(unsigned char xxx,unsigned char yyy,unsigned char Rx,unsigned char flag)
{
unsigned int xx,rr,xt,yt,rs,col,row;
yt=Rx;
rr=Rx*Rx+1; //補償 1 修正方形
rs=(yt+(yt>>1))>>1; //(*0.75)分開1/8 圓弧來畫
for(xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while((yt*yt)>(rr-xx))yt--;
col=xxx+xt; //第一象限
row=yyy-yt;
LCM12864_dot(col,row,flag);
col=xxx-xt; //第二象限
LCM12864_dot(col,row,flag);
row=yyy+yt; //第三象限
LCM12864_dot(col,row,flag);
col=xxx+xt; //第四象限
LCM12864_dot(col,row,flag);
/***************45 度鏡象畫另一半***************/
col=xxx+yt; //第一象限
row=yyy-xt;
LCM12864_dot(col,row,flag);
col=xxx-yt; //第二象限
LCM12864_dot(col,row,flag);
row=yyy+xt; //第三象限
LCM12864_dot(col,row,flag);
col=xxx+yt; //第四象限
LCM12864_dot(col,row,flag);
}
}
//********************************************************************************************
//LCM12864初始化 LCM12864_Init()
//
//*********************************************************************************************/
void LCM12864_Init(void)
{
CBI_RST; //復位
_delay_us(2000);
SBI_RST;
_delay_us(2000);
LCM12864_Clear_Screen(); //清除屏幕
CBI_CS1; CBI_CS2; //選中雙屏
LCM12864_WriteCMD(LCM12864_DISP_OFF); //關顯示
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+0); //第0頁位置
LCM12864_WriteCMD(LCM12864_START_ROW+0); //第0行
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0); //第0列
LCM12864_WriteCMD(LCM12864_DISP_ON); //開顯示
}
void LCM12864_disp(void)
{
unsigned int i;
unsigned char data;
SBI_CS1; CBI_CS2; //右半屏
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+6);
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0);
for(i=yid;i<64+yid;i++)
{
data=disp_ram[(i/16)*32+(i%16)];
LCM12864_WriteData(data);
}
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+7);
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0);
for(i=yid;i<64+yid;i++)
{
data=disp_ram[(i/16)*32+(i%16)+16];
LCM12864_WriteData(data);
}
LCM12864_WriteCMD(LCM12864_START_ROW+0); //第0行
}
/****************************************************************************
函 數 名: LCM12864_analog_rest_data(void)
功 能:移動顯示不變的內容寫入緩存
說 明:板上沒接18B20 溫度值是固定的28.5
入口參數:無
返 回 值:無
*****************************************************************************/
void LCM12864_analog_rest_data(void)
{
unsigned int i,j,t=285; //偽溫度值 t為溫度*10
unsigned char k;
j=32*6;
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+32+k); //"月"
}
j=32*9;
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+32*24+k); //","
}
j=32*13;
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+32*24+k); //","
}
j=32*10;
for(i=j,k=0;i<j+64;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+32*3+k); //"星期"
}
j=32*16;
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+32*9+k); //"℃"
}
///////////////////////////////以下是溫度顯示部分,接18B20后,把下面語句剪切到緩存更新函數里面
j=32*14;
for(i=j,k=0 ;i<j+16;i++,k++) //溫度十位\個位
{
disp_ram[i+(k/8*8)]=pgm_read_byte(shuzi+16*(t/100)+k);
disp_ram[i+(k/8*8)+8]=pgm_read_byte(shuzi+16*(t/10%10)+k);
}
j=32*15;
for(i=j,k=0 ;i<j+16;i++,k++) //溫度小數點和后一位
{
disp_ram[i+(k/8*8)]=pgm_read_byte(shuzi+16*11+k);
disp_ram[i+(k/8*8)+8]=pgm_read_byte(shuzi+16*(t%10)+k);
}
/////////////////////////////////////////以上是溫度顯示部分
}
/****************************************************************************
函 數 名: LCM12864_updata(void)
功 能:移動顯示會改變的內容更新
說 明:無
入口參數:無
返 回 值:無
*****************************************************************************/
void LCM12864_updata(void)
{
unsigned int i,j;
unsigned char k;
j=32*4;
if(month_moon<11) //如 小于10月(即無"月"十位),則不顯示
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=0x00;
}
}
else
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+640+k); //月十位
}
}
j=32*5; //第五位.月個位
if(month_moon==10)
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+640+k); //十月特殊處理
}
}
else
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+(((month_moon%10)+10)*32)+k); //月十位
}
}
j=32*7; //第七位,日十位
if(day_moon<11)
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+(21*32)+k); //日十位"初"
}
}
else
{
if(day_moon<20)
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+(20*32)+k); //日十位 "十"
}
}
else
{
if(day_moon<30)
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+(22*32)+k); //日十位 "廿"
}
}
else
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+(23*32)+k); //日十位 "卅"
}
}
}
} //日十位 完
j=32*8; //第八位,日個位
if((day_moon%10)==0)
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+640+k); //十月特殊處理
}
}
else
{
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+(((day_moon%10)+10)*32)+k); //日個位
}
}
j=32*12; //第十二位,星期
for(i=j,k=0;i<j+32;i++,k++)
{
disp_ram[i]=pgm_read_byte(hanzi+(((week%7)+10)*32)+k); //星期
}
}
/****************************************************************************
函 數 名: updata_time(void)
功 能:把時間裝入數組,方便調整
說 明:無
入口參數:無
返 回 值:無
*****************************************************************************/
void updata_time()
{
inittime[0]=sec;
inittime[1]=min;
inittime[2]=hour;
inittime[3]=day;
inittime[4]=month;
inittime[5]=week;
inittime[6]=year;
}
/****************************************************************************
函 數 名: write_time(void)
功 能:把重新調整后的時間寫入1302
說 明:無
入口參數:無
返 回 值:無
*****************************************************************************/
void write_time()
{
unsigned char i,j;
for(i=0;i<7;i++)
{
j=inittime[i];
inittime[i]=j/10*16+j%10;
}
Set1302(&inittime);
}
/****************************************************************************
函 數 名: key_left(void)
功 能:按鍵左鍵處理
說 明:無
入口參數:無
返 回 值:無
*****************************************************************************/
void key_left()
{
LCM12864_Clear_Screen();
switch(disp_set)
{
case 0: disp_set=3;
break;
case 1: disp_set=3;
break;
case 3: disp_set=10;
two_show=(show*10)+10;
updata_time();
break;
case 10: switch(show)
{
case 0:
case 1: disp_set=3;
two_show=0;
break;
case 4: disp_set=20;
three_show=0;
break;
}
if ( two_show==40 )
{
disp_set=3;
two_show=(two_show-10)/10;
}
break;
case 20: disp_set=10;
three_show=0;
break;
}
}
/****************************************************************************
函 數 名: key_right(void)
功 能:按鍵右鍵處理
說 明:無
入口參數:無
返 回 值:無
*****************************************************************************/
void key_right()
{
LCM12864_Clear_Screen();
switch(disp_set)
{
case 3:
disp_set=0;
show=0;
LCM12864_time_disp_analog();
break;
case 10:switch(show)
{
case 0:
if(two_show<15)
{
two_show++;
}
else
{
two_show=10;
}
break;
case 1:
if(two_show<26)
{
two_show++;
}
else
{
two_show=20;
}
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -