广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 5461 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为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.042123 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言