|
單片機程序
#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)
下載附件
2019-6-30 18:08 上傳
用人家的電路自己編程實現LED時鐘
|