標(biāo)題: 單片機(jī)2個(gè)IO口6按鍵輸入 源程序與仿真 [打印本頁]

作者: bhjyqjs    時(shí)間: 2022-3-4 10:55
標(biāo)題: 單片機(jī)2個(gè)IO口6按鍵輸入 源程序與仿真
網(wǎng)上見到別人寫的2IO 6Key程序,但一直運(yùn)行不成功,認(rèn)真琢磨了一陣,終于成功。現(xiàn)分享出來,以供同好參考。
注意:Proteus仿真不行,但在開發(fā)板上正常運(yùn)行。

//CPU:STC89C52單片機(jī)
#include <REG52.h>
#include <intrins.h>
sfr AUXR = 0x8E;
typedef  unsigned char  uchar;
typedef  unsigned int  uint;
#define key_state_0  0  //判斷是否按下
#define key_state_1  1  //判斷是否為抖動(dòng)和取鍵值
uchar key=0;
bit KEY_1_ON=0;          //按鍵分為2組,1,2,3為第一組,4,5,6為第二組
                                   //KEY_1_ON 為第一組按下標(biāo)志
sbit IO_1=P1^0;
sbit IO_2=P1^1;
void Timer0_Init();   
void keyboard();
void main()
{
  Timer0_Init();
  while(1)
   {
   switch(key)
    {  
    case 1:P2=0XFE;
           break;
    case 2:P2=0XFD;
           break;
    case 3:P2=0XFB;
           break;
    case 4:P2=0XF7;
           break;
    case 5:P2=0XEF;
           break;
    case 6:P2=0XDF;
           break;
   }
  }
}

呵呵,重要的東東不能忘,這是按鍵部分的接線圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




Keil代碼與Proteus仿真下載: 2io6key.rar (29.17 KB, 下載次數(shù): 61)

作者: bhjyqjs    時(shí)間: 2022-3-4 15:35


這個(gè)運(yùn)行圖片清晰些,特別穩(wěn)定!

作者: bhjyqjs    時(shí)間: 2022-3-7 10:14
“網(wǎng)上見到別人寫的2IO 6Key程序,但一直運(yùn)行不成功,認(rèn)真琢磨了一陣,終于成功!
這句話是筆誤,我想說的是“”網(wǎng)上見到別人寫的2IO 6Key程序,但一直運(yùn)行不成功,自己琢磨了一陣,認(rèn)真重寫了代碼,終于成功。“真正是自己創(chuàng)作的,非抄襲。
重申一遍:Proteus仿真不行,開發(fā)板上運(yùn)行正常。
作者: bhjyqjs    時(shí)間: 2022-3-23 16:07

經(jīng)努力,現(xiàn)完全仿真成功。
貼上運(yùn)行圖:


作者: bhjyqjs    時(shí)間: 2022-3-23 16:12
//這是主程序
#include <REG52.h>
#include <intrins.h>
sfr AUXR = 0x8E;
typedef  unsigned char  uchar;
typedef  unsigned int  uint;
#define key_state_0  0  //判斷是否按下
#define key_state_1  1  //判斷是否為抖動(dòng)和取鍵值

sfr  P1M1 = 0x91;
sfr  P1M0 = 0x92;

uchar key=0;
bit KEY_1_ON=0;   //按鍵分成兩組,1、2、3為第一組,4、5、6為第二組
                    //KEY_1_ON 為第一組按下標(biāo)志
sbit IO_1=P1^0;
sbit IO_2=P1^1;

void Timer0_Init();     //定時(shí)器初始化
void keyboard();
void main()
{
  P1M1=0x03;    //P0^0及P0^1配置成開漏模式  
  P1M0=0x03;    //這樣在要讀外部狀態(tài)時(shí),對(duì)該位寫"1"即可

  Timer0_Init();
  while(1)
   {
   switch(key)
    {  
    case 1:P2=0XFE;
           break;
    case 2:P2=0XFD;
           break;
    case 3:P2=0XFB;
           break;
    case 4:P2=0XF7;
           break;
    case 5:P2=0XEF;
           break;
    case 6:P2=0XDF;
           break;
   }
  }
}
作者: bhjyqjs    時(shí)間: 2022-3-23 16:14
void Timer0_Init()  //定時(shí)器初始化
  {    //10毫秒@12.000MHz
    AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
    TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
    TMOD |= 0x01;                //設(shè)置定時(shí)器模式
    TL0 = 0xF0;                  //設(shè)置定時(shí)初始值
    TH0 = 0xD8;                  //設(shè)置定時(shí)初始值
    TR0 = 1;                    //定時(shí)器0開始計(jì)時(shí)
    ET0 =1;
   EA = 1;
}

void Timer0() interrupt 1 //定時(shí)器中斷
{                     //16位自動(dòng)重裝模式         
   keyboard();
}       

keyboard() 函數(shù)在附件中,無變化。
作者: 快樂眼淚    時(shí)間: 2022-3-23 21:03
樓主真牛人。!
作者: 3花木城    時(shí)間: 2022-3-23 22:21
少引腳的芯片非常需要
作者: bhjyqjs    時(shí)間: 2022-3-24 08:28
這是更新后的Keil代碼與Proteus仿真文件。

2io6key.rar (34.13 KB, 下載次數(shù): 48)

作者: jhczy    時(shí)間: 2022-3-24 09:47
樓主確實(shí)是大拿。不過用帶有ADC口的,可以一個(gè)口實(shí)現(xiàn)好多個(gè)按鍵功能
作者: 3花木城    時(shí)間: 2022-3-24 12:51
可惜仿真是8.0以上版本的,下載下來想仿真試試,
作者: bhjyqjs    時(shí)間: 2022-3-25 08:29
Proteus低版本無STC芯片仿真模塊,需要Proteus 8.9 sp2的,
我這是綠色免安裝版。
作者: yuyechenai    時(shí)間: 2022-3-25 08:51
我最多能實(shí)現(xiàn)3個(gè)按鍵,6個(gè)厲害了,程序保留后期研究。
作者: cooleaf    時(shí)間: 2022-3-26 14:13
回頭找找一個(gè)IO,通用ADC整的4個(gè)按鍵的代碼,幾年前的看還能不能找著。
作者: laohu_zz    時(shí)間: 2022-12-28 17:10
厲害!2線6按鍵
作者: herui2128    時(shí)間: 2023-1-27 21:39
歷害,但是研究了程序,有點(diǎn)點(diǎn)頭緒,但是摸不準(zhǔn)原理~!漢~
作者: 榆林上校    時(shí)間: 2023-1-28 07:01
2線6鍵的實(shí)現(xiàn)省下很多io口啊,謝謝分享!
作者: wkman    時(shí)間: 2023-1-31 14:57
3個(gè)io識(shí)別22個(gè)按鍵,,,缺點(diǎn),費(fèi)腦瓜子







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1