|
用1602顯示時間
單片機內部定時器計數
按鍵控制臺燈
藍牙控制臺燈
c3bebeff6fbc345c8d3ad5e275ea492.jpg (2.96 MB, 下載次數: 60)
下載附件
2020-4-10 08:46 上傳
- //用51單片機僅更換頭文件即可套用
- #include <STC12C5A60S2.H>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- void UsartConfiguration();
- sbit k = P2^4; //開燈
- sbit led = P1^0; //led燈
- sbit EP = P2^7; //使能端
- sbit RW = P2^5; //數據/命令選擇端
- sbit RS = P2^6; //讀寫選擇端
- sbit KEY_1 = P3^2; //按鍵設置模式選擇
- sbit KEY_2 = P3^3; //按鍵
- static uint code table1[] = {0, 31, 60, 91, 121, 152,182, 213, 243, 274, 304, 335};
- static uchar code *Week[7] = {"Sun","Mon","Tue" ,"Wed", "Thu", "Fri", "Sat"};
- uchar sec = 0, hour = 12, minu = 0;
- uchar count = 0, week = 0; month = 1, day = 1;
- uint a,num;
- void InitTimer0()
- {
- ET0 = 1;
- TMOD = 0x21;
- TH0 = (65536 - 46071)/256;
- TL0 = (65536 - 46071)%256;
- TR0 = 1;
- }
- void delay(uint ms)
- {
- uint i, j;
- for(i=ms; i>0; i--)
- for(j=920; j>0; j--);
- }
- void Write_Cmd(uchar cmd) //寫入命令
- {
- // Lcd_Ready();
- RS = 0;
- RW = 0;
- EP = 0;
- P0 = cmd;
- delay(5);
- EP = 1;
- delay(5);
- EP = 0;
- }
- void Write_Dat(uchar dat) //寫入數據
- {
- // Lcd_Ready(); //LCD1602 不忙則跳出
- RS = 1;
- RW = 0;
- EP = 0;
- P0 = dat;
- delay(5);
- EP = 1;
- delay(5);
- EP = 0;
- }
- void Write_Week(uchar day, uchar month) //星期與日期同步
- {
- week = (table1[(month - 1)] + day -5);
- week = week % 7;
- Write_Cmd(0x80 + 12);
- while(*Week[week] != '\0')
- Write_Dat(*Week[week]++);
- }
- void Write_Num(uchar x, uchar y, uchar num) //將時分秒和日期寫入1602
- {
- uchar unit, decad;
- unit = num % 10;
- decad = num /10;
- if(y == 1)
- {
- Write_Cmd(0x80 + 0x40 + x);
- Write_Dat(0x30 + decad); //即加48,將數字轉換為ASC||字符數字
- Write_Dat(0x30 + unit);
- }
- else
- {
- Write_Cmd(0x80 + x);
- Write_Dat(0x30 + decad);
- Write_Dat(0x30 + unit);
- }
- }
- void Lcd_Init() //LCD初始化設定
- {
- Write_Cmd(0x38); // 16*2顯示,5*7點陣,8位數據
- Write_Cmd(0x0c); // 顯示開,關光標
- Write_Cmd(0x06); // 讀寫地址自動加1,光標加1
- Write_Cmd(0x01); //清除屏幕
- Write_Cmd(0x80);
- }
- void Display() //
- {
- Write_Week(day, month);
- Write_Num(9, 0, day);
- Write_Num(6, 0, month);
- Write_Num(4, 1, hour);
- Write_Num(7, 1, minu);
- Write_Num(10, 1, sec);
- Write_Cmd(0x80 + 0x40 + 6);
- Write_Dat(':');
- Write_Cmd(0x80 + 0x40 + 9);
- Write_Dat(':');
- }
- void TimerCount()
- {
- if(count == 20)
- {
- count = 0;
- sec++;
- if(sec == 60)
- {
- sec = 0;
- minu++;
- if(minu == 60)
- {
- minu = 0;
- hour++;
- if(hour == 24)
- {
- hour = 0;
- day++;
- week++;
- if(week == 7)
- week = 0;
- switch(month)
- {
- case 1:
- if(day == 32)
- {
- day = 0;
- month++;
-
- break;
- }
- case 2:
- if(day == 29)
- {
- day = 0;
- month++;
-
- break;
- }
- case 3:
- if(day == 32)
- {
- day = 0;
- month++;
- Write_Num(6, 0, month);
- break;
- }
- case 4:
- if(day == 31)
- {
- day = 0;
- month++;
-
- break;
- }
- case 5:
- if(day == 32)
- {
- day = 0;
- month++;
-
- break;
- }
- case 6:
- if(day == 31)
- {
- day = 0;
- month++;
-
- break;
- }
- case 7:
- if(day == 32)
- {
- day = 0;
- month++;
-
- break;
- }
- case 8:
- if(day == 32)
- {
- day = 0;
- month++;
-
- break;
- }
- case 9:
- if(day == 31)
- {
- day = 0;
- month++;
-
- break;
- }
- case 10:
- if(day == 32)
- {
- day = 0;
- month++;
-
- break;
- }
- case 11:
- if(day == 31)
- {
- day = 0;
- month++;
- Write_Num(6, 0, month);
- break;
- }
- case 12:
- if(day == 32)
- {
- day = 0;
- month = 1;
- Write_Num(6, 0, month);
- break;
- }
- }
-
- }
-
- }
-
- }
- Display();
- }
- }
- void KeyScan()
- {
- static uchar key1cnt = 0; //KEY_1按下的次數
-
- if(KEY_1 == 0)
- {
- delay(10);
- if(KEY_1 == 0)
- {
- key1cnt++;
- while(!KEY_1);
- switch(key1cnt)
- {
- case 1:
- TR0 = 0;
- Write_Cmd(0x80 + 0x40 + 5);
- Write_Cmd(0x0F); //顯示光標且光標閃爍
- break;
- case 2:
- Write_Cmd(0x80 + 0x40 + 8);
- break;
- case 3:
- Write_Cmd(0x80 + 0x40 + 11);
- break;
- case 4:
- Write_Cmd(0x80 + 7);
- break;
- case 5:
- Write_Cmd(0x80 + 10);
- break;
- case 6:
- TR0 = 1;
- Write_Cmd(0x0C); //不顯示光標
- key1cnt = 0;
- break;
- }
- }
- }
- if(key1cnt != 0)
- {
- if(KEY_2 == 0)
- {
- delay(10);
- if(KEY_2 == 0)
- {
- while(!KEY_2);
- switch(key1cnt)
- {
- case 1:
- hour++;
- if(hour == 24)
- hour = 0;
- Write_Num(4, 1, hour);
- Write_Cmd(0x80 + 0x40 + 5);
- break;
- case 2:
- minu++;
- if(minu == 60)
- minu = 0;
- Write_Num(7, 1, minu);
- Write_Cmd(0x80 + 0x40 + 8);
- break;
- case 3:
- sec++;
- if(sec == 60)
- sec = 0;
- Write_Num(10, 1, sec);
- Write_Cmd(0x80 + 0x40 + 11);
- break;
- case 4:
- month++;
- if(month == 13)
- month = 1;
- Write_Num(6, 0, month);
- Write_Cmd(0x80 + 7);
- break;
- case 5:
- day++;
- if(day == 32)
- day = 1;
- Write_Num(9, 0, day);
- Write_Cmd(0x80 + 10);
- break;
- }
- }
- }
- }
- }
- void desp_led()
- {
- if(k==0)
- {
- delay(50);
-
- if(k==0)
- {
- a++;
- if(a==2)
- a=0;
- }
- }
- if(a==0)
- {
- led=0;
- }
- if(a==1)
- {
- led=1;
- }
- while(!k);
-
- }
- /***************** 主函數******************/
- /***************** 主函數******************/
- void main()
- {
- uchar i = 0;
- uchar code table[] = {"2020-01-01 Wed"};
- EA = 1;
- Lcd_Init(); //1602初始化
- InitTimer0(); //定時器0初始化
- UsartConfiguration(); //調用藍牙接受的參數
- P1M0=0XFF;
- P1M1=0X00;
- Write_Cmd(0x80 + 1);
- while(table[i] != '\0')
- {
- Write_Dat(table[i]);
- i++;
- }
-
- while(1)
- {
- desp_led();
- KeyScan();
- SBUF=num;//藍牙
- if(num == 'm') //滅
- {
- led=0;
- a=0;
- }
- if(num == 'l') //亮
- {
- led=1;
- a=1;
- }
- if(num == 'b') //半亮
- {
- led=1;
- delay(50); //設置為75%亮度
- led=0;
- }
- }
- }
- /***************** 主函數******************/
- /***************** 主函數******************/
- 具體源文件查看壓縮包,該作品移植性能好
復制代碼 |
|