標(biāo)題:
單片機(jī)時(shí)鐘顯示程序 要怎么提取出平面指針的代碼?
[打印本頁(yè)]
作者:
SReson
時(shí)間:
2020-12-23 15:41
標(biāo)題:
單片機(jī)時(shí)鐘顯示程序 要怎么提取出平面指針的代碼?
最近在玩旋轉(zhuǎn)led屏幕,想單獨(dú)屏面顯示指針時(shí)鐘,側(cè)面數(shù)字時(shí)鐘或者日期也行,但是就是提取不了商家的代碼用后面老是有錯(cuò)
/*************************************************************
時(shí)鐘顯示程序
單片機(jī) IAP15W4K61S4 或者其他51 晶振頻率 18.432M
字模軟件用 PC2002
逐列取模方式
電機(jī)旋轉(zhuǎn)方向 順時(shí)針
/***********************************************************
說(shuō)明:本程序支持配套遙控器調(diào)整時(shí)間
播放按鍵 切換調(diào)整 時(shí)、分、秒、月、日
加 按鍵:增加
減 按鍵:減少
menu按鍵: 時(shí)鐘復(fù)位
遙控器按鍵1 :平面顯示文字+側(cè)面顯示時(shí)鐘 可調(diào)時(shí)
遙控器按鍵2 :平面指針時(shí)鐘+側(cè)面顯示文字
*************************************************************/
#include "NEW_8051.H"
#include "intrins.h"
#include "task.h"
#define FOSC 18432000L //系統(tǒng)頻率
#define BAUD 115200 //串口波特率
bit Scan_bit=0;
uint Offset=0;
bit BIT_timeout=0;
uchar ucMode=1; //模式
bit Time0_flag=0; //定時(shí)器T0中斷標(biāo)志位
uchar DISP_LINE=0;
uint Pt=50,S0,T,D; //計(jì)數(shù)用的變量
uchar ucAdder=0;
uchar code TAB_12369[]=
{
0xFF,0x03,0xFF,0xB3,0x6B,0x6B,0x9B,0xFF,
0x8F,0x77,0x7F,0x8F,0x7F,0x77,0x8F,0xFF,//3
0xFF,0xFF,0x9F,0x6D,0x6D,0x6B,0x87,0xFF,//6
0x9F,0xEF,0xF7,0x87,0x77,0x77,0x8F,0xFF,///9
};
/*********中斷子程序**********/
void int0() interrupt 0 //使用外部中斷0
{
BIT_timeout=1; //起點(diǎn)標(biāo)志位
if(ucMode!=1)
{
D+=(DISP_LINE-180)*2; //修正值
Pt=205+D;
//得到定時(shí)器T0的初設(shè)值
TH0=-Pt/256;
TL0=-Pt%256; //設(shè)置定時(shí)器T0的初設(shè)值
DISP_LINE=0; //計(jì)數(shù)器清零,將重新計(jì)數(shù)
switch (ucMode)
{
case 0x02:
du1302();//獲取時(shí)間
Sec=Sec/16*10+Sec%16 ;
Cent=Cent/16*10+Cent%16 ;
Hour=Hour/16*10+Hour%16 ;
if(Hour>11)
{
Hour=Hour-12;
}
Sec=Sec*3;//秒針定位="秒"*3
Hour=(Hour*15)+(Cent/4);//時(shí)針定位="時(shí)"*15+"分"/4
Cent=Cent*3;//分針定位="分"*3
Offset++;
if(Offset>672)//側(cè)面有多少文字 這個(gè)值就對(duì)應(yīng)改成 多少字*16
Offset=0;
break;
case 0x03:
du1302();//獲取時(shí)間
Sec=Sec/16*10+Sec%16 ;
Cent=Cent/16*10+Cent%16 ;
Hour=Hour/16*10+Hour%16 ;
if(Hour>12)
{
Hour=Hour-12;
}
break;
default:
break;
}
}
}
/******************************************/
void Send_uart(unsigned char d) /*從串口發(fā)送數(shù)據(jù)*/
{
ES=0;
SBUF=d;
while(TI==0); //等待發(fā)送完畢
TI=0;
ES=1;
}
/*************************************/
//圖片切換以及模擬表盤顯示函數(shù)
void display_pic()
{
//uchar date1,date2,date3,date4;
if(DISP_LINE<180)
{
if(Time0_flag)
{
Time0_flag=0;
Close();
if(ucMode==2)
{
//DISP_LINE=DISP_LINE-1;
//標(biāo)整點(diǎn),以及顯示數(shù)字12,3,6,9
if ( (DISP_LINE >= 175) || (DISP_LINE <= 3)) //12點(diǎn)
{
ucAdder=DISP_LINE+4 ;
if ( ucAdder>=180) ucAdder=ucAdder-180 ;
}
else if ( (DISP_LINE >= 41) && (DISP_LINE <= 48)) //3點(diǎn)
{
ucAdder=DISP_LINE-41+8*1 ;
}
else if ( (DISP_LINE >= 86) && (DISP_LINE <= 93)) //6點(diǎn)
{
ucAdder=DISP_LINE-86+8*2 ;
}
else if ( (DISP_LINE >= 131) && (DISP_LINE <= 138)) //9點(diǎn)
{
ucAdder=DISP_LINE-131+8*3 ;
}
else
{
ucAdder=250;
/*************形成表盤*******************/
switch (DISP_LINE)
{
case 180*1/12 : //1點(diǎn)
case 180*2/12 : //2點(diǎn)
case 180*4/12 : //4點(diǎn)
case 180*5/12 : //5點(diǎn)
case 180*7/12 : //6點(diǎn)
case 180*8/12 : //7點(diǎn)
case 180*10/12 : //10點(diǎn)
case 180*11/12 : //11點(diǎn)
//LED=0;
PortA(0X0F);
break;
}
}
if ( ucAdder < 32 )
{
PortA(TAB_12369[ucAdder]) ; //查表顯示12,3,6,9
}
/****************************************/
//顯示指針"時(shí)"
// i = Hour ;
// j = Hour ;
// if ( ++i > 179 ) i=0 ; //i+1,結(jié)果>179,則清零
// if ( --j > 179 ) i=179 ; //j-1,結(jié)果為負(fù),則重新賦值179
if(( (Hour-2)<=DISP_LINE)&&((Hour+2)>=DISP_LINE) )
{
if(((Hour-1)==DISP_LINE)||((Hour+1)==DISP_LINE))
{
PortD(0XFF);
PortC(0XBF);
}
else if(((Hour-2)==DISP_LINE)||((Hour+2)==DISP_LINE))
{
PortD(0XFF);
PortC(0XDF);
}
}
if(Hour==DISP_LINE)//||(DISP_LINE==i)||(DISP_LINE==j
{
PortD(0X80) ;
PortC(0X00);
}
//顯示指針"分"
if(( (Cent-2)<=DISP_LINE)&&((Cent+2)>=DISP_LINE) )
{
if(((Cent-1)==DISP_LINE)||((Cent+1)==DISP_LINE))
{
PortC(0XFF);
PortB(0XFB);
PortD(0XFF);
}
else if(((Cent-2)==DISP_LINE)||((Cent+2)==DISP_LINE))
{
PortC(0XFF);
PortB(0XFD);
PortD(0XFF);
}
}
if(Cent==DISP_LINE)
{
//PortB=(0X00);
PortC(0X00);
PortB(0XF0);
PortD(0X80);
}
//顯示指針"秒"
if(( (Sec-2)<=DISP_LINE)&&((Sec+2)>=DISP_LINE) )
{
if(((Sec-1)==DISP_LINE)||((Sec+1)==DISP_LINE))
{
PortB(0XBF);
PortC(0XFF);
PortD(0XFF);
}
else if(((Sec-2)==DISP_LINE)||((Sec+2)==DISP_LINE))
{
PortB(0XDF);
PortC(0XFF);
PortD(0XFF);
}
}
if(Sec==DISP_LINE)
{
PortB(0X00);
PortC(0X00);
PortD(0X80);
}
//DISP_LINE=DISP_LINE+1;
Show_R(Lzimo[(DISP_LINE+Offset)*2],Lzimo[(DISP_LINE+Offset)*2+1]);//送16*16文字顯示
}
}
}
}
/*********************************************/
void Init(void)
{
P0M0=0X00;//初始化IO口 為準(zhǔn)雙向口
P0M1=0X00;
P1M0=0X00;
P1M1=0X00;
P2M0=0X00;
P2M1=0X00;
P3M0=0X00;
P3M1=0X00;
P4M0=0X00;
P4M1=0X00;
P5M0=0X00;
P5M1=0X00;
P6M0=0X00;
P6M1=0X00;
P7M0=0X00;
P7M1=0X00;
Show_R(0x55,0x55);//測(cè)試
Show_L(0x55,0x55,0x55,0x55);//測(cè)試
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式 //200us
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TMOD |= 0x01; //設(shè)置定時(shí)器模式
TL0 = 0xCD; //設(shè)置定時(shí)初值
TH0 = 0xFE; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0=1;
AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0x0F; //設(shè)置定時(shí)器模式
TMOD |= 0x20; //設(shè)置定時(shí)器模式
TL1 = 0x12; //設(shè)置定時(shí)初值 155US
TH1 = 0x12; //設(shè)置定時(shí)重載值
TF1 = 0; //清除TF1標(biāo)志
ET1=1;
TR1 = 0; //定時(shí)器1開始計(jì)時(shí)
SCON = 0x50;
T2L = (65536 - (FOSC/4/BAUD)); //設(shè)置波特率重裝值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2為1T模式, 并啟動(dòng)定時(shí)器2
AUXR |= 0x01; //選擇定時(shí)器2為串口1的波特率發(fā)生器
// ES = 1; //使能串口1中斷
IT0 = 1; //外部中斷為邊沿觸發(fā)
//設(shè)置INT0的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
EX0 = 1; //使能INT0中斷
IT1=1;
EX1=1;//外部中斷1 下降沿 中斷
EA = 1;
}
/************************************/
void Timer0Interrupt(void) interrupt 1
{
Time0_flag=1; //定時(shí)中斷標(biāo)志位置1;
TH0=-Pt/256;TL0=-Pt%256; //設(shè)置定時(shí)器T0的初設(shè)值
DISP_LINE++; //計(jì)數(shù)
}
/*****主函數(shù)*****/
void main(void)
{
Init();
Auto_Set1302(starts_time);//自動(dòng)初始化時(shí)鐘
Send_uart(0x55);
//主程序
while(1)
{
if((ucMode==2)||(ucMode==3))
{
display_pic();
}
//BIT_timeout=1;
if(BIT_timeout==1) //起點(diǎn)判斷
{
BIT_timeout=0; //清零
Scan_bit=1;// 起點(diǎn)檢測(cè)到后 LED不再流水測(cè)試
if( new_code ) //有紅外按鍵
{
new_code=0;
switch( key_code ) //根據(jù)不同的按鍵值執(zhí)行不同的動(dòng)作
{
case 0x0C:
ucMode=0x01;//數(shù)字鐘模式+側(cè)面文字
TR0 = 0;
break;
case 0x18:
ucMode=0x02;//指針式時(shí)鐘模式
TR0 = 1;
break;
case 0x5E:
// ucMode=0x03;//指針時(shí)鐘模式
TR0=1;
break;
case 0x40: //調(diào)時(shí)加
Set(id,1);
break;
case 0x19: //調(diào)時(shí)減
Set(id,0);
break;
case 0x15://調(diào)時(shí)切換
id++;
if(id>5)
{
id=0;
}
break;
case 0x47://時(shí)鐘初始化
Set1302(starts_time); //初始化
W1302(0x8e,0x00); //控制命令,WP=0,寫操作
W1302(0x90,0xa5); //打淶二級(jí)? 一個(gè)二級(jí)管串聯(lián)一個(gè)2K玷
//write_1302Data(DISP_TIME_adder,160);
break;
default: break;
}
key_code=0;
}
if(ucMode==1)
{
du1302();//讀取時(shí)鐘芯片 的時(shí)鐘數(shù)據(jù)
Show_line_time();//顯示時(shí)間
}
}
}
}
復(fù)制代碼
實(shí)驗(yàn)4、 指針式時(shí)鐘顯示程序.zip
2020-12-23 15:41 上傳
點(diǎn)擊文件名下載附件
124.2 KB, 下載次數(shù): 2
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1