51 汇编编程:8255 驱动矩阵键盘和数码管

发布者:Serendipity22最新更新时间:2018-05-09 来源: eefocus关键字:汇编编程  矩阵键盘  数码管 手机看文章 扫描二维码
随时随地手机看文章

汇编编程:矩阵键盘控制数码管切换显示0~F。

下面是电路图。要求16个键按下能显示0~F字样。

51 汇编编程:8255 驱动矩阵键盘和数码管 - 非著名博主 - 电子信息角落

看到这样的电路和程序,不由得想起初学单片机时情景。

十几年前,是一本北航的书,里面就是这样的程序。

后来又看过几本,里面也有雷同的程序。

其实,该程序编写的很滥。

它把行列号码,算的很清。还特意弄成几个分支。

换下一行时,行号就要分别存入 00H、08H、10H、18H。

想法也太笨了,其实,只要加上 8,就可以编写成循环程序了。

程序中,还有很多应该简化的地方。

这程序学起来,的确浪费了我不少的时间。

根据题目中的电路和程序,做而论道改写的程序如下。

;

    ORG   0000H

    SJMP  START

    ORG   0030H

;--------------------------------------

DUMA:

    DB    3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H //共阴段码

    DB    7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H

;--------------------------------------

START:

    MOV   DPTR, #7F03H  //8255初始化

    MOV   A, #90H

    MOVX  @DPTR, A

    MOV   A, #16

;--------------------------------------

KEY1:

    ACALL KS1           //判断有无键按下, 返回PA口状态存放在A中

    JZ    KEY1          //无则返回

    ACALL DELAY         //调用延时子程序

    ACALL KS1           //再次判断有无键按下

    JZ    KEY1          //无则返回

;

    MOV   R2, #0FEH     //初始列扫描字

    MOV   R3, #8        //检查8次

    MOV   R4, #0        //初始键号

LK4:

    MOV   DPTR, #7F01H  //指向PB口

    MOV   A, R2

    MOVX  @DPTR, A

    MOV   DPTR, #7F00H  //指向PA口

    MOVX  A, @DPTR

    JNB   ACC.0, LK3

    INC   R4

    JNB   ACC.1, LK3

    INC   R4

    MOV   A, R2

    RL    A             //无则左移一位列扫描字, 继续判断下一列

    MOV   R2, A

    DJNZ  R3, LK4

LK3:

    ACALL KS1          

    JNZ   LK3           //判断按下的键有没有弹起, 无则原地等待继续判断

;

    MOV   A, R4         //键号放于A中

    MOV   DPTR, #0030H  //指向段码表首址

    MOVC  A, @A + DPTR  //键号转成相应的段码

    MOV   DPTR, #7F02H  //指向PC口

    MOVX  @DPTR, A      //数码管显示

;

    SJMP  KEY1

;--------------------------------------

KS1:

    MOV   DPTR, #7F01H  //指向PB口

    MOV   A, #0

    MOVX  @DPTR, A

    MOV   DPTR, #7F00H  //指向PA口

    MOVX  A, @DPTR

    CPL   A

    ANL   A, #03H

    RET                 //返回PA口数据存放在A中, 若有键按下, 则A不等于零

;--------------------------------------

DELAY:                  //延时子程序, 约10ms

    MOV   R7, #20

D1: DJNZ  R6, $

    DJNZ  R7, D1

    RET

END


;======================================

本程序运行的仿真截图,可见前面的插图。

题目中的电路,仅仅使用了一个数码管。这和实用的场合,还有差距。

如果使用动态显示的方法,驱动多位数码管,那么,矩阵键盘的规模,就可以再扩大一些。

而做而论道在这里给出的程序,却不用增加很多,仅仅再添上三、五行即可够用。


关键字:汇编编程  矩阵键盘  数码管 引用地址:51 汇编编程:8255 驱动矩阵键盘和数码管

上一篇:编写LED控制程序,完成LED奇数号灯和偶数号灯的交替显示
下一篇:51单片机汇编语言:定时器与中断

推荐阅读最新更新时间:2024-03-16 16:02

