51单片机汇编程序问题。4*4矩阵键盘设计。求高手帮忙。

我想找一个51单片机的键盘设计的汇编程序,老师要求是4*4矩阵键盘,同时实现2 键和3键的复合按键。2键的时候是一个情况比如7段的LED发光二极管g、d处亮.3键的时候是a、g、d处亮,不知道能否实现呢。求哪位朋友帮帮忙,抽空帮小弟想一想。 直接给我程序吧,发到我邮箱里面,最好带上说明我什么都不会啊。在下先谢谢你了。好的话再追分100。k7is@163.com是我的邮箱。再次感谢。
C 语言也可以啊, 能实现就行了,那个汇编程序我看着实在难以理解。好像是不对。 朋友们,请不要给我发病毒行不?直接TXT就可以了。 谁给我正确的,我把分全给他。还有400多点吧。我告诉大家段码吧, GD的是48h, AGD的是49H

第1个回答  2010-05-18
5.18修改答案:
完整的已发至您邮箱。C语言部分程序代码:
#include "C8051F020.h" //包含C8051F020硬件信息的头文件
#include "absacc.h" //包含绝对地址访问信息的头文件
#include"math.h"
sbit LCD_EP=P2^4;
sbit LCD_RW=P2^2;
sbit LCD_RS=P2^0;
#define LCD_Data_BUS_Out P7
#define LCD_Data_BUS_In P7

#define key P5
unsigned char keyval;
int i;
typedef unsigned int uint;
code unsigned char LCD_InitialCode[]={0x38,0x38,0x38,0x38,0x01,0x06,0x0f};

unsigned char temp;

void Reset_Sources_Init() //禁止看门
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}

void Port_IO_Init() //交叉开关配置
{

//P74OUT = 0xC0; //p7推挽
P2MDOUT = 0xff; //p2推挽
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能

}

void Oscillator_Init() //振荡器初始化,使用片外晶体振荡器
{
uint i = 0;
OSCXCN = 0x67; //使用片外晶体谐振器,f>6.7MHz
for (i = 0; i < 3000; i++); //Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0); //检测外部振荡器是否有效
OSCICN = 0x08; //选择外部振荡器作为系统时钟,禁止内部时钟
}

//定时器1初始化函数,定时器1作为波特率发生器
void Timer_Init()
{
CKCON = 0x10; //C/T1直接使用系统时钟作为时钟源
TCON = 0x40; //C/T1允许
TMOD = 0x20; //C/T1方式2(8位重装填计数)
TL1 = 0xFA; //C/T1波特率115200计数值
TH1 = 0xFA;
}

void Init_Device() // 设备初始化函数,在主程序中调用Init_Device()
{
Reset_Sources_Init(); //复位源初始化
Port_IO_Init(); //端口初始化
Oscillator_Init(); //时钟源初始化
Timer_Init(); //定时器1初始化

}

有东西就发出来分享啊,我就直接写下面了。

ORG 0000H
SJMP MAIN
ORG 0030H

MAIN :
MOV SP,#60H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R2,#00H
MOV R3,#00
MOV R4,#00
MOV B,#00H
MOV 33H,#00H;十位
MOV 34H,#00H;个位
MOV 35H,#00H;高四位
KEYCODE EQU 35H
S0: LCALL PRESSKEY ;长调用有无按键按下

S1: LCALL DISPLAY ;长调用数字处理程序段
LJMP S0 ;返回S0

;******************* 有无按键按下
PRESSKEY:
MOV P1,#0F0H
MOV A,P1
CJNE A,#0F0H,D2
LJMP D5
D2: LCALL DELAY10MS

MOV A,P1
CJNE A,#0F0H,KEYVALUE
LJMP D5
;*********************按键键值判断
KEYVALUE:MOV 33H,#00H
mov 34H,#00H
MOV P1,#0F0H
MOV A,P1
ANL A,#0F0H ;ANL与操作
MOV B,A
MOV P1,#0FH
MOV A,P1
ANL A,#0FH ;ANL与操作
ORL A,B ;ORL或操作
MOV KEYCODE,A

MOV R3,#00
D4: MOV A,R3
MOV DPTR,#TABBLE2
MOVC A,@A+DPTR
CJNE A,KEYCODE,D3
MOV A,R3
MOV R2,A
LJMP D5
D3: INC R3
LJMP D4
D5: RET
;***********************************数字处理程序段
DISPLAY:
MOV A,R2
CJNE A,#10,CMP1
CMP1: JC LOOP2
LJMP LOOP3
LOOP2: MOV A, R2
MOV 34H,A
LJMP DISPLAY1

LOOP3: MOV B,#10
DIV AB
MOV 33H,A
MOV A,B
MOV 34H,A
LJMP DISPLAY1
;**********************************************************显示程序段
DISPLAY1:

MOV DPTR,#TABBLE1
MOV A,34H
MOVC A,@A+DPTR
MOV P2,#07FH
MOV P0,A
ACALL DELAY5MS

MOV DPTR,#TABBLE1
MOV A,33H
MOVC A,@A+DPTR
MOV P2,#0BFH
MOV P0,A
ACALL DELAY5MS
RET ;子程序返回
;*****************************************************
DELAY:
;延时子程序
MOV R5,#100
DELAY0: LCALL DELAY10MS
DJNZ R5,DELAY0
LJMP HUJK

