;4X4矩阵键盘程序。主要原理为扫描键盘矩阵时,每次只有一行电平拉低。在逐次扫描拉低的这些行的同时,去读那些列的电平。

;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位位CY里就可以检测出是0还是1.为1表示无按下,

;为0表示该键按下。在扫描按键时,如无按下,则取码指针R1加1后,继续扫描 。如有键按下,转按键处理子程序,按键按下标志位

;F0清0(表示按下)。此时,取码指针的值,就是按键的键名。 随后继续进入按键检测子程序重新扫描。

;注:本程序只通过仿真,因无按键防抖,实物中正常与否,未能确定 。

;2011 04 10    D:\DPJ\4X4KEY.ASM

ORG 00H

AJMP MAIN

ORG 30H

MAIN:

MOV SP,#60H

MOV DPTR,#TABLE

KEY:

ACALL KEY0_1   ;调用KEY0_1,判断是否有键按下

JB F0,$-2   ;无键按下,转ACALL KEY0_1,继续扫描

MOV A,R1   ;R1为取码指针

MOVC A,@A+DPTR  ;取码,关送显示

MOV P1,A

AJMP KEY

KEY0_1:    ;按键检测子程序

SETB F0   ;设F0=1

MOV R3,#0F7H  ;行扫描指针初值(P2.3=0)

MOV R1,#00H   ;取码指针初值

L2:

MOV A,R3   ;载入扫描指针

MOV P2,A   ;输出至P2,开始扫描为0的一行

NOP

MOV A,P2   ;读入P2

SETB C

MOV R5,#4   ;检测P2.7~P2.4,共4 列

L3:    ;检测4列

RLC A   ;左移一位(P2.7~P2.4)

JNC KEY1   ;检测到C=0,表示被按下

INC R1   ;无键按下则取码指针加1

DJNZ R5,L3   ;4列检测完毕?

MOV A,R3   ;载入扫描指针

SETB C

RRC A       ;扫描为0的下一行,

MOV R3,A   ;存回R3扫描指针寄存器

JC L2   ;C=0,行扫描完毕

RET

KEY1:

CLR F0   ;F0清0 ,表示按键按下

RET

TABLE:

DB      0C0H;0

DB      0F9H;1

DB      0A4H;2

DB      0B0H;3

DB      099H;4

DB      092H;5

DB      082H;

DB      0F8H;7

DB      080H;8

DB      090H;9

DB      088H;A

DB      083H;b

DB      0C6H;C

DB      0A1H;d

DB      086H;E

DB      08EH;F

END

其实4X4矩阵的51C程序很多,有的也简单。这个完全按上面汇编的写成C的,有点繁了。

//E:\DPJ_C\4X4KEY\4X4KEY.C

//2012 04 17 更新

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar a,b,temp;  //a

bit flag;

uchar code tab[]={

0xC0,/*0*/

0xF9,/*1*/

0xA4,/*2*/

0xB0,/*3*/

0x99,/*4*/

0x92,/*5*/

0x82,/*6*/

0xF8,/*7*/

0x80,/*8*/

0x90,/*9*/

0x88,/*A*/

0x83,/*b*/

0xC6,/*C*/

0xA1,/*d*/

0x86,/*E*/

0x8E,/*F*/

};

void keyscan()

{

uchar i,j;

flag=1;//flag 有键按下标志

temp=0xf7; //temp 行扫描指针

a=0;

for(j=0;j<4;j++)

{

P2=temp;

_nop_();

b=P2; // b 列

for(i=0;i<4;i++)

{

b=b<<1;

if(!CY)

{

flag=0;//有键按下,标志置0

return; //跳出

}

else

a++;//无键按下,

}

temp=_cror_(temp,1);//扫描下一行

}

}

void main()

{

while(1)

{

keyscan();

if(!flag)

P1=tab[a];

}

}

4x4矩阵键盘扫描c语言程序,单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...相关推荐

  1. max7219c语言,51单片机+MAX7219数码管显示C程序

    /************************************************** *程序名称:  MAX7219 C语言控制程序 *程序功能: 3线串行控制8位共阴数码管 *3线 ...

  2. c语言delay_单片机模拟流星雨,电路图和程序,一起来感受下,其实C语言不难...

    流星划过夜空,在你默默许愿的同时,是不是也在想,能否通过学习单片机来模拟实现这种效果呢?一起行动,寻找流星的感觉. 流星雨电路图 元器件清单  以下是程序设计 #include//头文件 void ...

  3. 温度报警程序c语言设计,单片机温度报警器与时钟显示C程序和原理图

    #include #include "intrins.h" #define uint unsigned int //宏定义 #define uchar unsigned char ...

  4. 51单片机驱动ds12887c语言,51单片机+DS12887+12864大数字时钟程序+电路

    /*--------------------------------------------------------------------------- 电子智能时钟程序 单 片 机:STC89C5 ...

  5. 单片机旋转led程序c语言,基于单片机POV的旋转LED灯程序

    /************************************************************************************** *Name:旋转LED ...

  6. c语言两位数码管程序,单片机制作—两位数码管显示 c语言 汇编程序+电路图

    程序清单(汇编): ;2011 04 05 D:\DPJ\数码管段显\数码管段显2.asm S0 BIT P3.7 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 3 ...

  7. 8路巡回检测c语言程序,单片机驱动ds18b20四路温度巡回检测程序

    #include "reg52.h"//头文件 #include "intrins.h" #define uchar unsigned char//宏定义 #d ...

  8. 单片机控制lcd序c语言,51单片机驱动1602液晶的C程序

    # include /***************************************** 电路连接 P1------DB0-DB7 P2.0------RS P2.1------RW ...

  9. 延时1us程序12mhz晶振c语言,51单片机12M晶振的延时程序

    这是本人慢慢调出来的参数,有误差是必须的,除非用汇编才会精确,后续我会更新修改,尽量精确. 调试环境:Keil V4.02本文引用地址:http://www.eepw.com.cn/article/2 ...

最新文章

  1. FZU1669 Right-angled Triangle【毕达哥拉斯三元组】
  2. 18.28 getchar()函数与缓冲区问题
  3. php中的parse_ini_file函数
  4. VTK:PolyData之Curvatures
  5. tmux 如何自定义背景颜色 | How does the tmux color palette work?
  6. java枚举新特性_java回顾之枚举和新特性
  7. rpm oracle 离线,在CentOS中离线安装Oracle之安装准备
  8. 8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向
  9. http 几种请求方法的差别
  10. iOS简单实现查看更多/收起的效果[最新]
  11. 计算机用户登录电脑蓝屏,电脑蓝屏怎么办,教您解决电脑蓝屏的方法
  12. win8metro应用磁贴背景修改说明
  13. android模拟键盘自动输入,Android测试教程5--模拟键盘输入
  14. Java - 使用Cipher类实现加密(RSA)
  15. 唯品会基于Kubernetes(k8s)网络方案演进
  16. 刷脸支付是新的创业风口,刷脸支付推广线下商户策略!干货分享!
  17. COLA开发流程总结
  18. I2C协议研读(十)
  19. http请求头中的host是什么意思
  20. debian 11 安装bind9服务

热门文章

  1. SPSS 操作(一)数据选取 :个案选取和字符变量的筛选
  2. 转:上午还在写Bug,下午突然“被离职”,咋整?
  3. 【论文-目标追踪】BoT-SORT: Robust Associations Multi-Pedestrian Tracking
  4. 小计64位win7上R读取excel过程
  5. 51Nod-1289 大鱼吃小鱼
  6. python b站日排行榜_bilibili弹幕网视频日排行榜数据分析
  7. 检信智能语音情感识别-基于SVM的语音情感识别系统设计
  8. 绝地求生服务器维护9月19日,《绝地求生》9月19日上午停机更新维护 修复诸多BUG...
  9. 如何产生手腕暴发力(转)
  10. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)...