標題: 求助用單片機C語言寫一個按鍵計數器設計 [打印本頁]
作者: Elvis 時間: 2017-6-20 22:29
標題: 求助用單片機C語言寫一個按鍵計數器設計
本帖最后由 Elvis 于 2017-6-22 09:15 編輯
操作要求:KEY1 、KEY2分別用于加減預置計數次數,按下一次數字分別加減一,如果連續按下超過2秒,則數字快速連續加減變化;
KEY3用于計數器啟動/預置狀態切換,按第一次進入預置狀態,再按一次回到計數狀態;
KEY4用于模擬單片機外部計數脈沖,每按下一次顯示的設置加一,如果計數次數到預置數,則數字閃爍,蜂鳴器發音
幫我看看有什么問題吧!
-
-
按鍵計數.zip
2017-6-22 09:15 上傳
點擊文件名下載附件
56.41 KB, 下載次數: 62
作者: Elvis 時間: 2017-6-22 09:16
能寫出程序流圖最好了。
作者: fancunwu 時間: 2019-9-2 18:53
#include<reg51.h> #include<INTRINS.h> #define u16 unsigned int #define u8 unsigned char u16 count=0; //計數設定值 u16 countTemp=0;//計數 u8 zt=0; //狀態 sbit fmq=P1^0; //蜂鳴器 u16 jsflag=0; //閃爍計時用 /*********************************************************/ u8 ds[4]; //數碼管顯示緩存 //共陰 code u8 w[]={0xf1,0xf2,0xf4,0xf8}; //位碼 code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//斷碼 void dispaly(){//顯示函數 static u8 a; if(++a>3)a=0; P0=0xFF; P2=w[a]; P0=d[ds[a]]; } /****************************************/ void init() //初始化函數 { TMOD=0x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; EA=1; ET0=1; } /******************************************/ u8 key=0xff;//消抖后的有效按鍵值 u8 key_down=0x00;//按鍵下降沿掃描結果,1有效 u8 key_up=0x00; //上升沿掃描結果,1有效 u8 key_sc=0xff;//上次掃描的按鍵值 //檢測端下降沿檢測 sbit k1=P2^4; sbit k2=P2^5; sbit k3=P2^6; sbit k4=P2^7; //按鍵掃描程序 void scanKey(){ static u8 temp0; static u8 ms; u8 temp=0; if(k1==1)temp|=0x01; if(k2==1)temp|=0x02; if(k3==1)temp|=0x04; if(k4==1)temp|=0x08; if(temp==temp0){// 按鍵消抖 if(++ms>=5){//連續5次掃描的值一樣,則認為是穩定狀態 key=temp; ms=0; } }else { temp0=temp; ms=0; } key_down=key_sc&(~key);//下降沿掃描 key_up=(~key_sc)&key;//下降沿掃描 key_sc=key; } u8 readPIN(u8 port,u8 pin){ code u8 tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; return ((port&tab[pin])==0?0:1); } /***********************************/ //預置狀態 u16 anjs=0;//長按計數標志 void yzzt(){ ds[0]=count/1000%10;//設置值送入顯示緩存 ds[1]=count/100%10; ds[2]=count/10%10; ds[3]=count%10; if(readPIN(key,0)==0){//k1按下 if(readPIN(key_down,0)==1){//下降沿,即剛按下 if(++count>9999)count=0;//加1 anjs=2000;//倒計時2s } if(anjs==0){//倒計時到 anjs=200;//倒計時0.2s if(++count>9999)count=0;//加1 } } //減1 if(readPIN(key,1)==0){ if(readPIN(key_down,1)==1){ if(--count>9999)count=9999; anjs=2000; } if(anjs==0){ anjs=200; if(--count>9999)count=9999; } } if(readPIN(key_down,2)==1){//計入計數 zt=2; } } //計數狀態 void jszt(){ if((countTemp==count)&&(jsflag<=500)){//閃爍 ds[0]=10; ds[1]=10; ds[2]=10; ds[3]=10; }else {//正常顯示 ds[0]=countTemp/1000%10; ds[1]=countTemp/100%10; ds[2]=countTemp/10%10; ds[3]=countTemp%10; } fmq=(countTemp==count?1:0);//蜂鳴器 if(readPIN(key_down,2)==1){//計入預置狀態 zt=1; } if(readPIN(key_down,3)==1){//計數 if(++countTemp>9999)countTemp=0; } } /*****************************/ void main()//主函數 { while(1){ if(zt==0){ fmq=0; init();//系統初始化 TR0=1; //定時器開始計時 zt=1; }else if(zt==1){ yzzt(); }else if(zt==2){ jszt(); } scanKey(); } } /****************************/ void timer0() interrupt 1//1ms定時器 { TH0=(65536-1000)/256;//重載初值 TL0=(65536-1000)%256; dispaly();//顯示 if(++jsflag>=1000)jsflag=0; if(anjs!=0)anjs--; }
作者: fancunwu 時間: 2019-9-2 18:54
#include<reg51.h>
#include<INTRINS.h>
#define u16 unsigned int
#define u8 unsigned char
u16 count=0; //計數設定值
u16 countTemp=0;//計數
u8 zt=0; //狀態
sbit fmq=P1^0; //蜂鳴器
u16 jsflag=0; //閃爍計時用
/*********************************************************/
u8 ds[4]; //數碼管顯示緩存
//共陰
code u8 w[]={0xf1,0xf2,0xf4,0xf8}; //位碼
code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//斷碼
void dispaly(){//顯示函數
static u8 a;
if(++a>3)a=0;
P0=0xFF;
P2=w[a];
P0=d[ds[a]];
}
/****************************************/
void init() //初始化函數
{ TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
}
/******************************************/
u8 key=0xff;//消抖后的有效按鍵值
u8 key_down=0x00;//按鍵下降沿掃描結果,1有效
u8 key_up=0x00; //上升沿掃描結果,1有效
u8 key_sc=0xff;//上次掃描的按鍵值
//檢測端下降沿檢測
sbit k1=P2^4;
sbit k2=P2^5;
sbit k3=P2^6;
sbit k4=P2^7;
//按鍵掃描程序
void scanKey(){
static u8 temp0;
static u8 ms;
u8 temp=0;
if(k1==1)temp|=0x01;
if(k2==1)temp|=0x02;
if(k3==1)temp|=0x04;
if(k4==1)temp|=0x08;
if(temp==temp0){// 按鍵消抖
if(++ms>=5){//連續5次掃描的值一樣,則認為是穩定狀態
key=temp;
ms=0;
}
}else {
temp0=temp;
ms=0;
}
key_down=key_sc&(~key);//下降沿掃描
key_up=(~key_sc)&key;//下降沿掃描
key_sc=key;
}
u8 readPIN(u8 port,u8 pin){
code u8 tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
return ((port&tab[pin])==0?0:1);
}
/***********************************/
//預置狀態
u16 anjs=0;//長按計數標志
void yzzt(){
ds[0]=count/1000%10;//設置值送入顯示緩存
ds[1]=count/100%10;
ds[2]=count/10%10;
ds[3]=count%10;
if(readPIN(key,0)==0){//k1按下
if(readPIN(key_down,0)==1){//下降沿,即剛按下
if(++count>9999)count=0;//加1
anjs=2000;//倒計時2s
}
if(anjs==0){//倒計時到
anjs=200;//倒計時0.2s
if(++count>9999)count=0;//加1
}
}
//減1
if(readPIN(key,1)==0){
if(readPIN(key_down,1)==1){
if(--count>9999)count=9999;
anjs=2000;
}
if(anjs==0){
anjs=200;
if(--count>9999)count=9999;
}
}
if(readPIN(key_down,2)==1){//計入計數
zt=2;
}
}
//計數狀態
void jszt(){
if((countTemp==count)&&(jsflag<=500)){//閃爍
ds[0]=10;
ds[1]=10;
ds[2]=10;
ds[3]=10;
}else {//正常顯示
ds[0]=countTemp/1000%10;
ds[1]=countTemp/100%10;
ds[2]=countTemp/10%10;
ds[3]=countTemp%10;
}
fmq=(countTemp==count?1:0);//蜂鳴器
if(readPIN(key_down,2)==1){//計入預置狀態
zt=1;
}
if(readPIN(key_down,3)==1){//計數
if(++countTemp>9999)countTemp=0;
}
}
/*****************************/
void main()//主函數
{
while(1){
if(zt==0){
fmq=0;
init();//系統初始化
TR0=1; //定時器開始計時
zt=1;
}else if(zt==1){
yzzt();
}else if(zt==2){
jszt();
}
scanKey();
}
}
/****************************/
void timer0() interrupt 1//1ms定時器
{
TH0=(65536-1000)/256;//重載初值
TL0=(65536-1000)%256;
dispaly();//顯示
if(++jsflag>=1000)jsflag=0;
if(anjs!=0)anjs--;
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
最新国产精品精品视频
|
伊人影院在线观看
|
9久久精品
|
国产良家自拍
|
一区二区三区久久
|
国产片淫级awww
|
一级一级一级毛片
|
日韩中文电影
|
91美女在线观看
|
精品久久久久久久久久久
|
免费在线看a
|
免费成人在线网站
|
一区二区不卡视频
|
99精品国产一区二区三区
|
色偷偷888欧美精品久久久
|
91大神xh98xh系列全部
|
成人h动漫亚洲一区二区
|
www.久久|
欧美精品一区二区三区在线播放
|
国产视频福利一区
|
97精品国产手机
|
日日夜夜av
|
日韩成人免费视频
|
91精品国产综合久久精品
|
亚洲免费观看视频
|
欧美一区二区三区大片
|
日韩亚洲一区二区
|
亚州精品天堂中文字幕
|
天天操天天干天天爽
|
精品欧美乱码久久久久久1区2区
|
精品二区
|
久久九九网站
|
亚洲成人午夜在线
|
99久久99
|
日日夜夜精品
|
在线看片网站
|
涩涩视频在线看
|
成年视频在线观看福利资源
|
中文字幕黄色大片
|
日韩国产中文字幕
|
一区二区福利视频
|