单片机驱动32X64点阵资料
源代码在线查看: task.c.svn-base
#include "NEW_8051.H"
#include"task.h"
#include
#include"sbit.h"
//#include " uart.h"
/*****************************************************
4字LED点阵屏+DS1302万年历电子钟 C 程序
*******************************************************
DS1302 接线图
Vcc2 CLK I/O /RST
| | | |
-------------------
| 8 7 6 5 |
| DS1302 |
| |
| 1 2 3 4 |
-------------------
| | | |
VCC1 GND
1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持
595连级输出数据,138行驱动。*/
uchar Move; //时间温度变量
uchar Speed;
uchar Flicker;
uchar line;
uint zimuo;
uchar ucLastSec;
bit c_moon;
bit ri;
bit r;
bit zz=0;
bit rr;
bit nn;
bit w;
bit Can=1;
void start(void)
{
Move=0;
// E=0; //595使能
zimuo=0;
//IP=0x04; //设置优先级 外部中断1为优先级
TMOD=0x21; //定时器1 0
TH1=0x00; //定时50us 晶振18.432M 定时器1方式1 16位模式初始化
TL1=0x00;
ET1=1;
//TR1=1;
TH0 = 0x92; //18.432M 18.2ms
TL0 = 0x0CD;
ET0=1;
TR0=1;
//外部中断
IT0=1; //下降沿触发中断
EX0=1; //开外中断1
// RCAP2H = 0x7D;
// RCAP2L = 0x0CB;
// ET2 = 1;
// TR2=1;
CMOD = 0x80;
CL = 0;
CH = 0;
CCON = 0x00; //清中断标志
CCAPM0 = 0x49;
CCAP0H = 0x0E2;
CCAP0L = 0x00;
CCAPM0 = 0x49; //设置PCA0为16位定时器,允许PCA模块0中断
CR = 1;
EA=1;
ri=1;
r=1;
zz=0;
rr=1;
P1M0=0X1C;
P1M1=0X00;
//P3M0=0X18;
//P3M0=0X00;
}
/*主函数*/
void main()
{
start();
while(1) //重复(无限)循环显示
{
if(irokk==1)
{
Ircordpro();
irokk=0;
}
if((resget==0)||(IRcord[0]==0x4a))
{
DelayMs();
if((resget==0)||(IRcord[0]==0x4a))
{
Set1302(starts_time); //初始化
W1302(0x8e,0x00); //控制命令,WP=0,写操作
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
IRcord[0]=0x00;
}
}
/************************/
du1302(); //读取 秒 分 时 日 月 星期 年
if((Hour==0)&&(Cent==0)&&(Sec==48)&&(Can==1)&&( AddTime ))
{
Sec=Sec/16*10+Sec%16;
AddTime=AddTime/16*10+AddTime%16;
if( !UpdateMode )
{
AddTime=AddTime+Sec;
}
else
{
AddTime=Sec-AddTime;
Can=0;
}
W1302(0x8e,0x00);
W1302(0x80,AddTime/10*16+AddTime%10);
W1302(0x8e,0x80);
}
if((Hour==0)&&(Cent==1))
{
Can=1;
}
/****************************/
if(Sec!=ucLastSec)
{
ucLastSec=Sec;
w=~w;
}
c_sun=0;
//y=R1302(0x8c+1)/16*10+R1302(0x8c+1)%16 ;
nian_sun=Year;
// y=R1302(0x88+1)/16*10+R1302(0x88+1)%16 ;
yue_sun=Month;
// y=R1302(0x86+1)/16*10+R1302(0x86+1)%16 ;
ri_sun=Day;
Conver_xingqi(c_sun,nian_sun,yue_sun,ri_sun); //农历星期转换
Conversion(c_sun,nian_sun,yue_sun,ri_sun); //农历转换
zimuo=0;
if ((key_moda==0)||(IRcord[0]==0x15)) //设置和选择项目键
{
DelayMs();
if((key_moda==0)||(IRcord[0]==0x15))
{
if(id++==12)
{
id=0;
}
ha=0;
msec=0; //清闪烁标志
while((key_moda==0)||(IRcord[0]==0x15))
{
Show_word();
IRcord[0]=0x00;
}
}
}
if(id!=0)
{
if ((key_up==0)||(IRcord[0]==0x40)) //增加
{
DelayMs();
if((key_up==0)||(IRcord[0]==0x40))
{
while((key_up==0)||(IRcord[0]==0x40))
{
Show_word();
IRcord[0]=0x00;
} //调用显示
ha=0;
msec=0; //清闪烁标志
Set(id,0);
//调用时间调调整
}
}
if ((key_Down==0)||(IRcord[0]==0x19)) //减少
{
DelayMs();
if((key_Down==0)||(IRcord[0]==0x19))
{
while((key_Down==0)||(IRcord[0]==0x19))
{
Show_word();
IRcord[0]=0x00;
} //调用显示
ha=0;
msec=0; //清闪烁标志
Set(id,1); //调用时间调调整
}
}
}
else
{
if ((key_up==0)||(IRcord[0]==0x40)) //增加
{
DelayMs();
if((key_up==0)||(IRcord[0]==0x40))
{
while((key_up==0)||(IRcord[0]==0x40))
{
Show_word();
IRcord[0]=0x00;
} //调用显示
ha=0;
msec=0; //清闪烁标志
if(b!=0) //手动调整显示的内容
{
if(f++==6) //f为显示转换标志
f=0;
}
}
}
}
//------------------------
if (nn==1) //调用温湿度读取子程序
{
RH();
}
//串口显示程序
//--------------------------
Show_word(); //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
IRcord[0]=0x00;
}
}
/****************************************************************************/
void timer_0(void) interrupt 1 //中断入口,闪烁
{
TH0 = 0x92; //18.432M 18.2ms
TL0 = 0x0CD;
zz=1;
TR0=0;
}
/******************************************************************/
void PCA_interrupt(void) interrupt 7 //PCA0引起此中断
{
if(CCF0)
{
CCF0 = 0;
if(msec++==18)//1s
{
msec=0;
if(mm++==3)
{
nn=1;
}
x++;
if(x>=a)
{
x=0;
if(b==0) //自动模式
{
if(f++==6)
f=0; //f显示转换计数器 ,d为用户设置的自动转换时间的值。
}
}
if(ha++==10) //5秒后进入正常走时。
{
id=0;
ha=0;
}
}
if(msec Flicker=0; //闪烁标志反转
else
Flicker=1;
}
}