單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "move.h"
- #include "beep.h"
- #include "touch.h"
- #include "includes.h"
- #include "24cxx.h"
- #include "exti.h"
- #include "timer.h"
- #include "rtc.h"
- #include "joypad.h"
- u8 save[4];
- u8 save1[4];
- u8 save2[4];
- //u8 key_point[4];
- /////////////////////////UCOSII任務設置///////////////////////////////////
- //START 任務
- //設置任務優先級
- #define START_TASK_PRIO 10 //開始任務的優先級設置為最低
- //設置任務堆棧大小
- #define START_STK_SIZE 64
- //任務堆棧
- OS_STK START_TASK_STK[START_STK_SIZE];
- //任務函數
- void start_task(void *pdata);
- //設置密碼任務
- //設置任務優先級
- #define MAIN_TASK_PRIO 4
- //設置任務堆棧大小
- #define MAIN_STK_SIZE 128
- //任務堆棧
- OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
- //任務函數
- void main_task(void *pdata);
- //顯示時間任務
- //設置任務優先級
- #define RTC_TASK_PRIO 7
- //設置任務堆棧大小
- #define RTC_STK_SIZE 64
- //任務堆棧
- OS_STK RTC_TASK_STK[RTC_STK_SIZE];
- //任務函數
- void rtc_task(void *pdata);
- //解碼后任務
- //設置任務優先級
- #define SHOW_TASK_PRIO 9
- //設置任務堆棧大小
- #define SHOW_STK_SIZE 64
- //任務堆棧
- OS_STK SHOW_TASK_STK[SHOW_STK_SIZE];
- //任務函數
- void show_task(void *pdata);
- //按鍵掃描任務
- //設置任務優先級
- #define KEY_TASK_PRIO 3
- //設置任務堆棧大小
- #define KEY_STK_SIZE 64
- //任務堆棧
- OS_STK KEY_TASK_STK[KEY_STK_SIZE];
- //任務函數
- void key_task(void *pdata);
- //報警任務
- //設置任務優先級
- #define BEEP_TASK_PRIO 8
- //設置任務堆棧大小
- #define BEEP_STK_SIZE 64
- //任務堆棧
- OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
- //任務函數
- void beep_task(void *pdata);
- //輸入密碼
- //設置任務優先級
- #define put_TASK_PRIO 5
- //設置任務堆棧大小
- #define put_STK_SIZE 64
- //任務堆棧
- OS_STK put_TASK_STK[put_STK_SIZE];
- //任務函數
- void put_task(void *pdata);
- //重設任務
- //設置任務優先級
- #define CHANGE_TASK_PRIO 6
- //設置任務堆棧大小
- #define CHANGE_STK_SIZE 64
- //任務堆棧
- OS_STK CHANGE_TASK_STK[CHANGE_STK_SIZE];
- //任務函數
- void change_task(void *pdata);
- //數字表
- const u8* kbd_tbl[9]={"1","2","3","4","5","6","7","8","9",};
- void py_load_ui(u16 x,u16 y);
- void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta);
- void PWM(void);
- //void readfromBKP(void);
- //void writetoBKP(void);
- //得到觸摸屏的輸入
- //x,y:鍵盤坐標
- //返回值:按鍵鍵值(1~9有效;0,無效)
- u8 py_get_keynum(u16 x,u16 y)
- {
- u16 i,j;
- static u8 key_x=0;//0,沒有任何按鍵按下;1~9,1~9號按鍵按下
- u8 key=0;
- tp_dev.scan(0);
- if(tp_dev.sta&TP_PRES_DOWN) //觸摸屏被按下
- {
- for(i=0;i<3;i++)
- {
- for(j=0;j<4;j++)
- {
- if(tp_dev.x<(x+j*60+60)&&tp_dev.x>(x+j*60)&&tp_dev.y<(y+i*40+40)&&tp_dev.y>(y+i*40))
- {
- key=i*3+j+1;
- break;
- }
- }
- if(key)
- {
- if(key_x==key)key=0;
- else
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=key;
- py_key_staset(x,y,key_x-1,1);
- }
- break;
- }
- }
- }else if(key_x)
- {
- py_key_staset(x,y,key_x-1,0);
- key_x=0;
- }
- return key;
- }
-
- //////////////////////////////////////////////////////////////////////////////
- OS_EVENT * msg_key; //按鍵郵箱事件塊指針
- OS_EVENT * sem_beep; //蜂鳴器信號量指針
- object move; //移動函數時使用
- //加載主界面
- //void ucos_load_main_ui(void)
- //{
- //}
- int main(void)
- {
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為115200
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- PWR_BackupAccessCmd(ENABLE);
- LED_Init(); //初始化與LED連接的硬件接口
- BEEP_Init(); //蜂鳴器初始化
- KEY_Init(); //按鍵初始化
- LCD_Init(); //初始化LCD
- TP_Init(); //初始化觸摸屏
- EXTIX_Init(); //外部中斷初始化
- JOYPAD_Init();
- TIM5_Int_Init(59999,7199);//10Khz的計數頻率,計數到60000為6s
- TIM3_PWM_Init(899,0); //不分頻。PWM頻率=72000000/900=80Khz
- // ucos_load_main_ui(); //加載主界面
- RTC_Init();
- //顯示時間
- POINT_COLOR=BLUE;//設置字體為藍色
- LCD_ShowString(60,250,200,16,16," - - ");
- LCD_ShowString(60,282,200,16,16," : : ");
- OSInit(); //初始化UCOSII
- OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//創建起始任務
- OSStart();
- }
- //開始任務
- void start_task(void *pdata)
- {
- OS_CPU_SR cpu_sr=0;
- pdata = pdata;
- msg_key=OSMboxCreate((void*)0); //創建消息郵箱
- sem_beep=OSSemCreate(0); //創建信號量
- OSStatInit(); //初始化統計任務.這里會延時1秒鐘左右
- OS_ENTER_CRITICAL(); //進入臨界區(無法被中斷打斷)
- OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);
- OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);
- OSTaskCreate(beep_task,(void *)0,(OS_STK*)&BEEP_TASK_STK[BEEP_STK_SIZE-1],BEEP_TASK_PRIO);
- OSTaskCreate(put_task,(void *)0,(OS_STK*)&put_TASK_STK[put_STK_SIZE-1],put_TASK_PRIO);
- OSTaskCreate(rtc_task,(void *)0,(OS_STK*)&RTC_TASK_STK[RTC_STK_SIZE-1],RTC_TASK_PRIO);
- OSTaskCreate(show_task,(void *)0,(OS_STK*)&SHOW_TASK_STK[SHOW_STK_SIZE-1],SHOW_TASK_PRIO);
- OSTaskCreate(change_task,(void *)0,(OS_STK*)&CHANGE_TASK_STK[CHANGE_STK_SIZE-1],CHANGE_TASK_PRIO);
- OSTaskSuspend(START_TASK_PRIO); //掛起起始任務.
- OSTaskSuspend(9); //掛起顯示任務
- OS_EXIT_CRITICAL(); //退出臨界區(可以被中斷打斷)
- }
- //RTC時間顯示任務
- void rtc_task(void *pdata)
- {
- u8 t=0;
- while(1)
- {
- if(t!=calendar.sec)
- {
- t=calendar.sec;
- LCD_ShowNum(60,250,calendar.w_year,4,16);
- LCD_ShowNum(100,250,calendar.w_month,2,16);
- LCD_ShowNum(124,250,calendar.w_date,2,16);
- switch(calendar.week)
- {
- case 0:
- LCD_ShowString(60,266,200,16,16,"Sunday ");
- break;
- case 1:
- LCD_ShowString(60,266,200,16,16,"Monday ");
- break;
- case 2:
- LCD_ShowString(60,266,200,16,16,"Tuesday ");
- break;
- case 3:
- LCD_ShowString(60,266,200,16,16,"Wednesday");
- break;
- case 4:
- LCD_ShowString(60,266,200,16,16,"Thursday ");
- break;
- case 5:
- LCD_ShowString(60,266,200,16,16,"Friday ");
- break;
- case 6:
- LCD_ShowString(60,266,200,16,16,"Saturday ");
- break;
- }
- LCD_ShowNum(60,282,calendar.hour,2,16);
- LCD_ShowNum(84,282,calendar.min,2,16);
- LCD_ShowNum(108,282,calendar.sec,2,16);
- }
- delay_ms(10);
- }
- }
- //蜂鳴器任務
- void beep_task(void *pdata)
- {
- u8 err;
- while(1)
- {
- OSSemPend(sem_beep,0,&err);
- BEEP=1;
- delay_ms(60);
- BEEP=0;
- delay_ms(940);
- }
- }
- //游戲任務
- void show_task(void *pdata)
- {
- u8 k;
- delay_ms(10);
- move.position_x=100;
- move.position_y=150;
- move.size=7;
- move.color=RED;
- LCD_Draw_Circle(move.position_x,move.position_y, move.size);
- POINT_COLOR=RED;
- LCD_DrawLine(0, 248,240, 248);
- LCD_DrawLine(0,25,240,25);
- LCD_DrawLine(1,25,1, 248);
- LCD_DrawLine(239,25,239,248);
-
- gui_fill_circle(50,80,7,BLUE);
- gui_fill_circle(40,40,4,RED);
- gui_fill_circle(80,200,10,GREEN);
-
- while(1)
- {
- k=JOYPAD_Read();
- switch(k)
- {
- case 254:
- move=move_right(move);break;
- case 253:
- move=move_left(move);break;
- case 247:
- move=move_forward(move);break;
- case 251:
- move=move_back(move);break;
- }
- if(move.position_y-move.size==25)
- {BEEP=1;
- delay_ms(60);
- BEEP=0;
- delay_ms(940);
- move=move_back(move);
- LCD_DrawLine(0,25,240,25);
- }
- if(move.position_y+move.size==248)
- {BEEP=1;
- delay_ms(60);
- BEEP=0;
- delay_ms(940);
- move=move_forward(move);
- LCD_DrawLine(0, 248,240, 248);
- }
- if(move.position_x-move.size==1)
- {BEEP=1;
- delay_ms(60);
- BEEP=0;
- delay_ms(940);
- move=move_right(move);
- LCD_DrawLine(1,25,1, 248);
- }
- if(move.position_x+move.size==239)
- {BEEP=1;
- delay_ms(60);
- BEEP=0;
- delay_ms(940);
- move=move_left(move);
- LCD_DrawLine(239,25,239,248);
- }
-
- }
- }
- //設置密碼任務
- void main_task(void *pdata)
- {
- int m;
- u32 key1=0;
- u8 err;
- u8 i=0;
- u8 key;
- u8 inputstr[3]; //最大輸入6個字符+結束符
- u8 inputlen; //輸入長度
- POINT_COLOR=BLUE; //電量界面
- LCD_DrawRectangle(198,2,239,22);
- LCD_DrawRectangle(195,7,198,17);
- LCD_Fill(200,3,208,21,GREEN);
- LCD_Fill(210,3,218,21,GREEN);
- LCD_Fill(220,3,228,21,GREEN);
- LCD_Fill(230,3,238,21,GREEN);
- OSTaskSuspend(6); //掛起起始任務.
- m=BKP_ReadBackupRegister(BKP_DR6);
- if(m==1)
- {
- OSTaskSuspend(4); //掛起起始任務.
- }
- OSTaskSuspend(5); //掛起起始任務.
- py_load_ui(20,75);
- inputlen=0;
- POINT_COLOR=RED;
- LCD_ShowString(10,10,110,16,24,"Please set ");
- LCD_ShowString(20,50,110,16,24,"your code ");
-
- POINT_COLOR=BLUE;
-
- while(1)
- {
- i++;
- delay_ms(10);
- key=py_get_keynum(20,75);
- if(key)
- {
- key1=(u32)OSMboxPend(msg_key,10,&err);
- if(key1==4)//刪除
- {
- if(inputlen)inputlen--;
- inputstr[inputlen]='\0';//添加結束符
- Show_Str(140,55,35,16,inputstr,16,0); //顯示有效的數字串
- }
- if(inputlen<4)
- {
- save[inputlen]=key;
- inputstr[inputlen]=key+'0';//輸入字符
- inputlen++;
- }
- LCD_DrawRectangle(138,53,175,73);
- Show_Str(140,55,35,16,inputstr,16,0); //顯示有效的數字串
- if(inputlen==4)
- {
- BKP_WriteBackupRegister(BKP_DR6,1);
-
- BKP_WriteBackupRegister(BKP_DR2,save[0]);
- BKP_WriteBackupRegister(BKP_DR3,save[1]);
- BKP_WriteBackupRegister(BKP_DR4,save[2]);
- BKP_WriteBackupRegister(BKP_DR5,save[3]);
- OSTaskResume (5); //解掛
- OSTaskSuspend(4); //掛起起始任務.
-
- }
- }
- }
- }
- //按鍵掃描任務
- void key_task(void *pdata)
- {
- u32 key1;
- while(1)
- {
- key1=KEY_Scan(0);
- if(key1)OSMboxPost(msg_key,(void*)key1);//發送消息
- delay_ms(10);
- }
- }
- //后加
- //加載鍵盤界面
- //x,y:界面起始坐標
- void py_load_ui(u16 x,u16 y)
- {
- u16 i;
- LCD_Fill(0,50,240,200,WHITE);
- LCD_Fill(0,0,190,50,WHITE);//清屏
- POINT_COLOR=RED; //鍵盤界面
- LCD_DrawRectangle(x,y,x+180,y+120);
- LCD_DrawRectangle(x+60,y,x+120,y+120);
- LCD_DrawRectangle(x,y+40,x+180,y+80);
-
- POINT_COLOR=BLUE; //在鍵盤上加載數字
- for(i=0;i<9;i++)
- {
- Show_Str_Mid(x+(i%3)*60,y+4+40*(i/3),(u8*)kbd_tbl[i],24,60);
-
- }
- }
- //按鍵狀態設置
- //x,y:鍵盤坐標
- //key:鍵值(0~11)
- //sta:狀態,0,松開;1,按下;
- void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
- {
- u16 i=keyx/3,j=keyx%3;
- if(keyx>9)return;
- if(sta)LCD_Fill(x+j*60+1,y+i*40+1,x+j*60+59,y+i*40+39,GREEN);
- else LCD_Fill(x+j*60+1,y+i*40+1,x+j*60+59,y+i*40+39,WHITE);
- Show_Str_Mid(x+j*60,y+4+40*i,(u8*)kbd_tbl[keyx],24,60);
-
- }
- //輸入密碼任務
- void put_task(void *pdata)
- {
- u32 key1=0;
- u8 err;
- u8 key;
- u8 inputstr[3]; //最大輸入6個字符+結束符
- u8 inputlen; //輸入長度
- u8 t=0;
- u8 T[3];
- py_load_ui(20,75);
- inputlen=0;
-
- while(1)
- {
- delay_ms(10);
- PWM();
- if(c)
- {
- OSTaskResume (6); //解掛
- LED1=!LED1;
- OSTaskSuspend(5); //掛起起始任務.
- }
- POINT_COLOR=RED;
- LCD_ShowString(10,10,140,16,24,"Please input ");
- LCD_ShowString(20,50,110,16,24,"your code ");
- LCD_Fill(138,53,175,73,WHITE);
- POINT_COLOR=BLUE;
- key=py_get_keynum(20,75);
-
- if(key)
- {
- key1=(u32)OSMboxPend(msg_key,10,&err);
- if(key1==4)//刪除
- {
- if(inputlen)inputlen--;
- inputstr[inputlen]='\0';//添加結束符
- }
- if(inputlen<4)
- {
- save1[inputlen]=key;
- inputstr[inputlen]=key+'0';//輸入字符
- inputlen++;
- }
- Show_Str(140,55,35,16,inputstr,16,0); //顯示有效的數字串
- LCD_DrawRectangle(138,53,175,73);
- if(t<4)
- {
- T[t]='*';//顯示*
- t++;
- }
- Show_Str(140,55,35,16,T,16,0); //顯示成* 的形式
- }
- if(a) //中斷判斷
- {
- LCD_DrawRectangle(138,53,175,73);
- Show_Str(140,55,35,16,inputstr,16,0); //顯示有效的數字串
- }
- else
- {
- LCD_DrawRectangle(138,53,175,73);
- Show_Str(140,55,35,16,T,16,0); //顯示成* 的形式
- }
- if(inputlen==4)
- {
- save2[0]=BKP_ReadBackupRegister(BKP_DR2);
- save2[1]=BKP_ReadBackupRegister(BKP_DR3);
- save2[2]=BKP_ReadBackupRegister(BKP_DR4);
- save2[3]=BKP_ReadBackupRegister(BKP_DR5);
-
- key1=(u32)OSMboxPend(msg_key,0,&err);
- if(key1==2)//確定
- {
- if(save2[0]==save1[0]&&save2[1]==save1[1]&&save2[2]==save1[2]&&save2[3]==save1[3])
- {
- LED1=!LED1;
- LCD_Fill(0,50,240,200,WHITE);
- LCD_Fill(0,0,190,50,WHITE);//清屏
- USART_SendData(USART1, 1);//向串口1發送數據
- OSTaskSuspend(5); //掛起起始任務.
- }
- else
- {
- LED0=!LED0;
- OSSemPost(sem_beep);
- USART_SendData(USART1, 2);//向串口1發送數據
- delay_ms(1000);
- OSTaskSuspend(5); //掛起起始任務.
- }
- }
- }
- }
- }
- void PWM(void) //PWM呼吸燈
- {
- u8 dir=1;
- u16 led0pwmval=0;
- if(b==1)
- {
- while(1)
- {
- delay_ms(10);
- if(dir)led0pwmval++;
- else led0pwmval--;
- if(led0pwmval>300)dir=0;
- if(led0pwmval==0)dir=1;
- TIM_SetCompare2(TIM3,led0pwmval);
- }
- }
- }
- //重新設置密碼任務
- void change_task(void *pdata)
- {
- u32 key1=0;
- u8 err;
- u8 key;
- u8 inputstr[3]; //最大輸入6個字符+結束符
- u8 inputlen; //輸入長度
- POINT_COLOR=RED; //電量界面
- LCD_DrawRectangle(198,2,239,22);
- LCD_DrawRectangle(195,7,198,17);
- LCD_Fill(200,3,208,21,GREEN);
- LCD_Fill(210,3,218,21,GREEN);
- LCD_Fill(220,3,228,21,GREEN);
- LCD_Fill(230,3,238,21,GREEN);
-
- py_load_ui(20,75);
- inputlen=0;
- POINT_COLOR=RED;
- LCD_ShowString(10,10,110,16,24,"Please set ");
- LCD_ShowString(20,50,110,16,24,"your code ");
-
- POINT_COLOR=BLUE;
-
- while(1)
- {
- delay_ms(10);
- key=py_get_keynum(20,75);
- if(key)
- {
- key1=(u32)OSMboxPend(msg_key,10,&err);
- if(key1==4)//刪除
- {
- if(inputlen)inputlen--;
- inputstr[inputlen]='\0';//添加結束符
- Show_Str(140,55,35,16,inputstr,16,0); //顯示有效的數字串
- }
- if(inputlen<4)
- {
- save[inputlen]=key;
- inputstr[inputlen]=key+'0';//輸入字符
- inputlen++;
- }
- LCD_DrawRectangle(138,53,175,73);
- Show_Str(140,55,35,16,inputstr,16,0); //顯示有效的數字串
- if(inputlen==4)
- {
- BKP_WriteBackupRegister(BKP_DR6,1);
-
- BKP_WriteBackupRegister(BKP_DR2,save[0]);
- BKP_WriteBackupRegister(BKP_DR3,save[1]);
- BKP_WriteBackupRegister(BKP_DR4,save[2]);
- BKP_WriteBackupRegister(BKP_DR5,save[3]);
- c=0;
- OSTaskResume (5); //解掛
- LED1=!LED1;
- OSTaskSuspend(6); //掛起起始任務.
-
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
ARM實驗密碼鎖.rar
(530.04 KB, 下載次數: 133)
2018-1-15 02:59 上傳
點擊文件名下載附件
stm32的電子密碼鎖 下載積分: 黑幣 -5
|