📄 drawing_line.c
字号:
/*
designed by tp,10,13,2007,If you have any ideal please contact me,
I am glad to discuss with you!
*/
#include<reg51.h>
#include<drive_functions.h>
uchar timer,second,minute=18,hour=8,day=15,month=2,count,key,weekday;
uint year=2007;
bit flag,add_flag,sub_flag,flag_day,flag_sec;
uchar temp[8]={0,0,10,0,0,10,0,0};
uchar temp1[8]={0,0,11,0,1,11,0,1};
uchar mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
uchar code number[]=
{
/*-- 文字: 0 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,
/*-- 文字: 1 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x20,0x30,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x60,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x20,0x00,
/*-- 文字: 3 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x30,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x18,0x20,0x20,0x21,0x21,0x1E,0x00,
/*-- 文字: 4 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x06,0x05,0x04,0x04,0x04,0x3F,0x04,
/*-- 文字: 5 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xF8,0x48,0x48,0x48,0x48,0x88,0x00,0x00,0x18,0x20,0x20,0x20,0x20,0x1F,0x00,
/*-- 文字: 6 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x88,0x30,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,
/*-- 文字: 7 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x08,0x08,0x08,0x08,0xC8,0x38,0x00,0x00,0x00,0x00,0x30,0x0E,0x01,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x60,0x90,0x08,0x08,0x08,0x90,0x60,0x00,0x0C,0x12,0x21,0x21,0x21,0x12,0x0C,
/*-- 文字: 9 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x19,0x22,0x22,0x22,0x11,0x0F,0x00,
/*-- 文字: : --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
/*-- 文字: - --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,
/*-- 文字: --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
uchar code hanzi[]=
{
/*-- 文字: 星 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x7E,0xFE,0xD6,0x56,0x56,0xD6,0xD6,0x56,0x56,0x7E,0x7E,0x00,0x00,0x00,
0x00,0x66,0x67,0x6B,0x6B,0x6B,0x6B,0x7F,0x7F,0x6B,0x6B,0x6B,0x6B,0x60,0x60,0x00,
/*-- 文字: 期 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x0C,0xFF,0xFF,0xAC,0xFF,0xFF,0x0C,0xFE,0xFE,0x66,0x66,0xFE,0xFE,0x00,0x00,
0x26,0x36,0x1F,0x07,0x06,0x1F,0x57,0x66,0x3F,0x1F,0x03,0x63,0x7F,0x3F,0x00,0x00,
};
uchar code xingqi[]=
{
/*-- 文字: 六 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x60,0x60,0x60,0x60,0x60,0x62,0x6E,0x6C,0x60,0x60,0x60,0x60,0x60,0x60,0x00,
0x00,0x20,0x30,0x1C,0x0E,0x03,0x00,0x00,0x00,0x01,0x03,0x0E,0x38,0x30,0x00,0x00,
/*-- 文字: 日 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xFF,0xFF,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0x7F,0x30,0x30,0x30,0x30,0x30,0x30,0x7F,0x7F,0x00,0x00,0x00,
/*-- 文字: 一 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 二 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00,0x00,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,
/*-- 文字: 三 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x0C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x0C,0x00,0x00,0x00,
0x00,0x30,0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x30,0x30,0x00,0x00,
/*-- 文字: 四 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xFE,0xFE,0x06,0x06,0xFE,0xFE,0x06,0xFE,0xFE,0x06,0x06,0xFE,0xFE,0x00,0x00,
0x00,0x7F,0x7F,0x36,0x37,0x33,0x31,0x30,0x31,0x33,0x33,0x33,0x7F,0x7F,0x00,0x00,
/*-- 文字: 五 --*/
/*-- 黑体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x06,0xC6,0xC6,0xC6,0xC6,0xFE,0xFE,0xC6,0xC6,0xC6,0xC6,0x06,0x06,0x00,0x00,
0x30,0x30,0x30,0x30,0x30,0x3F,0x3F,0x30,0x30,0x30,0x3F,0x3F,0x30,0x30,0x30,0x00,
};
void delay_us(uchar us)
{
while(us--);
}
/******************************** 显示子程序 **********************************************************/
void display_time(void)
{
unsigned char i;
uchar *p;
temp[0]=hour/10;
temp[1]=hour%10;
temp[2]=10;
temp[3]=minute/10;
temp[4]=minute%10;
temp[5]=10;
temp[6]=second/10;
temp[7]=second%10;
for(i=0;i<8;i++)
{
p=number+16*temp[i];
DisWord(i,1,1,p);
}
}
void display_date(void)
{
unsigned char i;
uchar *p;
if(year>2099) year=2099;
temp1[0]=year%100/10;
temp1[1]=year%10;
temp1[2]=11;
temp1[3]=month/10;
temp1[4]=month%10;
temp1[5]=11;
temp1[6]=day/10;
temp1[7]=day%10;
for(i=0;i<8;i++)
{
p=number+16*temp1[i];
DisWord(i,0,1,p);
}
}
/******************************** 表针显示 **********************************************************/
void hand(uchar time,uchar lenth,uint angle,uchar draw) //表针
{
uchar dx,dy; // 每秒钟时,分,秒针都调一下,但是角度不同
unsigned int sec,temp,temp1; //
if(time==second) {sec=second;temp1=59;} // 某个时刻秒针指向的位置
if(time==minute&&second!=minute) {sec=minute*60+second,temp1=3599;}//分针指向的位置
if(time==hour&&second!=hour) {sec=(hour%12)*3600+minute*60+second;temp1=43199;}//时针
temp=sec-1;
if(temp>temp1) temp=temp1; //如果没有这句当second=0时sec会溢出,出错
dx=96+lenth*sin(3.14*temp/angle);
dy=32-lenth*cos(3.14*temp/angle);
DrawLine(96,32,dx,dy,Graphic_Clear);
dx=96+lenth*sin(3.14*sec/angle);
dy=32-lenth*cos(3.14*sec/angle);
DrawLine(96,32,dx,dy,draw);
}
/******************************** 判闰年 **********************************************************/
void leap_year(uchar x) //判段闰年
{
if((x%4==0&&x%100!=0)||x%400==0) mon[1]=29;
else mon[1]=28;
}
/******************************** 键扫子程序 **********************************************************/
void keyscan(void) // 键盘扫描
{
unsigned char keyvalue;
keyvalue=P1&0X07;
if(keyvalue!=0x07)
delay_us(50);
if(keyvalue!=0x07)
{
key=keyvalue;
flag=1;
}
else flag=0;
}
/******************************** 调试加子程序 **********************************************************/
unsigned int add(uint i,uint top,uint bottem) //调时间函数,按键则加一
{
if(add_flag)
{
i++;
if(i==top)
{
i=bottem;
}
}
add_flag=0;
return(i);
}
/******************************** 调试减子程序 **********************************************************/
unsigned int sub(uint i,uint top,uint bottem) // 调时间函数,按键则减一
{
if(sub_flag)
{
i--;
if(i==bottem)
{
i=top;
}
}
sub_flag=0;
return(i);
}
/******************************** 判星期子程序 **********************************************************/
void week(bit f,uint x,uchar y,uchar z) //判断某一天是星期几
{
unsigned long temp; //我的方法是查出2000年1月1日是星期六
uint deta_day=0;
uchar i; //要求哪年哪天就把那天与2000年1月1日
uchar *p;
leap_year(x); //相隔的天数对7取余
for(i=0;i<y;i++)
{deta_day+=mon[i];}
temp=365*(x-2000)+deta_day+abs(x-2000)/4+z-mon[y-1];
if(f&&x%4==0&&y<3) temp=365*(x-2000)+deta_day+abs(x-2000)/4+z-mon[y-1]-1;
weekday=temp%7;
p=xingqi+32*weekday;
DisWord(2,2,2,p);
}
/******************************** 键功能子程序 **********************************************************/
void keyprocess(void) // 键功能程序
{
keyscan();
while((P1&0X07)!=0x07); //判按键释放
switch(key)
{
case 0x06:
if(flag)
{
count++;
if(count==7)
count=0;
}
break;
case 0x05: // 加一键
if(flag)
{
if(count!=0) // 为一年加一,为二月加一以此类推
{
add_flag=1; // 加的标志
}
switch(count)
{
case 1:TR0=0;year=add(year,2100,2000);display_date();week(1,year,month,day);break;
case 2:TR0=0;month=add(month,13,1);display_date();week(0,year,month,day);break;
case 3:TR0=0;leap_year(year);day=add(day,mon[month-1]+1,1);display_date();week(0,year,month,day);break;
case 6:TR0=0;hand(second,26,30,Graphic_Clear);second=add(second,60,0);flag_sec=1;break; //加之前先把指针擦掉,
case 5:TR0=0;hand(minute,22,1800,Graphic_Clear);minute=add(minute,60,0);flag_sec=1;break; //加完后显示新的指针
case 4:TR0=0;hand(hour,16,21600,Graphic_Clear);hour=add(hour,24,0);flag_sec=1;break;
default:break;
}
}
break;
case 0x03: //减一键,与加一相对应
if(flag)
{
if(count!=0)
{
sub_flag=1;
}
switch(count)
{
case 1:TR0=0;year=sub(year,2100,1999);display_date();week(1,year,month,day);break;
case 2:TR0=0;month=sub(month,12,0);display_date();week(0,year,month,day);break;
case 3:TR0=0;leap_year(year);day=sub(day,mon[month-1],0);display_date();week(0,year,month,day);break;
case 6:TR0=0;hand(second,26,30,Graphic_Clear);second=sub(second,59,65535);flag_sec=1;break;
case 5:TR0=0;hand(minute,22,1800,Graphic_Clear);minute=sub(minute,59,65535);flag_sec=1;break;
case 4:TR0=0;hand(hour,16,21600,Graphic_Clear);hour=sub(hour,23,65535);flag_sec=1;break;
default:break;
}
}
break;
default: break;
}
switch(count) // 不按或按键到第七次自动开启定时
{
case 0:TR0=1;break; //其他的键值定时保持关闭
case 1:TR0=0;break;
case 2:TR0=0;break;
case 3:TR0=0;break;
case 4:TR0=0;break;
case 5:TR0=0;break;
case 6:TR0=0;break;
default:break;
}
}
/******************************** 主函数 **********************************************************/
void main(void)
{
uchar *p;
DrawSineWave();
ClearLCD();
DrawCircle(); // 画一个圆圈作为表的框,并让它总是显示着
IE=0X82;TMOD=0X01;TH0=0X3C;TL0=0XAF;//TR0=1;
p=hanzi; // 显示 星期 二字,并让它总是显示着
DisWord(0,2,2,p);
p=hanzi+32;
DisWord(1,2,2,p);
display_date(); //显示日期
week(0,year,month,day); // 显示星期
while(1)
{
keyprocess(); // 键盘扫描及功能
display_time(); // 显示时间
if(flag_day) // 一天刷新一次日期和星期
{
display_date();
week(0,year,month,day);
flag_day=0;
}
if(flag_sec) //一秒钟才刷新一次表针的显示,减少闪烁
{
hand(second,26,30,Graphic_Draw);
if(second!=minute) // 我的显示方法是先把上一秒的指针擦掉,再显示。
{
hand(minute,22,1800,Graphic_Draw); //这样如果秒等于分的时候,秒针显示完马上会被分针擦出
}
if(second!=hour) //所以这一秒我就让分钟不显示。分针一秒所走的角度太小
{
hand(hour,16,21600,Graphic_Draw); //是看不出来的。小时同理。
}
}
flag_sec=0;
}
}
/********************************中断服务子程序 **********************************************************/
void t0() interrupt 1 using 0
{
TR0=0;TH0=0X3C;TL0=0XAF;TR0=1;
timer++;
if(timer==20)
{
timer=0;
second++;
flag_sec=1;
if(second>=60)
{
second=0;
minute++;
if(minute>=60)
{
minute=0;
hour++;
if(hour>=24)
{
hour=0;
day++;
flag_day=1;
leap_year(year); //判闰年确定那一年2月的天数
if(day>mon[month-1])
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
if(year>=2100)
year=2000;
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -