黄金会员
主题
回帖0
积分9861
阅读权限40
注册时间2009-11-11
最后登录1970-1-1
在线时间 小时
|
本帖最后由 WOSS1001 于 2011-12-7 20:19 编辑
首先感谢坛上的考拉等各位朋友。断断续续学了几个月的C语言,总体感觉C比汇编强大,但写出来的程序比汇编的臃肿。
这个是我做的第一个用C编程的实物。相机不在身边照片发不了。程序写的也乱,大家就当看个热闹吧。压缩文件中有仿真和源程序。
2HC5958x8.rar
(78.47 KB, 下载次数: 591)
DS1302.C是STC的
#include<reg52.h>
#include"ds1302.c"
#define un8 unsigned char
#define un16 unsigned int
#define row P0 //行
sbit Press_key = P1^0;//按键的I/O
sbit Press_key1 = P1^1;
sbit Press_key2 = P1^2;
sbit st = P3^2; //595第12脚(正脉冲更新输出内容)
//sbit oe_h=P3^4;
//sbit oe_m=P3^5;
un8 bdata Control_Port; // 声明一个可位寻址的字节变量
sbit new_value = Control_Port^1; // 引用该字节变量的某一位
sbit old_value = Control_Port^2;
sbit new_value1 = Control_Port^3; // 引用该字节变量的某一位
sbit old_value1 = Control_Port^4;
sbit new_value2 = Control_Port^5; // 引用该字节变量的某一位
sbit old_value2 = Control_Port^6;
sbit ds= Control_Port^7;
code un8 tab[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //行扫描
//code un8 tab[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //行扫描
un8 code tab1[]={0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60, //0-9
0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,
0x60,0x90,0x10,0x20,0x40,0x80,0x80,0xf0,
0x60,0x90,0x10,0x20,0x10,0x10,0x90,0x60,
0x20,0x20,0x40,0x90,0x90,0xf0,0x10,0x10,
0xf0,0x80,0x80,0xe0,0x10,0x10,0x90,0x60,
0x60,0x90,0x80,0xe0,0x90,0x90,0x90,0x60,
0xf0,0x90,0x10,0x20,0x40,0x40,0x40,0x40,
0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,
0x60,0x90,0x90,0x90,0x70,0x10,0x90,0x60
};
un8 code tab2[]={0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00};
void delay(un8 xms);
un8 adj;
main()
{
un8 x,place1,place2,place3,y,z,temp1,temp2;//place位置 从右到左place1,place2,place3,place4
EA=1;
ET0=1;
TMOD|=0X01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1;
SCON=0X00; //工作方式0
ES=0; //禁止串行中断
DS1302_Initial();
while(1)
{
for(y=8;y>0;y--)
{
z=10;
while(z--)
{
DS1302_GetTime(now);// 读取当前时间
for(x=0;x<8;x++)
{
if(1==ds&1==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x82, HEX2BCD(minute));DS1302_WriteData(0x8e, 0x80);} //分写入
if(1==ds&2==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x84, HEX2BCD(hour));DS1302_WriteData(0x8e, 0x80);}//时写入
minute = BCD2HEX(now[1]);
hour = BCD2HEX(now[2]);
row = tab[x]; //行
if(hour<10){place2=0x00;}
else{place2=tab1[8*(hour/10)+x];}
place1=tab1[8*(hour%10)+x];
if(1==adj){SBUF=0x00;}
else{SBUF=(place1>>4|place2)>>y;}
while(!TI);
TI=0;
st=1; //更新显示
st=0;
delay(10);
SBUF=0x00; //防残影
while(!TI);
TI=0;
st=1;
st=0;
}
}
}
////////////////////
for(y=0;y<25;y++)
{
z=10; //调走动速度
while(z--)
{
DS1302_GetTime(now);
for(x=0;x<8;x++)
{
if(1==ds&1==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x82, HEX2BCD(minute));DS1302_WriteData(0x8e, 0x80);}
if(1==ds&2==adj){ds=0;DS1302_WriteData(0x8e, 0x00);DS1302_WriteData(0x84, HEX2BCD(hour));DS1302_WriteData(0x8e, 0x80);}
minute = BCD2HEX(now[1]);
hour = BCD2HEX(now[2]);
row = tab[x]; //行
if(y<5)
{
place3=tab2[x]>>(7-y);
if(hour<10){place2=0x00;}
else{place2=tab1[8*(hour/10)+x];}
place1=tab1[8*(hour%10)+x];
if(1==adj){temp1=0x00;}
else{temp1=(place1>>4|place2)<<y;}
SBUF=temp1|place3;
}
else
{
if(y<8)
{
place3=tab2[x]>>(7-y);
if(hour<10){place2=0x00;}
else{place2=tab1[8*(hour/10)+x];}
place1=tab1[8*(hour%10)+x];
if(1==adj){temp1=0x00;}
else{temp1=(place1>>4|place2)<<y;}
temp1|=place3;
place2=tab1[8*(minute/10)+x];
place1=tab1[8*(minute%10)+x];
if(2==adj){temp2=0x00;}
else{temp2=(place1>>4|place2)>>(12-y);}
SBUF=temp1|temp2;
}
else
{
if(y<13)
{
place3=tab2[x]<<(y-7);
place2=tab1[8*(minute/10)+x];
place1=tab1[8*(minute%10)+x];
if(2==adj){temp2=0x00;}
else{temp2=(place1>>4|place2)>>(12-y);}
SBUF=temp2|place3;
}
else
{
place2=tab1[8*(minute/10)+x];
place1=tab1[8*(minute%10)+x];
if(2==adj){SBUF=0x00;}
else{SBUF=(place1>>4|place2)<<(y-12);}
}
}
}
while(!TI);
TI=0;
st=1; //更新显示
st=0;
delay(10);
SBUF=0x00; //防残影
while(!TI);
TI=0;
st=1; //更新显示
st=0;
}
}
}
}
}
void delay(un8 xms)
{
un8 i,j;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
void Timer0_interrupt() interrupt 1 using 2
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
new_value =Press_key;
if(!new_value && old_value)//识别按键。(按下即有效)
{
ds=1;
switch(adj)
{
case 0x01: minute++;if(60==minute){minute=0;}break;
case 0x02: hour++;if(60==hour){hour=0;};break;
default: break;
}
}
old_value = new_value;
new_value1 =Press_key1;
if(!new_value1 && old_value1)//识别按键。
{
ds=1;
switch(adj)
{
case 0x01: minute--;if(255==minute){minute=59;};break;
case 0x02: hour--;if(255==hour){hour=23;};break;
default: break;
}
}
old_value1 = new_value1;
new_value2 =Press_key2;
if(!new_value2 && old_value2)//识别按键。
{
adj++;
if(3==adj)
{
adj=0;
}
}
old_value2 = new_value2;
} |
评分
-
查看全部评分
|