DELAY10MS:MOV R4,#2
DELAY2 : LCALL DELAY5MS
DJNZ R4,DELAY2
LJMP HUJK
DELAY5MS:
MOV R6,#25
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1

HUJK : RET ;子程序返回

;***************************************************
TABBLE1:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,08H
;?******************************************************
TABBLE2:
DB 0EBH,77H,7BH,7DH,0B7H,0BBH,0BDH,0D7H,0DBH,0DDH,7EH,0BEH,0DEH,0EEH,0E7H,0EDH,0FFH
;*****************************************************
END本回答被提问者采纳
第2个回答  2010-05-15
我也是学这个专业的 电子信息工程是吧
我从大三的师哥那里拷了一些51单片机的设计程序
一会儿发给你看看吧
第3个回答  2010-05-15
你需要C语言的吗?我很少用汇编了,汇编用来写键盘实在不好理解
第4个回答  2010-05-16
我发给你了,
有什么问题可以问我
第5个回答  2010-05-20

发你邮箱了

89C51单片机 4*4矩阵键盘加流水灯问题,求个汇编程序代码。
;其实很简单,都不用判断键值,有键按下暂停2S程序如下:ORG 0000H LJMP STA ORG 000BH LJMP T0ISR ORG 0030H STA:MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB ET0 SETB EA MOV 30,#0FEH MOV R2,#0 CLR 00H LOOP:MOV P1,#0F0H MOV A,P1 CJNE A,#0F0H,LOOP1 SJMP LOOP...

设计4*4键盘,能实现键盘的锁定和长按键解锁。
数码管用CD8888做译码器,矩阵键盘编个8个引脚的汇编程序。其实实现这个功能用88绰绰有余,ARM硬件成本有点高

高分:51单片机汇编程序问题,为什么没调用的程序会对原程序产生影响
因为程序编译代码会超过0100h,覆盖了seg的数据 使得乱码 而删除show1234段使得程序代码短了,seg段就正常了

北京市应届毕业生单片机就业方向求助
机的程序你是不是就傻了?书上的东西我们必须要会运用。单片机编程用C语言或汇编语言都可以,但是我 建议用C语言比较好,如果原来有C语言的基础那学起来会更好,如果没有,也可以边学单片机边学C语言,C 语言也挺简单,只是一门工具而已,我劝你最好学会,将来肯定用得着,要不你以后也得学,你...

编写一个数据采集与处理程序!!!求助啊~~~
②开启“管理员批准模式”。按键盘上的Windows键+R键打开运行,输入“gpedit.msc”打开组策略编辑器,在左侧依次向下找到“计算机配置”→“Windows设置”→“安全设置”→“本地策略”→“安全选项”,然后在右侧找到“用户账户控制:用于内置管理员账户的管理员批准模式”,双击将其设置为“已启用”并...

高等院校通用教材·计算机组成与嵌入式系统目录
4.1.2 存储系统的组成 4.1.3 存储器的分类 4.2 半导体存储器 4.3 MCS51单片机的存储器结构 实验8 堆栈 4.3.1 程序存储器 4.3.2 数据存储器 4.3.3 外部存储器的访问 4.3.4 寻址方式 4.3.5 堆栈 基本要求和思考题 第5章 汇编语言程序设计 5.1 汇编程序 5.1.1 汇编语言的特点...

单片机原理及应用技术的目录
单片机的结构及工作原理2.1 AT89s51单片机的主要特性2.2 单片机的硬件结构2.2.1 中央处理器2.2.2 存储器2.2.3 I\/0接口2.2.4 特殊功能部件2.3 51系列单片机的引脚及功能2.3.1 51单片机的引脚分类2.3.2 三总线结构2.4 单片机的存储器配置2.4.1 程序存储器2.4.2 数据存储器2.5 时钟...

单片机两位数码管显示两位数
next3:jnb 01h,next4set led1clr led2mov leddata,#0a4hnext4:sjmp main 本回答由提问者推荐 举报| 答案纠错 | 评论 1 0 tx_bird 采纳率:67% 擅长: 物理学 汇编语言 家电 化学 其他编程语言 其他回答 不太 明白 chulishe | 发布于2013-01-13 举报| 评论 0 0 为您推荐: 单片机两位数的...

两道c语言题,谢谢帮帮忙
我给你第一题的答案:include<stdio.h> include<math.h> void getit(int);bool haveit=false;void main(){ while(true){ int a,i;printf("请输入一个整数\\n这个数以下的完全平方数将全部输出>:");scanf("%d",&a);getit(a);printf(haveit==true? "输出完毕!\\n":"%d 以下没有完全...

高手帮忙
keyboard 键盘 latency time 等待时间 library 库、程序库 linkage 连接 to load 装入、寄存、写入、加载 location 存储单元 logger 登记器、记录器 loop 循环 machine language 机器语言 magnetic storage 磁存储器 magnetic tape 磁带 matrix 矩阵 memory 存储器 message 信息、报文 microcomputer 微型计算机 module ...

相似回答