📄 8279的时钟程序.txt
字号:
col=col-64;
}
for(j=0;j<2;j++)
{
write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
for(i=0;i<12;i++)
write_data1(english[n*24+12*j+i]);
}
}
void display_e(uchar page,uchar col,uchar code *english,uchar n)
{
uchar j,i;
if(col<64)
{
CS2=1;CS1=0;
}
else
{
CS2=0;CS1=1;
col=col-64;
}
for(j=0;j<2;j++)
{
write_cmd1(Page_Add+page+j);write_cmd1(Col_Add+col);
for(i=0;i<7;i++)
write_data1(english[n*14+7*j+i]);
}
}
//************************写数据到LCD**********************
void point(uchar x,uchar y)
{
uchar y1,y2,pp;
uchar datain;
pp=1;
y1=y>>3;
y2=y%8;
pp=pp<<y2;
if (x<64)
{
CS2=1;
CS1=0;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=datain|pp;
write_data1(datain);
}
else
{
CS2=0;
CS1=1;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=datain|pp;
write_data1(datain);
}
}
vp_p(uchar *s)
{
uchar i;
unsigned long vp=0;
max=s[0],min=s[0];
for(i=1;i<120;i++)
{
if (max<s[i])max=s[i];
if(min>s[i])min=s[i];
}
vp=max-min;
vp=vp*500;
vp=vp/255;
d[2]=vp/100;
d[1]=(vp-d[2]*100)/10+1;
d[0]=vp%10;
}
void pointb(uchar x,uchar y)
{
uchar y1,y2,pp;
uchar datain;
pp=1;
y1=y>>3;
y2=y%8;
pp=~(pp<<y2);
if (x<64)
{
CS2=1;
CS1=0;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x);
datain=datain&pp;
write_data1(datain);
}
else
{
CS2=0;
CS1=1;
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
delay1(10);
datain=read_data();
write_cmd1(Page_Add+y1);
write_cmd1(Col_Add+x-64);
datain=datain&pp;
write_data1(datain);
}
}
//5*7
display_num(uchar x,uchar y,uchar *num,uchar n)
{
uchar i,j,temp;
for(j=0;j<5;j++)
{ temp=num[5*n+j];
for(i=0;i<8;i++)
{
if(temp&1)point(x+j,y+i);
else pointb(x+j,y+i);
temp=temp>>1;
}
}
}
display8_16(uchar x,uchar y,uchar *num,uchar n)
{
uchar i,j,temp;
for(j=0;j<16;j++)
{ temp=num[16*n+j];
if(j<8)
{
temp=temp>>4;
for(i=0;i<4;i++)
{
if(temp&1)point(x+j,y+i);
else pointb(x+j,y+i);
temp=temp>>1;
}
}
else
{
for(i=0;i<4;i++)
{
//temp=temp>>4;
if(temp&1)point(x+j-8,y+i+4);
else pointb(x+j-8,y+i+4);
temp=temp>>1;
}
}
}
}
void write_data1(uchar dout)
{
DI=1; RW=0;
Lcd_Bus=dout;
E=1;
E=0;
delay1(1);
}
//***************************读LCD数据*********************
uchar read_data()
{
uchar din;
Lcd_Bus=0xff;
DI=1; RW=1;
E=0;
E=0;
E=1;
E=1;
E=1;
din=Lcd_Bus;
return din;
}
//****************************清除内存*********************
void cls()
{
uchar j,k;
CS2=1;CS1=0;
for(k=0;k<8;k++)
{
write_cmd1(Page_Add+k);
write_cmd1(Col_Add); //列地址0
for(j=0;j<64;j++) //列地址自动加一
write_data1(0x00);
}
CS2=0;CS1=1;
for(k=0;k<8;k++)
{
write_cmd1(Page_Add+k);
write_cmd1(Col_Add); //列地址0
for(j=0;j<64;j++) //列地址自动加一
write_data1(0x00);
}
}
//****************显示小数字*******************************
//***************************初始化LCD屏*******************
void init()
{
delay1(100);
CS2=1; CS1=0;
delay1(100);
write_cmd1(Disp_Off);
write_cmd1(Page_Add);
write_cmd1(Start_Line);
write_cmd1(Col_Add);
write_cmd1(Disp_On);
CS2=0; CS1=1;
delay1(100);
write_cmd1(Disp_Off);
write_cmd1(Page_Add);
write_cmd1(Start_Line);
write_cmd1(Col_Add);
write_cmd1(Disp_On);
}
void line_h(uchar x,uchar y,uchar l)
{
uchar i;
for(i=0;i<l;i++) point(x+i,y);
}
void line_v(uchar x,uchar y,uchar l)
{
uchar i;
for(i=0;i<l;i++) point(x,y+i);
}
wave()
{
uchar data i,j,t=64;
uint te;
uchar xdata s[120];
uchar tt=1;
/* line_h(8,0,120);
line_h(8,63,120);
line_v(8,0,64);
line_v(127,0,64);
for(i=1;i<4;i++)
for(j=4;j<64;j++)point(j*2,16*i);
for(i=0;i<10;i++)
for(j=0;j<32;j++)point(12*i+8,j*2);
*/
while(1)
{
cls();
line_h(8,0,120);
line_h(8,63,120);
line_v(8,0,64);
line_v(127,0,64);
for(i=1;i<4;i++)
for(j=4;j<64;j++)point(j*2,16*i);
for(i=0;i<10;i++)
for(j=0;j<32;j++)point(12*i+8,j*2);
display_num(0,55,str_num,0);
for(i=0;i<5;i++) display_num(0,3+11*i,str_num,5-i);
for(i=0;i<6;i++)
{
point(6,5+11*i);point(7,5+11*i);
}
for(i=0;i<120;i++)
{
s[i]=adconvert();
}
for(i=1;i<120;i++)
{
te=s[i]*53;
te=te/255;
point(i+8,60-te);
point(i+8,59-te);
}
for(i=0;i<5;i++)display8_16(60+7*i,55,str_vp,i);
vp_p(s);
for(i=0;i<3;i++)
display_num(92+7*i,55,str_num,d[2-i]);
point(100,61);point(100,62);
/*screen1();
te=fi_int&0x7ff;
dd[0]=te/1000;
dd[1]=te/100-dd[0]*10;
dd[2]=te/10-dd[1]*10-dd[0]*100;
dd[3]=te%10;
for(i=0;i<4;i++)display_num(10+6*i,55,str_num,dd[i]);
display_num(10+24,55,str_num,10);
display_num(10+24+5,55,str_num,11);*/
for(i=0;i<100;i++)delay1(500);
if(key()!=0)
{
state=1;
cls();
break;
}
}
}
/************************测频率*******************************/
void timer2(void) interrupt 5 using 3
{ TF2=0;
time2_count--;
}
/**************************采样******************************/
void time1(void) interrupt 3 using 2
{
EA=0;
TR1=0;
TH1=(65536-1365)/256;
TL1=(65536-1365)%256;
s[ii].real=adconvert();
s[ii].image=0;
ii++;
TR1=1;
EA=1;
if(ii>=64)
{
ET1=0;
TR1=0;
EA=0;
ii=0;
over=1;
}
}
/**************************对外部计数***************************/
void time0(void) interrupt 1 using 1
{
if(T0_counter<=Time_NO)
{T0_counter++;
TR2=1;//启动T2
}
if(T0_counter>Time_NO)//够4个,停止T2,T0
{
TR2=0;TR0=0;EA=0;ET0=0;ET2=0;T0_counter=0;//停止T0,T2
T2NOW=0;T2NOW=((T2NOW|TH2)<<8)|TL2;
fi_int=(((Time_NO/2)*5461167)/((65535-time2_count)*65536+T2NOW+1+(65535-time2_count)*13));//计算频率
time2_count=65535;
TH2=0;
TL2=0;
TH0=0;
TL0=0;
/*if(fi_int>=625)
{
fs=42655/625;
}
else {fs=42665/fi_int;}//3276800/12/fi_int
*/
TH1=(65536-1365)/256;
TL1=(65536-1365)%256;
ET1=1;
TR1=1;//启动T1进行采样
EA=1;
}
}
/************************测频率并显示波形**********************/
void screen1(void)
{
TMOD=0x16;//T0对外部计数,T1对内部定时
TH0=255;
TL0=255;//计1次数
T2CON=0x00;//16位重装
//CKCON=0x28;//T0,T2 在4 clock 下工作
TH2=0;
TL2=0;
RCAP2L=0;
RCAP2H=0;//初值清零
PT0=1;//设置T0的优先级别高,T0继续判断是否到了4个周期
ET0=1;//开T/C0中断
ET1=1;//开T/C1中断
ET2=1;//开T/C2中断
EA=1;
TR1=0;
TR2=0;
TR0=1;//启动T0
over=0;
while(over==0);
over=0;
}
unsigned char key()
{ unsigned char k,tem,keytem;
// uchar idata d[150];
keytem=0;
s0=1;s1=1;s2=1;s3=1;
tem=P2 & 0x0f;
if(tem!=0x0f)
{ beep=0;
for(k=0;k<40;k++)
tem=P2 & 0x0f;
if(tem!=0x0f)
{ if(tem==0x07) keytem=1;
else if(tem==0x0b) keytem=2;
else if(tem==0x0d) keytem=3;
else if(tem==0x0e) keytem=4;
}
}
while(tem!=0x0f)
tem=P2 & 0x0f;
beep=1;
return(keytem);
}
void amp()
{
uchar i,ii;
for(i=2;i<33;i++)
{
for(ii=0;ii<s[i-2].real;ii++)
{
point(i*2,55-ii);
point(i*2-1,55-ii);
}
}
}
hextobcd(uint x)
{
uint i,t=1000;
uint temp;
temp=x;
for(i=0;i<4;i++)
{
d[3-i]=x/t;
x=x%t;
t=t/10;
}
if(temp>1000)
{
for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
}
else if(temp>100)
{
d[3]=14;
for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
}
else if(temp>10)
{
d[3]=d[2]=14;
for(i=0;i<4;i++)display_num(90+6*i,20,str_num,d[3-i]);//频率
}
}
void cursor(uchar x)
{
uchar i;
CS1=0;CS2=1;
write_cmd1(Page_Add+7);
write_cmd1(Col_Add);
for(i=0;i<64;i++)write_data1(0);
write_cmd1(Page_Add+7);
write_cmd1(Col_Add+x-2);
write_data1(0x8);
write_data1(0x4);
write_data1(0xfe);
write_data1(0x4);
write_data1(0x8);
}
static_fft()
{
uchar i,j,iii;
uchar ii=1;
cls();
line_h(0,0,68);
line_h(0,55,68);
hextobcd(0);
for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
for(j=1;j<7;j++)
for(i=1;i<68;i=i+2) point(i,8*j);
for(j=1;j<6;j++)
for(i=2;i<56;i=i+2) point(11*j,i);
line_v(0,0,56);
line_v(68,0,56);
amp();
while(1)
{
iii=key();
if(iii==1)
{
ii++;if(ii==32)ii=1;
}
else if(iii==2)
{
if(ii==1)ii=32;
ii--;
}
else if (iii==3)
{
cls();
state=1;
break;
}
cursor(2*ii);
hextobcd(95*(ii-1));
}
}
fft_screen()
{
uchar i,j,iii;
uchar ii=1;
while(1)
{
cls();
line_h(0,0,68);
line_h(0,55,68);
hextobcd(0);
for(i=0;i<8;i++)display_e(0,70+7*i,str_fft,i);
//for(i=0;i<4;i++)display_num(2,95+5*i,str_num,i+1);//频率
for(i=0;i<2;i++)display_h(2,70+12*i,str_f,i);
for(i=0;i<2;i++)display_num(10+105+5*i,19,str_num,i+10);//HZ
for(j=1;j<7;j++)
for(i=1;i<68;i=i+2) point(i,8*j);
for(j=1;j<6;j++)
for(i=2;i<56;i=i+2) point(11*j,i);
line_v(0,0,56);
line_v(68,0,56);
for(i=0;i<64;i++)
{
s[i].real=adconvert();
s[i].image=0;
}
FFT(s);
amp();
iii=key();
if(iii==1)
{
ii++;if(ii==32)ii=1;
}
else if(iii==2)
{
if(ii==1)ii=32;
ii--;
}
else if(iii==3)
{
cls();
state=2;
break;
}
else if(iii==4)
{
cls();
state=0;
break;
}
cursor(2*ii);
hextobcd(95*(ii-1));
for(i=0;i<100;i++)delay1(500);
}
}
main()
{
init();
cls();
while(1)
{
if(state==0) wave();
else if (state==1)fft_screen();
else if (state==2)static_fft();
}
}
================================================
该时钟为24小时制P1为共阳极LED数据,P2。0~P2。3为LED单元的位选
//P3。2以按键次数来选择要设置的LED单元,P3。6为加1按键
/*******************************************************/
#include<reg51.h>
#define uchar unsigned char
#define DISSET P2//控制LED显示端口
#define DISOUT P1//LED口数据
sbit K2=P3^6;//+
sbit K3=P3^2;//选位
uchar data Msecond=0;
uchar data Second=0;
uchar code dis[4]={0xf1,0xf2,0xf4,0xf8};//选通各位
uchar code discode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管,0。。。9
uchar disnum[4]={0,0,0,0};
uchar counter;
////////延时子程序//////////////////
Delay(uchar n)
{
uchar i;
while (n--)
for (i=0;i<150;i++);
}
///////////////// 定时器0中断处理子程序/////////////////////////////////
void time_0() interrupt 1 using 1
{
TH0=0xb1;
TL0=0xdf;
Msecond++;
if(Msecond==50)///1S时间到
{ Msecond=0;Second++ ;}
if(Second==60)//1 分钟到
{Second=0;disnum[3]++;}
if(disnum[3]==10)//分钟从个位向十位进位
{disnum[3]=0;disnum[2]++;}
if(disnum[2]==6)//一小时到
{disnum[2]=0;disnum[1]++;}
if(disnum[1]==10)//时的个位向十位进位
{disnum[1]=0;disnum[0]++;}
if((disnum[0]==2)&&(disnum[1]==4))//到00:00时
{disnum[0]=0;disnum[1]=0;}
}
/****************显示程序***************************/
void Display(void)
{
uchar i;
for (i=0;i<4;i++)
{
DISOUT=discode[disnum[i]];//显示代码
DISSET=dis[i];//选通位
Delay(1);//扫描时间
}
}
void main(void)
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=0xb1;
TL0=0xeb;//2000us-12us
TR0=1;
while(1)
{
if (!K3)
{
Delay(3);
while (!K3)//键松开?
Display();//防止数码管灭
Delay(3);
counter++;
if (counter==4) counter=0;
}
if (!K2)
{
Delay(3);
while (!K2)//键松开?
Display();//防止数码管灭
Delay(3);
disnum[counter]++;
if(counter==0)//小时的十位LED单元处理
{
if(disnum[counter]==3) disnum[counter]=0;
}
if(counter==1)//小时的个位LED单元处理
{ if (disnum[0]>=2){if(disnum[counter]==4)disnum[counter]=0;}
else{if(disnum[counter]==10) disnum[counter]=0;}
}
if(counter==2){if(disnum[counter]==6) disnum[counter]=0;}//分钟的十位LED单元处理
if(counter==3){if (disnum[counter]==10) disnum[counter]=0;} //分钟的个位LED单元处理
}
Display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -