;*********************************************************************************
;Copyright(c)2010, GUILIN UNIVERSITY OF ELECTRONIC TECHNOLOGY
;All rights reserved
;
;实验任务:用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作列输入线,以P1.4-P1.7作行输出线.
; 在数码管上显示每个按键的"0-F"序号,使用使共阳码管显示对应的键值.
;
;********************************************************************************
;********************************************************************************
;程序初始化
;********************************************************************************
LEDOUT EQU P2
KEYMATRIX EQU P1
SCANCODE EQU R2
KEYCODE EQU R3
COUNT EQU R4
KEYCOUNT EQU R5
ROWCOUNT DATA 30H
LINECOUNT DATA 31H
KEYFLAG EQU F0
ORG 0000H
AJMP START
ORG 0030H
;********************************************************************************
;主程序
;********************************************************************************
START: MOV LEDOUT,#0FFH
MOV SCANCODE,#0EFH
MOV KEYCODE,#0
MOV COUNT,#0
MOV KEYCOUNT,#0
MOV ROWCOUNT,#0
CLR KEYFLAG
LOOP: MOV KEYMATRIX,SCANCODE
MOV KEYCODE,KEYMATRIX
MOV A,KEYCODE
ANL A,#0FH
CJNE A,#0FH,REMOVESHAKE
AJMP ROWSCAN ;如果没有按键按下,则不停的行扫描
REMOVESHAKE:
ACALL DEL10MS ;按键消抖
MOV KEYMATRIX,SCANCODE
MOV KEYCODE,KEYMATRIX
MOV A,KEYCODE
ANL A,#0FH
CJNE A,#0FH,KEYPRESSED
AJMP ROWSCAN
KEYPRESSED:
MOV LINECOUNT,#0
MOV COUNT,#4
MOV A,KEYCODE
LINESCAN: RRC A
INC LINECOUNT
JNC KEYIN
DJNZ COUNT,LINESCAN ;列扫描
ROWSCAN: MOV A,SCANCODE
RL A
INC ROWCOUNT
MOV SCANCODE,A
CJNE SCANCODE,#0FEH,LOOP
AJMP OUTPUT ;行扫描
KEYIN: SETB KEYFLAG
MOV A,ROWCOUNT
MOV B,#4
MUL AB
ADD A,LINECOUNT
DEC A
MOV KEYCOUNT,A
AJMP OUTPUT ;有按键按下则处理相应得键值存入KEYCOUNT=ROWCOUNT*4+LINCOUNT-1;
OUTPUT: JB KEYFLAG,NEXT
MOV LEDOUT,#0FFH ;无按键按下则输出黑屏
AJMP START
NEXT: MOV DPTR,#DIGITALTABLE
MOV A,KEYCOUNT
MOVC A,@A+DPTR
MOV LEDOUT,A ;有按键按下输出对应的键值
KEYRELESE:MOV KEYMATRIX,SCANCODE
MOV KEYCODE,KEYMATRIX
MOV A,KEYCODE
ANL A,#0FH
CJNE A,#0FH,KEYRELESE
AJMP START
;********************************************************************************
;子程序介绍:10ms的延时,用于按键消抖
;********************************************************************************
DEL10MS: MOV R7,#20
AA: MOV R6,#248
DJNZ R6,$
DJNZ R7,AA
RET
DIGITALTABLE: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H
DB 80H, 90H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH
END
写一程序,要求按什么键就在数码管上显示其键值
MOV KEYCOUNT,A AJMP OUTPUT ;有按键按下则处理相应得键值存入KEYCOUNT=ROWCOUNT*4+LINCOUNT-1;OUTPUT: JB KEYFLAG,NEXT MOV LEDOUT,#0FFH ;无按键按下则输出黑屏 AJMP START NEXT: MOV DPTR,#DIGITALTABLE MOV A,KEYCOUNT MOVC A,@A+DPTR MOV LEDOUT...
c语言怎么编写子程序?
从0到F,按下相应的键会在数码管上显示相应的数字,\\x0d\\x0a * 其中K0到K15是采用4*4的方式连接的\\x0d\\x0a *\/\\x0d\\x0a ;***\\x0d\\x0a ; 0 1 2 3 ---P20\\x0d\\x0a ; 4 5 6 7 ---P21\\x0d\\x0a ; 8 9 A B ---P...
单片机4*4行列式键盘程序! 动态显示,开始时,显示“——”,按键后...
根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。开机时,数码管显示“-”。当键按下时,数码管显示按下键的键值,蜂鸣器响一声。*\/ include <reg52.h> include <intrins.h> define uchar unsigned char define uint unsigned int sbit BEEP = P3^6; \/\/蜂鸣器驱动线 u...
...4*4矩阵键盘的程序,简单易懂的,数码管显示键值
key_tran();\/***按键扫描动态显示***\/ P2=0Xc0; \/\/位选锁存器开
求51单片机红外摇控接收c程序,并在数码管上显示键值出来?
bit IR_E; \/\/表示有新的遥控键控下就更新扫描数据 bit b3msint;void SendDataToDispDevice();void Ir_process();void display();void beeping();\/*** 晶振为12 MHZ***\/ \/**定时器1,12 MHZ最大定时为65.53ms***\/ \/\/--- void init(){ IP=0x09; \/\/定时器1,外部中断0优先...
...管,按下相应的键,数码管显示相应的数值。(键值0~F)
void delay(uint i); \/\/演示程序 void main() { uchar key; while(1) { key=keyscan(); \/\/调用键盘扫描, switch(key) { case 0x7e:P0=dofly[0];break;\/\/0 按下相应的键显示相对应的码值 case 0x7d:P0=dofly[1];break;\/\/1 case 0x7b:P0=dofly[2];break;\/\/2 case 0x77:P0=dofly[3];...
我的矩阵键盘要求按照其对应健值,4位数码管,滚动显示其健值,我要怎么...
把列的IO属性配成弱上拉,读取键值时首先将第1行通过IO口输出低电平,按顺序读取4列返回的状态,如果有一列被拉低了那就锁定那个键按下了,键值你可以这样定义一个字节高半字节代表行,低半字节代表列。一对应就OK了 至于你要翻译成1-16个LED 靠你的软件实现就行了,你可以随便关联。
矩阵键盘数码管显示键值
高4位为低电平,当低4位有键按下行,即对应低4位中的1位变低如P1=0000 1101B,并且temp记录此时P!的值再经过逻辑操作temp=temp&0x0F;temp=~(temp|0xF0);,temp = 0000 0010 \/temp = 2;另外,去抖延时delay(1)通常为10ms,如果else if 如果较多可选用switch case 优化一下 ...
用89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角...
1)上电后,系统初始化,数码显示6个‘-’,等待输入设置命令。 2)按钮分别控制“幅值”、“频率”、“方波”、“正弦波”、“锯齿波”。 3)“幅值“键初始值是1V,随后再次按下依次增长1V,到达5V后在按就回到1V。 4)“频率“键初始值是10HZ,随后在按下依次为20HZ、50HZ、100HZ、200HZ、500HZ、1000HZ循环...
...程序,要求:每一个按键(共16个)对应数码管0~F显示出来
P2=h;return(cord);\/\/键盘最后组合码值 } }return(0xff); \/\/返回该值 } 如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你用的是共阴的还是共阳的数码管了~~祝您的问题早日得到解决. 谢谢 ...