久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1406|回復: 5
打印 上一主題 下一主題
收起左側

如何把宋老師四個獨立按鍵單片機程序改為8個獨立按鍵程序?

[復制鏈接]
跳轉到指定樓層
樓主
ID:82738 發表于 2021-10-12 10:46 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如題,程序在3樓
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:262 發表于 2021-10-12 16:01 | 只看該作者
程序呢?我幫你研究下
回復

使用道具 舉報

板凳
ID:82738 發表于 2021-10-14 21:14 來自手機 | 只看該作者
#include <reg52.h>
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
unsigned char code LedChar[] = { //數碼管顯示字符轉換表
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { //數碼管顯示緩沖區
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char KeySta[4] = { //按鍵當前狀態
    1, 1, 1, 1
};
bit StopwatchRunning = 0; //秒表運行標志
bit StopwatchRefresh = 1; //秒表計數刷新標志
unsigned char DecimalPart = 0; //秒表的小數部分
unsigned int IntegerPart = 0; //秒表的整數部分
unsigned char T0RH = 0; //T0 重載值的高字節
unsigned char T0RL = 0; //T0 重載值的低字節
void ConfigTimer0(unsigned int ms);
void StopwatchDisplay();
void KeyDriver();
void main(){
    EA = 1;  //開總中斷
    ENLED = 0;  //使能選擇數碼管
    ADDR3 = 1;
    P2 = 0xFE; //P2.0 置 0,選擇第 4 行按鍵作為獨立按鍵
    ConfigTimer0(2); //配置 T0 定時 2ms
    while (1){
        if (StopwatchRefresh){ //需要刷新秒表示數時調用顯示函數
            StopwatchRefresh = 0;
            StopwatchDisplay();
        }
        KeyDriver(); //調用按鍵驅動函數
    }
}
/* 配置并啟動 T0,ms-T0 定時時間 */
void ConfigTimer0(unsigned int ms){
    unsigned long tmp; //臨時變量
    tmp = 11059200 / 12; //定時器計數頻率
    tmp = (tmp * ms) / 1000; //計算所需的計數值
    tmp = 65536 - tmp;  //計算定時器重載值
    tmp = tmp + 18; //補償中斷響應延時造成的誤差
    T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0; //清零 T0 的控制位
    TMOD |= 0x01; //配置 T0 為模式 1
    TH0 = T0RH; //加載 T0 重載值
    TL0 = T0RL;
    ET0 = 1; //使能 T0 中斷
    TR0 = 1; //啟動 T0
}
/* 秒表計數顯示函數 */
void StopwatchDisplay(){
    signed char i;
    unsigned char buf[4]; //數據轉換的緩沖區
    //小數部分轉換到低 2 位
    LedBuff[0] = LedChar[DecimalPart%10];
    LedBuff[1] = LedChar[DecimalPart/10];
    //整數部分轉換到高 4 位
    buf[0] = IntegerPart%10;
    buf[1] = (IntegerPart/10)%10;
    buf[2] = (IntegerPart/100)%10;
    buf[3] = (IntegerPart/1000)%10;
    for (i=3; i>=1; i--){ //整數部分高位的 0 轉換為空字符
        if (buf[i] == 0){
            LedBuff[i+2] = 0xFF;
        }else{
            break;   
        }
    }
    for ( ; i>=0; i--){ //有效數字位轉換為顯示字符
        LedBuff[i+2] = LedChar[buf[i]];
    }
    LedBuff[2] &= 0x7F; //點亮小數點
}
/* 秒表啟停函數 */
void StopwatchAction(){
    if (StopwatchRunning){ //已啟動則停止
        StopwatchRunning = 0;
    }else{  //未啟動則啟動
        StopwatchRunning = 1;
    }
}
/* 秒表復位函數 */
void StopwatchReset(){
    StopwatchRunning = 0; //停止秒表
    DecimalPart = 0; //清零計數值
    IntegerPart = 0;
    StopwatchRefresh = 1; //置刷新標志
}
/* 按鍵驅動函數,檢測按鍵動作,調度相應動作函數,需在主循環中調用 */
void KeyDriver(){
    unsigned char i;
    static unsigned char backup[4] = {1,1,1,1};
   
    for (i=0; i<4; i++){ //循環檢測 4 個按鍵
        if (backup[i] != KeySta[i]){ //檢測按鍵動作
            if (backup[i] != 0){ //按鍵按下時執行動作
                if (i == 1){ //Esc 鍵復位秒表
                    StopwatchReset();
                }else if (i == 2){//回車鍵啟停秒表
                    StopwatchAction();
                }
            }
            backup[i] = KeySta[i]; //刷新前一次的備份值
        }
    }
}
/* 按鍵掃描函數,需在定時中斷中調用 */
void KeyScan(){
    unsigned char i;
    static unsigned char keybuf[4] = { //按鍵掃描緩沖區
        0xFF, 0xFF, 0xFF, 0xFF
    };
   
    //按鍵值移入緩沖區
    keybuf[0] = (keybuf[0] << 1) | KEY1;
    keybuf[1] = (keybuf[1] << 1) | KEY2;
    keybuf[2] = (keybuf[2] << 1) | KEY3;
    keybuf[3] = (keybuf[3] << 1) | KEY4;
    //消抖后更新按鍵狀態
    for (i=0; i<4; i++){
        if (keybuf[i] == 0x00){
            //連續 8 次掃描值為 0,即 16ms 內都是按下狀態時,可認為按鍵已穩定的按下
            KeySta[i] = 0;
        }else if (keybuf[i] == 0xFF){
            //連續 8 次掃描值為 1,即 16ms 內都是彈起狀態時,可認為按鍵已穩定的彈起
            KeySta[i] = 1;
        }
    }
}
/* 數碼管動態掃描刷新函數,需在定時中斷中調用 */
void LedScan(){
    static unsigned char i = 0; //動態掃描索引
    P0 = 0xFF; //關閉所有段選位,顯示消隱
    P1 = (P1 & 0xF8) | i; //位選索引值賦值到 P1 口低 3 位
    P0 = LedBuff[i]; //緩沖區中索引位置的數據送到 P0 口
    if (i < 5){ //索引遞增循環,遍歷整個緩沖區
        i++;
    }else{
        i = 0;
    }
}
/* 秒表計數函數,每隔 10ms 調用一次進行秒表計數累加 */
void StopwatchCount(){
    if (StopwatchRunning){ //當處于運行狀態時遞增計數值
        DecimalPart++; //小數部分+1
        if (DecimalPart >= 100){ //小數部分計到 100 時進位到整數部分
            DecimalPart = 0;
            IntegerPart++; //整數部分+1
            if (IntegerPart >= 10000){ //整數部分計到 10000 時歸零
                IntegerPart = 0;
            }
        }
        StopwatchRefresh = 1; //設置秒表計數刷新標志
    }
}
/* T0 中斷服務函數,完成數碼管、按鍵掃描與秒表計數 */
void InterruptTimer0() interrupt 1{
    static unsigned char tmr10ms = 0;
    TH0 = T0RH; //重新加載重載值
    TL0 = T0RL;
    LedScan(); //數碼管掃描顯示
    KeyScan(); //按鍵掃描
    //定時 10ms 進行一次秒表計數
    tmr10ms++;
    if (tmr10ms >= 5){
        tmr10ms = 0;
        StopwatchCount(); //調用秒表計數函數
    }
}
回復

使用道具 舉報

地板
ID:82738 發表于 2021-10-14 21:18 來自手機 | 只看該作者
我把數組改為8,i改為8,按鍵改為8個,最后一個按鍵key8不起作用是怎么回事?
回復

使用道具 舉報

5#
ID:82738 發表于 2021-10-14 22:37 來自手機 | 只看該作者
這個程序改為8個獨立按解不能實現,最多為7個按鍵
回復

使用道具 舉報

6#
ID:61207 發表于 2021-10-14 22:51 | 只看該作者
18588278793 發表于 2021-10-14 21:14
#include
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

改成多少個獨立按鍵都可以,問題是你沒有認真看宋老師的教程,所以不能實現
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草在线青青草 | 日日日操 | 国产一级视频免费播放 | 狠狠的干狠狠的操 | 精品一区二区三区不卡 | 精品91久久久 | 日本黄色大片免费 | 日韩成人影院 | 久操亚洲| 91av入口| 久久av资源网 | 中文字幕乱码一区二区三区 | 国产成人久久av免费高清密臂 | 亚洲精品电影网在线观看 | 97碰碰碰| 欧美成人精品欧美一级 | 久久精品aaa| 农村黄性色生活片 | 精品亚洲视频在线 | 久久久.com| 久久久123 | 日本在线免费观看 | 欧美一区二区三区四区五区无卡码 | 精品欧美一区二区三区久久久小说 | 久久com| 夏同学福利网 | 日韩精品一区二区三区在线观看 | 国产免费麻豆视频 | 国产成人99久久亚洲综合精品 | 欧洲一级黄 | 国产成人网 | 九九伦理电影 | 日本中文字幕视频 | 欧美性tv | 蜜桃视频在线观看www社区 | 精品久久一区二区 | 一区二区三区日韩精品 | 噜噜噜噜狠狠狠7777视频 | 国内精品久久精品 | 国产sm主人调教女m视频 | 福利精品在线观看 |