#include<reg51.h>
unsigned char seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90}
unsigned char flash,mode=0
char min=50,hour=12,hour_rom,min_rom,sec=25
unsigned char j,k
unsigned int i
unsigned char key_set_s,key_up_s,key_down_s,key_reset_s
sbit P0_7=P0^7
sbit key_set=P3^4
sbit key_up=P3^5
sbit key_down=P3^6
sbit key_reset=P3^7
sbit buzzer=P1^0
bit dop,bb //声明
void delay(unsigned int x) //延时
{
while(x--)
}
void timer0_isr(void) interrupt 1 //中断服务函数
{
TH0=0xf8 //为65535-2000=63535转化为16进制取高八位
TL0=0x2f //取低八位
i++
bb=!bb
if(i>=250) 枯瞎基//半秒,五神闷百没谨一秒
{
i=0
k++
flash=~flash
dop=!dop
}
if(k>=2) //大于二归零
{
k=0
sec++
}
if(sec>=60) //秒
{
sec=0
min++
}
if(min>=60) //分
{
min=0
hour++
}
if(hour>=24) //小时
hour=0
P0=0xff //P0初始化为全1 11111111
if(mode==0) //正常显示
{
switch(j) //控制语句
{
case 0:P0=seven_seg[sec%10]P2=0xfebreak //秒个位
case 1:P0=seven_seg[sec/10]P2=0xfdbreak //秒十位
case 2:P0=seven_seg[min%10]P0_7=dopP2=0xfbbreak
case 3:P0=seven_seg[min/10]P2=0xf7break
case 4:P0=seven_seg[hour%10]P0_7=dopP2=0xefbreak //dop为小数点
case 5:P0=seven_seg[hour/10]P2=0xdfbreak
}
}
////////////////////
if(mode==1) //模式一 C1状态
{
switch(j)
{
case 0:P0=seven_seg[min%10]P2=0xfebreak
case 1:P0=seven_seg[min/10]P2=0xfdbreak
case 2:P0=seven_seg[hour%10]| flashP2=0xfbbreak //flash为闪烁
case 3:P0=seven_seg[hour/10]| flashP2=0xf7break
case 4:P0=seven_seg[1]P2=0xefbreak //1为C1状态
case 5:P0=0xc6P2=0xdfbreak //0xc6为显示C
}
}
////////////////////
if(mode==2) //模式二 C1状态
{
switch(j)
{
case 0:P0=seven_seg[min%10]| flashP2=0xfebreak
case 1:P0=seven_seg[min/10]| flashP2=0xfdbreak
case 2:P0=seven_seg[hour%10]P2=0xfbbreak
case 3:P0=seven_seg[hour/10]P2=0xf7break
case 4:P0=seven_seg[1]P2=0xefbreak
case 5:P0=0xc6P2=0xdfbreak
}
}
////////////////////
if(mode==3) //模式三 C2状态
{
switch(j)
{
case 0:P0=seven_seg[min_rom%10]P2=0xfebreak
case 1:P0=seven_seg[min_rom/10]P2=0xfdbreak
case 2:P0=seven_seg[hour_rom%10]| flashP2=0xfbbreak
case 3:P0=seven_seg[hour_rom/10]| flashP2=0xf7break
case 4:P0=seven_seg[2]P2=0xefbreak
case 5:P0=0xc6P2=0xdfbreak
}
}
////////////////////
if(mode==4) //模式四 C2状态
{
switch(j)
{
case 0:P0=seven_seg[min_rom%10]| flashP2=0xfebreak
case 1:P0=seven_seg[min_rom/10]| flashP2=0xfdbreak
case 2:P0=seven_seg[hour_rom%10]P2=0xfbbreak
case 3:P0=seven_seg[hour_rom/10]P2=0xf7break
case 4:P0=seven_seg[2]P2=0xefbreak
case 5:P0=0xc6P2=0xdfbreak
}
}
j++
if(j>=6)
j=0
}
void key(void) //调用开关函数
{
////////////////
if(key_set==0) //设置
{
delay(300)
if(key_set==0)
key_set_s=1
}
if(key_set==1&&key_set_s==1)
{
mode++
if(mode>=5)
mode=1
key_set_s=0
}
////// ///
if(key_up==0) //上调
{
delay(300)
if(key_up==0)
key_up_s=1
}
if(key_up==1&&key_up_s==1)
{
if(mode==1)hour++
if(mode==2)min++
if(mode==3)hour_rom++if(hour_rom>=24)hour_rom=0
if(mode==4)min_rom++if(min_rom>=60)min_rom=0
key_up_s=0
}
/////////////////
if(key_down==0) //下调
{
delay(300)
if(key_down==0)
key_down_s=1
}
if(key_down==1&&key_down_s==1)
{
if(mode==1)hour--if(hour<0)hour=23
if(mode==2)min-- if(min<0)min=59
if(mode==3)hour_rom--if(hour_rom<0)hour_rom=23
if(mode==4)min_rom--if(min_rom<0)min_rom=59
key_down_s=0
}
/////////////////
if(key_reset==0) //复位
{
delay(300)
if(key_reset==0)
key_reset_s=1
}
if(key_reset==1&&key_reset_s==1)
{
key_reset_s=0
mode=0
}
}
void timer0_init(void) //timero初始化函数
{
TMOD=0x01 //方式1
TH0=0xf8
TL0=0x2f
EA=1 //中断开关
ET0=1 //中断小开关
TR0=1 //开始计数
}
void main(void) //主函数
{
timer0_init()
while(1)
key()
{
if(hour==hour_rom&&min==min_rom)
buzzer=bb //buzzer为蜂鸣器
}
}
数脊誉衫字时钟这段程序是在PRTUES上完全好使
你虚伍可樱腔以根据 程序自己在PROTUES上画图
#include<reg51.h>
#define uint unsigned int
char code tab[]=
char code table[]=
sbit duan=P2^5
sbit wei=P2^6
sbit button1=P1^0
sbit button2=P1^1
sbit button3=P1^2
sbit button4=P1^3
sbit button5=P1^4
sbit button6=P1^5
sbit button7=P1^6
sbit button8=P1^7
void delay(uint z)
void start()
void display()
static char a,b,c,d,k,e,f,g,h
static char num1,num2,num3,num4
void main()
{ start()
while(1)
if(button2==0)
if(button3==0)
if(button4==0)
{ delay(10)
if(button4==0)
}}
while(button4==0)
}
if(button5==0)
{ delay(10)
if(button5==0)
}
while(button5==0)
}
if(button6==0)
{ delay(10)
if(button6==0)
}
while(button6==0)
}
if(button7==0)
{delay(10)
if(button7==0)
{num3--
if(num3<0)
}
while(button7==0)
}
if(button8==0)
{delay(10)
if(button8==0)
while(button8==0)
}
display()
} }
void start()
{ EA=1
TMOD=0x01ET0=1
TH0=(65536-4000)/256
TL0=(65536-4000)%256}
void delay(uint z )
{ uint x,y
for(x=zx>0x--)
for(y=120y>0y--)}
void timer1() interrupt 1
{ TH0=(65536-4000)/256
TL0=(65536-4000)%256
k++
if(k==2) //总忘k把清零
{k=0num1++
if(num1==100)
{num1=0num2++
if(num2==60){num2=0num3++
if(num3==60){num3=0num4++
if(num4==24)}
}} }}
void display()
{a=num1/10b=num1%10c=num2/10d=num2%10
e=num3/10f=num3%10g=num4/10h=num4%10
wei=1P0=0x80wei=0
duan=1P0=tab[b]duan=0delay(1)
P0=0x00
wei=1P0=0x40wei=0
duan=1P0=tab[a]duan=0delay(1)
P0=0x00
wei=1P0=0x20wei=0
duan=1P0=tab[d]duan=0
duan=1P0=table[d]duan=0delay(1)
P0=0x00
wei=1P0=0x10wei=0
duan=1P0=tab[c]duan=0delay(1)
P0=0x00
wei=1P0=0x08wei=0
duan=1P0=table[f]duan=0delay(1)
duan=1P0=tab[f]duan=0delay(1)
P0=0x00
wei=1P0=0x04wei=0
duan=1P0=tab[e]duan=0delay(1)
P0=0x00
wei=1P0=0x02wei=0
duan=1P0=tab[h]duan=0
duan=1P0=table[h]duan=0delay(1)
P0=0x00
wei=1P0=0x01wei=0
duan=1P0=tab[g]duan=0delay(1)
P0=0x00
}
程序和具体电路结合起来拦冲才能看出简弯歼问题,有一个办法可以不用具体研究代码和电路:把你调试用的汉字点阵全部改为0XFF,看是否该汉字所在位置是否全部显示,然后把第一个字节改为0X00或0XEF,看对应显示是否正确闹碧,也可以再改其他字节的点阵。用这种方法可以找出问题所在!第7-15行是汉字的下半部分,据此查看一下程序和电路。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)