基于stc15f2k60s2芯片单片机编程(按键的长短按)
生活随笔
收集整理的這篇文章主要介紹了
基于stc15f2k60s2芯片单片机编程(按键的长短按)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(一)程序現象
(DS1302+超聲波)上電顯示超聲波,按下S7切換為時鐘,松開切換為超聲波測距(二)程序思路
關鍵按鍵如何去設置,以下是按鍵程序。
if(s4==0){Delay10ms();if(s4==0){ while(1){DS_get();saomiao[0]=abile[TIME[2]/16];saomiao[1]=abile[TIME[2]%16];saomiao[2]=0xbf;saomiao[3]=abile[TIME[1]/16];saomiao[4]=abile[TIME[1]%16];saomiao[5]=0xbf;saomiao[6]=abile[TIME[0]/16];saomiao[7]=abile[TIME[0]%16];if(s4!=0)break;}}while(!s4);}當按鍵按下的時候(沒松開),按鍵會一直在while里不出來。當按鍵松開的時候就可以跳出去。短按直接在while外面進行設置就好了。
(三)程序設計
main.c函數
#include <stc15f2k60s2.h> #include <intrins.h> #include "ds1302.h"void shumaguan(); void Timer0Init(); void Delay500ms();unsigned char abile[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF}; unsigned char saomiao[]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF}; unsigned int distance;void Send_Wave(); sbit TX=P1^0; sbit RX=P1^1; sbit s4=P3^0; unsigned int t=0; void Delay12us(); void mdistance(); void xianshi(); void Delay10ms();void main() { Timer0Init(); P2=0XA0;P0=0X00; DS_init();while(1){mdistance();xianshi();} }void xianshi() {if(distance ==99){saomiao[0]=0x90;saomiao[1]=0x90;saomiao[2]=0x90;Delay500ms();saomiao[3]=saomiao[4]=saomiao[5]=saomiao[6]=saomiao[7]=0xff;}else{saomiao[0]=abile[distance%1000/1000];saomiao[1]=abile[distance%100/10];saomiao[2]=abile[distance%10];Delay500ms();saomiao[3]=saomiao[4]=saomiao[5]=saomiao[6]=saomiao[7]=0xff;}if(s4==0){Delay10ms();if(s4==0){ while(1){DS_get();saomiao[0]=abile[TIME[2]/16];saomiao[1]=abile[TIME[2]%16];saomiao[2]=0xbf;saomiao[3]=abile[TIME[1]/16];saomiao[4]=abile[TIME[1]%16];saomiao[5]=0xbf;saomiao[6]=abile[TIME[0]/16];saomiao[7]=abile[TIME[0]%16];if(s4!=0)break;}}while(!s4);} }void Delay10ms() //@11.0592MHz {unsigned char i, j;i = 108;j = 145;do{while (--j);} while (--i); }void Delay500ms() //@11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i = 22;j = 3;k = 227;do{do{while (--k);} while (--j);} while (--i); }void weixuan() interrupt 1 {unsigned char i;P2=P2&0x1f|0xe0;P0=0xff;P2=0x1f;P2=P2&0x1f|0xc0;P0=1<<i;P2=0x1f;P2=P2&0x1f|0xe0;P0=saomiao[i];P2=0x1f;i++;if(i==8) i=0; } void Timer0Init() //100??@11.0592MHz {AUXR |= 0x80; //?????1T??TMOD &= 0xF0; //???????TL0 = 0x9A; //??????TH0 = 0xA9; //??????TF0 = 0; //??TF0??TR0 = 1; //???0???? EA=1;ET0=1; }void Send_Wave() {unsigned char i;for(i=0;i<8;i++){TX=1;Delay12us();TX=0;Delay12us();} } void mdistance() { unsigned int time=0;TMOD&=0X0F;//定時器1模式TL1=0;TH1=0;//初始化Send_Wave(); //發送聲波信號TR1=1;//啟動定時器while((RX==1)&&(TF1==0)) ;//等待超聲波信號返回或者等到測量超出范圍TR1=0; //停止定時器if(TF1==0){t=TH1;t=(t<<8)|TL1; //將計算值裝到16為計數器distance=t*0.017;//測量距離}else{ TF1=0;//禁止中斷溢出distance=99;} // if(distance>=30) // {P2=0XA0;P0=0Xff;P2=0X1F;} // else // {P2=0XA0;P0=0X00;P2=0X1F;}} void Delay12us() {unsigned char i;_nop_();_nop_();i = 33;while (--i); }ds1302.c函數
#include<ds1302.h>sbit SCK=P1^7; sbit SDA=P2^3; sbit RST = P1^3; // DS1302?? unsigned char code READ_RTCADDR[7]={0X81,0X83,0X85,0X87,0X89,0X8B,0X8D}; unsigned char code WRITE_RTCADDR[7]={0x80,0X82,0X84,0X86,0X88,0X8C,0X8E};char TIME[7]={0x50,0x59,0x23};void Write_Ds1302(unsigned char temp) {unsigned char i;for (i=0;i<8;i++) { SCK=0;SDA=temp&0x01;temp>>=1; SCK=1;} } void Write_Ds1302_Byte( unsigned char address,unsigned char dat ) {RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_(); Write_Ds1302(address); Write_Ds1302(dat); RST=0; }unsigned char Read_Ds1302_Byte ( unsigned char address ) {unsigned char i,temp=0x00;RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_();Write_Ds1302(address);for (i=0;i<8;i++) { SCK=0;temp>>=1; if(SDA)temp|=0x80; SCK=1;} RST=0; _nop_();SCK=0; _nop_();SCK=1; _nop_();SDA=0; _nop_();SDA=1; _nop_();return (temp); } void DS_init() {unsigned char n;Write_Ds1302_Byte(0x8e,0x00);//關閉寫保護for(n=0;n<3;n++)Write_Ds1302_Byte(WRITE_RTCADDR[n],TIME[n]);Write_Ds1302_Byte(0x8e,0x80); }void DS_get() {unsigned char n;for(n=0;n<3;n++)TIME[n]=Read_Ds1302_Byte (READ_RTCADDR[n]); }ds1302.h函數
#ifndef __DS1302_H_ #define __DS1302_H_#include<stc15f2k60s2.h> #include<intrins.h>void Write_Ds1302(unsigned char temp) ; void Write_Ds1302_Byte( unsigned char address,unsigned char dat ) ; unsigned char Read_Ds1302_Byte ( unsigned char address ); void DS_init(); void DS_get(); extern char TIME[7];//---??????--//#endif總結
以上是生活随笔為你收集整理的基于stc15f2k60s2芯片单片机编程(按键的长短按)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Github 王炸功能!Copilot
- 下一篇: ElementUI 组件库 md-loa