|
30黑幣
最近在玩旋轉led屏幕,想單獨屏面顯示指針時鐘,側面數字時鐘或者日期也行,但是就是提取不了商家的代碼用后面老是有錯
- /*************************************************************
- 時鐘顯示程序
- 單片機 IAP15W4K61S4 或者其他51 晶振頻率 18.432M
- 字模軟件用 PC2002
- 逐列取模方式
- 電機旋轉方向 順時針
- /***********************************************************
- 說明:本程序支持配套遙控器調整時間
- 播放按鍵 切換調整 時、分、秒、月、日
- 加 按鍵:增加
- 減 按鍵:減少
- menu按鍵: 時鐘復位
- 遙控器按鍵1 :平面顯示文字+側面顯示時鐘 可調時
- 遙控器按鍵2 :平面指針時鐘+側面顯示文字
- *************************************************************/
- #include "NEW_8051.H"
- #include "intrins.h"
- #include "task.h"
- #define FOSC 18432000L //系統頻率
- #define BAUD 115200 //串口波特率
- bit Scan_bit=0;
- uint Offset=0;
- bit BIT_timeout=0;
- uchar ucMode=1; //模式
- bit Time0_flag=0; //定時器T0中斷標志位
- uchar DISP_LINE=0;
- uint Pt=50,S0,T,D; //計數用的變量
- 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; //起點標志位
- if(ucMode!=1)
- {
- D+=(DISP_LINE-180)*2; //修正值
- Pt=205+D;
- //得到定時器T0的初設值
- TH0=-Pt/256;
- TL0=-Pt%256; //設置定時器T0的初設值
- DISP_LINE=0; //計數器清零,將重新計數
- switch (ucMode)
- {
- case 0x02:
- du1302();//獲取時間
- 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);//時針定位="時"*15+"分"/4
- Cent=Cent*3;//分針定位="分"*3
- Offset++;
- if(Offset>672)//側面有多少文字 這個值就對應改成 多少字*16
- Offset=0;
- break;
- case 0x03:
- du1302();//獲取時間
- 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) /*從串口發送數據*/
- {
- ES=0;
- SBUF=d;
- while(TI==0); //等待發送完畢
- TI=0;
- ES=1;
- }
- /*************************************/
- //圖片切換以及模擬表盤顯示函數
- 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;
- //標整點,以及顯示數字12,3,6,9
- if ( (DISP_LINE >= 175) || (DISP_LINE <= 3)) //12點
- {
- ucAdder=DISP_LINE+4 ;
- if ( ucAdder>=180) ucAdder=ucAdder-180 ;
- }
- else if ( (DISP_LINE >= 41) && (DISP_LINE <= 48)) //3點
- {
- ucAdder=DISP_LINE-41+8*1 ;
- }
- else if ( (DISP_LINE >= 86) && (DISP_LINE <= 93)) //6點
- {
- ucAdder=DISP_LINE-86+8*2 ;
- }
- else if ( (DISP_LINE >= 131) && (DISP_LINE <= 138)) //9點
- {
- ucAdder=DISP_LINE-131+8*3 ;
- }
- else
- {
- ucAdder=250;
- /*************形成表盤*******************/
- switch (DISP_LINE)
- {
- case 180*1/12 : //1點
- case 180*2/12 : //2點
- case 180*4/12 : //4點
- case 180*5/12 : //5點
- case 180*7/12 : //6點
- case 180*8/12 : //7點
- case 180*10/12 : //10點
- case 180*11/12 : //11點
- //LED=0;
- PortA(0X0F);
- break;
- }
- }
- if ( ucAdder < 32 )
- {
- PortA(TAB_12369[ucAdder]) ; //查表顯示12,3,6,9
-
- }
- /****************************************/
- //顯示指針"時"
- // i = Hour ;
- // j = Hour ;
- // if ( ++i > 179 ) i=0 ; //i+1,結果>179,則清零
- // if ( --j > 179 ) i=179 ; //j-1,結果為負,則重新賦值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口 為準雙向口
- 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);//測試
- Show_L(0x55,0x55,0x55,0x55);//測試
- AUXR &= 0x7F; //定時器時鐘12T模式 //200us
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0xCD; //設置定時初值
- TH0 = 0xFE; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0=1;
- AUXR &= 0xBF; //定時器時鐘12T模式
- TMOD &= 0x0F; //設置定時器模式
- TMOD |= 0x20; //設置定時器模式
- TL1 = 0x12; //設置定時初值 155US
- TH1 = 0x12; //設置定時重載值
- TF1 = 0; //清除TF1標志
- ET1=1;
- TR1 = 0; //定時器1開始計時
- SCON = 0x50;
- T2L = (65536 - (FOSC/4/BAUD)); //設置波特率重裝值
- T2H = (65536 - (FOSC/4/BAUD))>>8;
- AUXR = 0x14; //T2為1T模式, 并啟動定時器2
- AUXR |= 0x01; //選擇定時器2為串口1的波特率發生器
- // ES = 1; //使能串口1中斷
- IT0 = 1; //外部中斷為邊沿觸發
- //設置INT0的中斷類型 (1:僅下降沿 0:上升沿和下降沿)
- EX0 = 1; //使能INT0中斷
- IT1=1;
- EX1=1;//外部中斷1 下降沿 中斷
- EA = 1;
- }
- /************************************/
- void Timer0Interrupt(void) interrupt 1
- {
- Time0_flag=1; //定時中斷標志位置1;
- TH0=-Pt/256;TL0=-Pt%256; //設置定時器T0的初設值
- DISP_LINE++; //計數
- }
- /*****主函數*****/
- void main(void)
- {
- Init();
- Auto_Set1302(starts_time);//自動初始化時鐘
- Send_uart(0x55);
-
- //主程序
- while(1)
- {
- if((ucMode==2)||(ucMode==3))
- {
- display_pic();
- }
- //BIT_timeout=1;
- if(BIT_timeout==1) //起點判斷
- {
- BIT_timeout=0; //清零
-
- Scan_bit=1;// 起點檢測到后 LED不再流水測試
- if( new_code ) //有紅外按鍵
- {
- new_code=0;
- switch( key_code ) //根據不同的按鍵值執行不同的動作
- {
- case 0x0C:
- ucMode=0x01;//數字鐘模式+側面文字
- TR0 = 0;
- break;
- case 0x18:
- ucMode=0x02;//指針式時鐘模式
- TR0 = 1;
- break;
- case 0x5E:
- // ucMode=0x03;//指針時鐘模式
- TR0=1;
- break;
- case 0x40: //調時加
- Set(id,1);
- break;
-
- case 0x19: //調時減
- Set(id,0);
-
- break;
-
- case 0x15://調時切換
- id++;
- if(id>5)
- {
- id=0;
- }
- break;
- case 0x47://時鐘初始化
- Set1302(starts_time); //初始化
- W1302(0x8e,0x00); //控制命令,WP=0,寫操作
- W1302(0x90,0xa5); //打淶二級? 一個二級管串聯一個2K玷
- //write_1302Data(DISP_TIME_adder,160);
- break;
-
- default: break;
- }
- key_code=0;
- }
-
- if(ucMode==1)
- {
- du1302();//讀取時鐘芯片 的時鐘數據
- Show_line_time();//顯示時間
- }
- }
-
- }
- }
復制代碼
|
|