|
单片机程序
#include <stc15.h> // 包含STC15的头文件
#include <intrins.h> // 包含intrins.h头文件,以便延时函数中用
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*七段共阳极管显示定义*/
uchar code dispcode[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管显示数字0~9
sbit CLK=P5^5; //74HC595的11引脚
sbit DAT=P5^4; //74HC595的14引脚
sbit RCLK=P3^6; //74HC595的12引脚
sbit CS1=P1^0; //数码管段位COM1(公共端)即数码管的1脚
sbit CS2=P1^1; //数码管段位COM2(公共端)即数码管的2脚
sbit CS3=P1^2; //数码管段位COM3(公共端)即数码管的3脚
sbit CS4=P1^3; //数码管段位COM4(公共端)即数码管的4脚
sbit CS5=P1^4; //数码管段位COM5(公共端)即数码管的5脚
sbit CS6=P1^5; //数码管段位COM6(公共端)即数码管的6脚
/*定义并初始化变量*/
uchar seconde=0;
uchar minite=0;
uchar hour=12;
uchar mstcnt=0;
//uchar i=0;
sbit P1_0=P3^3; // second 调整定义k3
sbit P1_1=P3^1; //minite调整定义,k2
sbit P1_2=P3^2; //hour调整定义,k1
/*函数声明*/
void delay(uchar k ); //延时子程序
void time_pro( ); //时间处理子程序
void write595(uchar word); //写595 ,显示
void keyscan( ); //键盘扫描子程序
/*****************************/
/*延时子程序*/
/****************************/
void delay(uchar k) //延时函数100us
{
uchar m=30;
_nop_();
_nop_();
do
{
while(--m);
}
while(--k);
}
//写数码管函数
void write595(uchar word)
{
uchar num;
uchar c=0;
num=dispcode[word];
for(c=0;c<8;c++)
{
CLK=0;
DAT=num&0x80;
num=num<<1;
CLK=1;
}
RCLK=0;
_nop_();
_nop_();
RCLK=1;
}
void select1(void)
{ //第一位数码管
CS1=0;CS2=1;CS3=1;CS4=1;CS5=1;CS6=1;
}
void select2(void)
{ //第二位数码管
CS1=1;CS2=0;CS3=1;CS4=1;CS5=1;CS6=1;
}
void select3(void)
{ //第三位数码管
CS1=1;CS2=1;CS3=0;CS4=1;CS5=1;CS6=1;
}
void select4(void)
{ //第四位数码管
CS1=1;CS2=1;CS3=1;CS4=0;CS5=1;CS6=1;
}
void select5(void)
{ //第五位数码管
CS1=1;CS2=1;CS3=1;CS4=1;CS5=0;CS6=1;
}
void select6(void)
{ //第六位数码管
CS1=1;CS2=1;CS3=1;CS4=1;CS5=1;CS6=0;
}
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro(void)
{
if(seconde==60) //秒钟设为60进制
{ seconde=0;
minite++;
if( minite==60) //分钟设为60进制
{ minite=0;
hour++;
if(hour==12) //时钟设为12进制
{hour=0; }
}
}
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan(void)
{
if(P1_0==0) //按键3秒的调整
{
delay(30);
if(P1_0==0)
{
seconde++;
if(seconde==60)
{seconde=0; }
}
}
if(P1_1==0) //按键2分的调整
{
delay(30);
if(P1_1==0)
{
minite++;
if(minite==60)
{minite=0;}
}
}
if(P1_2==0) //按键1小时的调整
{
delay(30);
if(P1_2==0)
{
hour++;
if(hour==24)
{hour=0; }
}
}
}
void time_0()interrupt 1 //定时器0 50ms
{
TH0=0x4c; //预置计数初值
TL0=0x00;
mstcnt++;
if(mstcnt==20)
{
seconde++;
mstcnt=0; //注意点。对计数单元的清零十分的重要,本次调试中就是
} //因为忽略了这一点,给我早成了很大的被动。
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{
P1=0xff; //初始化p1口,全设为1
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x4C;
EA=1; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
while (1)
{
keyscan( ); //按键扫描
time_pro( ); //时间处理
write595(hour/10); //要写的值
select1(); //显示第一位数码管
delay(1);
write595(hour%10); //要写的值
select2(); //显示第二位数码管
delay(1);
write595(minite/10); //要写的值
select3(); //显示第三位数码管
delay(1);
write595(minite%10); //要写的值
select4(); //显示第四位数码管
delay(1);
write595(seconde/10); //要写的值
select5(); //显示第五位数码管
delay(1);
write595(seconde%10); //要写的值
select6(); //显示第六位数码管
delay(1);
}
}
|
-
led.jpg
(208.87 KB, 下载次数: 23)
用人家的电路自己编程实现LED时钟
|