#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为蜂鸣器
}
}
这个程序可以循环显示0~9.#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code Table_of_Digits[]={0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //00x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //10x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //20x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //30x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //40x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //50x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //60x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //70x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //80x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //90xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff}uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}uchar i=0,j=0,t=0,Num_Index,key,xi,yisbit we1=P1^1sbit we2=P1^3//主程序void main(){//P1=0x80Num_Index=0//从0 开始显示TMOD=0x01//T0 方式0TH0=(65536-2000)/256//2ms 定时TL0=(65536-2000)%256IE=0x82key=0xi=0yi=0EX0=1IT0=1TR0=1//启动T0while(1)}//T0 中断函数void ext_int0() interrupt 0{key++ key&=0x03}void LED_Screen_Display() interrupt 1{TH0=(65536-2000)/256//2ms 定时TL0=(65536-2000)%256switch(key){case 0: P0=0xffwe1=1P0=~Table_of_Digits[Num_Index*8+i]we1=0P0=0xff//输出位码和段码 we2=1P0=xdat[i]we2=0if(++i==8) i=0//每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0if(++Num_Index==10) Num_Index=0//显示下一个数字 } breakcase 1: we1=1P0=~xdat[xi]we1=0we2=1P0=ydat[yi]we2=0if(++t==250) //每个数字刷新显示一段时间 { t=0yi++if(yi>7){yi=0xi++} if(xi>7)xi=0} breakcase 2: we1=1P0=0x00we1=0P0=0xff//输出位码和段码 we2=1P0=xdat[i]we2=0if(++t==250) //每个数字刷新显示一段时间 { if(++i==8) i=0//每屏一个数字由8 个字节构成 t=0} breakdefault:key=0 i=0 j=0 t=0 xi=0 yi=0 Num_Index=0 we1=1 P0=0xff we1=0 we2=1 P1=0x80 we2=0break}}程序和具体电路结合起来才能看出问题,有一个办法可以不用具体研究代码和电路:把你调试用的汉字点阵全部改为0XFF,看是否该汉字所在位置是否全部显示,然后把第一个字节改为0X00或0XEF,看对应显示是否正确,也可以再改其他字节的点阵。用这种方法可以找出问题所在!第7-15行是汉字的下半部分,据此查看一下程序和电路。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)