51单片机存储器结构介绍(2)
数据存储器 数据存储器也称为随机存取数据存储器。数据存储器分为内部数据存储和外部数据存储。MCS-51内部RAM有128或256个字节的用户数据存储(不同的型号有分别),片外最多可扩展64KB的RAM,构成两个地址空间,访问片内RAM用 MOV 指令,访问片外RAM用 MOVX 指令。它们是用于存放执行的中间结果和过程数据的。MCS-51的数据存储器均可读写,部分单元还可以位寻址。 MCS-51单片机的内部数据存储器在物理上和逻辑上都分为两个地址空间,即: 数据存储器空间(低128单元); 特殊功能寄存器空间(高128单元); 这两个空间是相连的,从用户角度而言,低128单元才是真正的数据存储器。下面我们就来详细的与
[单片机]
<font color='red'>51</font>单片机存储器结构介绍(2)
51单片机如何轻松转型到ARM设计?
看到很多在做电子工程设计的朋友在讨论:51单片机转到ARM该怎样学习?《单片机与嵌入式系统应用》小编为大家找到了这样一位工程师,谈谈他的实际经验~ 我以前一直用的是51,不过一直是C51,对C语言已经有10多年的经验,汇编用的很少,后来因为项目需要转到了ARM。一开始对ARM什么都不懂,看了本《ARM体系结构与编程》也是云里雾里的,但是也许是因为无知者无畏吧,我直接就在MDK中建立一个工程,添加了自带的启动文件,然后做了个main函数,里面一个死循环没有操作任何硬件,居然跑起来了。然后以此为基础,慢慢的开始控制GPIO和串口通信,当时突然发现,我的项目不就是搞搞这些吗?其他的什么运行模式、什么链接寄存器、什么PC寄存器关我
[单片机]
基于51单片机的7键8键电子琴proteus仿真数码管显示程序原理设计
硬件设计 8键仿真图: 方案: 7键仿真图: 7个按键表示7个音,另外一个按键播放歌曲 程序设计 /******************************************************************/ #include reg52.h #include main.h /******************************************************************/ sbit BeepIO = P2^0; //定义音频输出管脚 sbit KEY1 = P1^0; //按键1 do sbit KEY2 = P1^1; //按键2 re sb
[单片机]
基于<font color='red'>51</font>单片机的7键8键电子琴proteus仿真<font color='red'>数码管</font>显示程序原理设计
数码管(STC89C52): 第一个数码管循环显示0~F
一. 硬件设计 说明: 选通一个数码管分两步, 第一步是位选,即选择哪个数码管亮, 这里位选是通过锁存器U2的WE1~WE6来选择第一个数码管到第六个数码管,由于数码管为共阴极(相对于8位数码管),那么这里WE端为0代表位选选通, 第二步是段选,即选择数码管的哪位亮, 这里段选是通过锁存器U1的a~h来选择数码管的8位管子,这里DUAN端为1代表段选选通. 二. 程序设计 1. 程序功能 第一个数码管循环显示0~F 2. 程序源码 #include reg52.h #define uchar unsigned char #define uint unsigned int sbit d
[单片机]
<font color='red'>数码管</font>(STC89C52): 第一个<font color='red'>数码管</font>循环显示0~F
C51 指针问题
一般指针 一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如: long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。 char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。 一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。 2. 存储器指针 基于存储器的指针说明时即指定了存贮类型,例如: char data * str;str指向data区中char型数据 int xdata * pow; pow指向外部RAM的int型整数。 这
[单片机]
简述51单片机延时函数
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。扩展阅读:汇编延时程序算法详解 一. 500ms延时子程序 程序: void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2
[单片机]
MAX5121及其在DSP系统中的应用
1 MAX512l型D/A转换器 MAX5121是美国MAXIM公司生产的12位低功耗电压输出型串行数模转换器(DAC)。该器件具有灵活的三线串行接口,可以与SPI、QSPI和MICROWIRE串行口实现无缝联接。在使用内部基准参考电压源时,其最大输出电压为2.0475V。 MAX5121内部带有一个+1.25V基准参考电压源,如用户需要,也可外接片外参考电压。此外,它内部还包括一个16位的串行移位寄存器、一个输入寄存器、一个DAC寄存器和一个输出放大器。其输出电压的计算公式为: 式中,VREF是基准电压,Code是在0x000~0xFFF范围内的输入数字量,VOS为片外输入模拟电压。 MAX5121数模转换器具有两种工
[嵌入式]
51单片机电机pid控制系统程序
51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证。 /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码盘12孔, 晶振为12MHz,定时/计数器T0检测转速,用定时器T1进行定时, P1.0控制直流电机的正反转,用P1.1控制电机的转速. ************************/ #include reg52.h #include intrins.h #define uchar unsigned char uchar timcount,PWMH,SpeedSet,SpeedDet; uchar KP,KI,KD;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved