廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 5456 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
jack013338 手機
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x39
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++] 請問C語言鍵盤掃描如何改成中斷?
/*********************************************
LEDK.C 2006/3/16
P2.0 ~ P2.7 P0.7 ~ P0.0
4X4 KEYBOARD
*********************************************/
#include <REG51F.H>

#define uchar unsigned char
#define uint unsigned int

sbit COLUMN1 = P1^0;
sbit COLUMN2 = P1^1;
sbit COLUMN3 = P1^2;
sbit COLUMN4 = P1^3;
sbit ROW1 = P1^4;
sbit ROW2 = P1^5;
sbit ROW3 = P1^6;
sbit ROW4 = P1^7;

bdata FLAG = 0x20;
sbit C_FLAG = FLAG^0;
sbit D_FLAG = FLAG^1;
sbit F_FLAG = FLAG^2;
sbit J_FLAG = FLAG^3;
sbit L_FLAG = FLAG^4;
sbit M_FLAG = FLAG^5;
sbit N_FLAG = FLAG^6;
sbit O_FLAG = FLAG^7;

bdata FLAG1 = 0x21;
sbit B_FLAG = FLAG1^0;

uchar DCNT, KEY_NO, K_TEMP;

void BLINK(void);
void LRC(void);
void LRD(void);
void LRF(void);
void LRJ(void);
void LRL(void);
void LRM(void);
void LRN(void);
void LRO(void);
void Delay(uint del);
void Kdelay(void);
void SCAN(void);
void SCAN_ON(void);
void SCAN_OFF(void);
void KEY_PRO(void);

void main(void)
{
DCNT=5; SP+=2;
while (1)
{
P2=0; P0=0xFF; Kdelay();
P2=0xFF; P0=0; Kdelay();
}
}

void BLINK(void)
{
FLAG=0; FLAG1=0; B_FLAG=1;
while (1)
{
P2=P0=0; Kdelay();
P2=P0=0xFF; Kdelay();
}
}
void LRC(void)
{
uchar i,k=0;
FLAG=0; FLAG1=0; C_FLAG=1;
while (1)
{
for (i=8; i>0; i--)
{
P2=P0=k; Kdelay();
k<<=1; k+=1;
}
for (i=8; i>0; i--)
{
P2=P0=k; Kdelay();
k>>=1;
}
}
}

void LRD(void)
{
uchar i,k=0;
FLAG=0; FLAG1=0; D_FLAG=1;
while (1)
{
for (i=8; i>0; i--)
{
P2=P0=k; Kdelay();
k>>=1; k+=0x80;
}
for (i=8; i>0; i--)
{
P2=P0=k; Kdelay();
k<<=1;
}
}
}

void LRF(void)
{
uchar i,k;
FLAG=0; FLAG1=0; F_FLAG=1;
while (1)
{
k=0;
for (i=8; i>0; i--)
{
P2=0; P0=k; Kdelay();
k<<=1; k+=1;
}
k=0;
for (i=8; i>0; i--)
{
P2=k; P0=0xFF; Kdelay();
k>>=1; k+=0x80;
}
for (i=8; i>0; i--)
{
P2=k; P0=0xFF; Kdelay();
k<<=1;
}
k=0xFF;
for (i=8; i>0; i--)
{
P2=0; P0=k; Kdelay();
k>>=1;
}
}
}

void LRJ(void)
{
uchar i,k=1;
FLAG=0; FLAG1=0; J_FLAG=1;
P2=P0=0; Kdelay();
while (1)
{
for (i=8; i>0; i--)
{
P2=0; P0=k; Kdelay();
k<<=1;
}
k=0x80;
for (i=7; i>0; i--)
{
P2=k; P0=0; Kdelay();
k>>=1;
}
for (i=8; i>0; ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容




獻花 x0 回到頂端 [樓 主] From:台灣中華電信 | Posted:2006-04-07 12:46 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我有點看不懂你的程式在做什麼? 我幫你將掃瞄鍵盤改成用 Timer 中斷.
你只要判別相對應的 validKey? 做相對應的是就可以了
鍵盤的排列可能跟你要得有點顛倒, 你可以自己改一下 validKey? = validKeyData ^ ?

#include <reg52.h>
#include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;

sbit COLUMN1 = P1^0;
sbit COLUMN2 = P1^1;
sbit COLUMN3 = P1^2;
sbit COLUMN4 = P1^3;    
sbit ROW1   = P1^4;
sbit ROW2   = P1^5;
sbit ROW3   = P1^6;
sbit ROW4   = P1^7;

WORD data timerKeyData, pressKeyData, stateKeyData;
WORD bdata validKeyData;
sbit validKey0 = validKeyData ^ 0;
sbit validKey1 = validKeyData ^ 1;
sbit validKey2 = validKeyData ^ 2;
sbit validKey3 = validKeyData ^ 3;
sbit validKey4 = validKeyData ^ 4;
sbit validKey5 = validKeyData ^ 5;
sbit validKey6 = validKeyData ^ 6;
sbit validKey7 = validKeyData ^ 7;
sbit validKey8 = validKeyData ^ 8;
sbit validKey9 = validKeyData ^ 9;
sbit validKeyA = validKeyData ^ 10;
sbit validKeyB = validKeyData ^ 11;
sbit validKeyC = validKeyData ^ 12;
sbit validKeyD = validKeyData ^ 13;
sbit validKeyE = validKeyData ^ 14;
sbit validKeyF = validKeyData ^ 15;

BYTE KeyColNo, KeyColLine;

void Timer0ISR(void) interrupt 1
{
  BYTE key;
  WORD tmp;

  TH0 = 256-120; // (11059200 / 12 / 32) / 120 = 240 Hz
 
  P1 = ~KeyColLine;     // pull high ROWS
  KeyColLine <<= 1;
  KeyColNo++;
  key = ~P1 >> 4;
  timerKeyData = (timerKeyData << 4) | key;
  if (KeyColNo == 4)
  {
    KeyColNo = 0;
    KeyColLine = 0x01;
    tmp = pressKeyData & timerKeyData;
    pressKeyData = timerKeyData;
    validKeyData |= (tmp ^ stateKeyData);
    validKeyData &= pressKeyData;
    stateKeyData = tmp;
  }
}

void main()
{
  TMOD = 0;
  TH0 = 256-120; // (11059200 / 12 / 32) / 120 = 240 Hz
  TR0 = 1;
  ET0 = 1;
  EA = 1;

  KeyColNo = 0x00;
  KeyColLine = 0x01;
  while (1)
  {
    if (_testbit_(validKey0))
      ;
  }
}


獻花 x0 回到頂端 [1 樓] From:台灣中華電信 | Posted:2006-04-07 20:32 |
jack013338 手機
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x39
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我的程式只是單存的跑馬燈~P1 P2 輸出~
4*4鍵盤 控制不同的狀態


獻花 x0 回到頂端 [2 樓] From:台灣中華電信 | Posted:2006-04-08 15:02 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.052526 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言