📄 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 + -