历史上的今天
返回首页

历史上的今天

今天是:2025年01月10日(星期五)

正在发生

2018年01月10日 | 液晶1602双机串口通信

2018-01-10 来源:eefocus

/**=============发送==================**/ 
KEYB    EQU     20H.0    ;按键标致(为1时有键按下) 

        ORG 0000H 

        AJMP MAIN 
        ORG 0030H 
MAIN:    
/*         MOV  SP,#60H 
         MOV  TMOD,#20H 
         MOV  TL1,#0E6H 
         MOV  TH1,#0E6H 
         MOV  SCON,#50H 
         MOV  PCON,#80H      ;   
        SETB TR1 
*/      
BEGIN:  ACALL KEY         ;调用键盘扫描 
        JB KEYB,BEGIN_     ;判断是否有键按下    
        JMP BEGIN 
BEGIN_: CLR KEYB 
         MOV  R0,#80H 
         MOV  A,R4 
         MOV  @R0,A 
         MOV  P0,A 
/* 
;发送联络信号  
ITX4:   MOV  SBUF,#33H     ;发给从机1 
ITX2:  JBC TI,ITX1 
       JMP ITX2            ;等待发送 
ITX1:  JBC RI,ITX3        ;等待二号机回答 
       JMP ITX1 
ITX3:   MOV  A,SBUF        ;接收联络信号 
       XRL A,#33H        ;异或,等于33H的话,A就为0 
       JNZ ITX4            ;二号机未准备好,继续联络    
;串行发送 
CK2:    MOV  R0,#80H        ;开始读取,数据传送    
START:  MOV  A,@R0 
        MOV  SBUF,A 
WAIT:  JBC TI,CONT 
       JMP WAIT 
CONT:  JMP BEGIN */ 
        SJMP BEGIN 

;********键盘扫描********调用键盘扫描以后会返回一个键值存于R4中,和一个标致位KEYB     
KEY:     MOV  A,#0FH         ;查询是否有键按下    
         MOV  P1,A 
         MOV  A,P1 
        CJNE A,#0FH,KEYY 
        CLR KEYB 
        AJMP NEXT 
KEYY:   ACALL DEL            ;去抖动     
         MOV  A,P1 
        CJNE A,#0FH,GO 
         MOV  R4,#10H            ;若有抖动,则返回无效键值     
        CLR KEYB 
        AJMP NEXT 
GO:     SETB KEYB            ;置按键标致位     
         MOV  R2,A            ;R2中存放着行信息           
    X1: CJNE R2,#0EH,X2        ;若为第一行    
         MOV  A,#0F0H 
         MOV  P1,A 
         MOV  A,P1 
         MOV  R3,A            ;R3中存放着列信息         
Y0:        CJNE R3,#0E0H,Y1    ;若为第一列                 
         MOV  R4,#00H            ;R4中存放要返回的键值 
        AJMP NEXT 
Y1:     CJNE R3,#0D0H,Y2    ;若为第二列,Yn表示16个键对应的操作    
         MOV  R4,#01H 
        AJMP NEXT 
Y2:     CJNE R3,#0B0H,Y3    ;若为第三列 
         MOV  R4,#02H 
        AJMP NEXT 
Y3:     CJNE R3,#70H,X2        ;若为第四列 
         MOV  R4,#03H 
        AJMP NEXT 
    X2: CJNE R2,#0DH,X3        ;若为第二行 
         MOV  A,#0F0H 
         MOV  P1,A 
         MOV  A,P1 
         MOV  R3,A 
Y4:        CJNE R3,#0E0H,Y5    ;若为第一列 
         MOV  R4,#04H 
        AJMP NEXT 
Y5:     CJNE R3,#0D0H,Y6    ;若为第二列 
         MOV  R4,#05H 
        AJMP NEXT 
Y6:     CJNE R3,#0B0H,Y7 
         MOV  R4,#06H 
        AJMP NEXT 
Y7:     CJNE R3,#70H,X3 
         MOV  R4,#07H 
        AJMP NEXT 
   X3:  CJNE R2,#0BH,X4         ;若为第三行        
         MOV  A,#0F0H 
         MOV  P1,A 
         MOV  A,P1 
         MOV  R3,A 
Y8:        CJNE R3,#0E0H,Y9 
         MOV  R4,#08H 
        AJMP NEXT 
Y9:     CJNE R3,#0D0H,Y10 
         MOV  R4,#09H 
        AJMP NEXT 
Y10:    CJNE R3,#0B0H,Y11 
         MOV  R4,#0AH 
        AJMP NEXT 
Y11:    CJNE R3,#70H,X4 
         MOV  R4,#0BH 
        AJMP NEXT 
   X4:  CJNE R2,#07H,NEXT      ;若为第四行 
         MOV  A,#0F0H 
         MOV  P1,A 
         MOV  A,P1 
         MOV  R3,A 
Y12:    CJNE R3,#0E0H,Y13 
         MOV  R4,#0CH 
        AJMP NEXT 
Y13:    CJNE R3,#0D0H,Y14 
         MOV  R4,#0DH 
        AJMP NEXT 
Y14:    CJNE R3,#0B0H,Y15 
         MOV  R4,#0EH 
        AJMP NEXT 
Y15:    CJNE R3,#70H,NEXT 
         MOV  R4,#0FH 
NEXT:   RET 



DEL:      MOV  R7,#07H 
DEL1_:   MOV  R6,#0FFH 
        DJNZ R6,$ 
         DJNZ R7,DEL1_ 
         RET 


   END 





/**==============接收========================**/ 
;********89C51引脚定义******** 
    RS    BIT     P3.6     ;数据/命令选择(H/L) 
    R_W   BIT     P2.5     ;读/写选择(H/L) 
    E     BIT     P2.6     ;使能信号 
    DB0_DB7  EQU  P0     ;数据传送端口 
;***************程序开始**************   


        ORG 0000H 
        AJMP MAIN 
        ORG 0030H 
MAIN:    
         
         MOV  R4,#80H       ;第一行首地址从80H开始 
         MOV  R1,#0C0H      ;第一行首地址从C0H开始 
         MOV  R2,#00H 
         MOV  R3,#16 
        LCALL INITIAL        ;显示初始化程序 
        LCALL CLS          ;调用清屏子程序 
AGAIN:     
         MOV  A,R4 
        LCALL WRITE_COM       ;调用写指令程序 
         MOV  A,R2           ;取表格中的第几个字符 
         MOV  DPTR,#LINE1       ;取表格的首地址 
        LCALL DISP           ;调用显示子程序 
        INC R4 
        INC R2 
        DJNZ R3,AGAIN 
         MOV  R2,#00H 
         MOV  R3,#16 
AGAIN1:     
         MOV  A,R1 
        LCALL WRITE_COM       ;调用写指令程序 
         MOV  A,R2           ;取表格中的第几个字符 
         MOV  DPTR,#LINE3       ;取表格的首地址 
        LCALL DISP           ;调用显示子程序 
        INC R1 
        INC R2 
        DJNZ R3,AGAIN1 


;************************************************* 
         MOV  TMOD,#20H 
         MOV  TL1,#0E6H 
         MOV  TH1,#0E6H 
         MOV  SCON,#50H 
         MOV  PCON,#80H 
        SETB TR1 
      
BEGIN: JBC RI,BR2 
       JMP BEGIN 
BR2:    MOV  A,SBUF 
       XRL A,#33H 
       JNZ BEGIN 
BT1:    MOV  SBUF,#33H 
BS1:   JBC TI,BR3 
       JMP BS1 

BR3:    MOV  R0,#80H 
WAIT:  JBC RI,READ 
       JMP WAIT 
READ:   MOV  A,SBUF 
        MOV  @R0,A 
        MOV  P0,A 
;显示接收数据    
         MOV  A,#0C7H 
        LCALL WRITE_COM       ;调用写指令程序 
         MOV  A,@R0           ;取表格中的第几个字符 
         MOV  DPTR,#LINE2       ;取表格的首地址 
        LCALL DISP           ;调用显示子程序 
         
        SJMP BEGIN 

;****** 初始化LCM子程序****** 
INITIAL: MOV  A,#38H 
        LCALL WRITE_COM 
         MOV  A,#0EH  
        LCALL WRITE_COM 
         MOV  A,#06H  
        LCALL WRITE_COM  
        RET 

;*******查询忙碌标志信号子程序******** 
CHECK_BUSY:      
        PUSH ACC 
BUSY_LOOP:     
        CLR E 
        SETB R_W 
        CLR RS 
        SETB E 
         MOV  A, DB0_DB7 
        CLR E 
        JB ACC.7,BUSY_LOOP 
        POP ACC 
        LCALL DEL 
        RET 

;****** 写指令到LCM子程序******* 
WRITE_COM:      
         LCALL CHECK_BUSY 
        CLR E 
        CLR RS  
        CLR R_W 
        SETB E 
         MOV   DB0_DB7,A 
        CLR E 
        RET 

;****** 写数据到LCM子程序****** 
WRITE_DATA:      
        LCALL CHECK_BUSY 
        CLR E 
        SETB RS  
        CLR R_W 
        SETB E 
         MOV   DB0_DB7,A 
        CLR E 
        RET 
;*******显示1个字符到LCM子程序******** 
DISP:     
;    PUSH ACC 
;    CLR A 
     MOV C A,@A+DPTR 
    LCALL WRITE_DATA 
;    POP ACC 
    RET 

;*******清除LCM子程序******* 
CLS:     MOV  A,#01H 
        LCALL WRITE_COM 
        RET 

;****延时子程序**** 
DEL:     
     MOV  R6,#5 
L1:     MOV  R7,#248 
    DJNZ R7,$ 
    DJNZ R6,L1 
    RET 
;******延时0.1s子程序:  T=两个机器周期(2*1us)*R5(4)*R6(256)*R7(256)us=0.524288s 
DELL:   MOV  R7,#09H 
DEL1:  MOV  R6,#0FFH 
DEL2:  MOV  R5,#0FFH 
      DJNZ R5,$ 
      DJNZ R6,DEL2 
      DJNZ R7,DEL1 
      RET 

;*****LCM第一、二行显示字符串***** 
LINE1:    DB "*** China OK ***",00H 
LINE2:    DB "0123456789ABCDEF",00H 
LINE3:    DB "-----(   )------",00H 


   END 


推荐阅读

史海拾趣

AW Industries Inc公司的发展小趣事

近年来,电子行业经历了巨大的变革,新技术、新产品层出不穷。面对这一挑战,AW Industries Inc积极调整战略,加大了对新技术、新产品的研发力度。同时,公司还通过优化生产流程、提高生产效率等方式降低成本,以保持竞争优势。这些措施使公司在行业变革中保持了稳定的发展态势。

Cypress(赛普拉斯)公司的发展小趣事

在发展历程中,Cypress经历了多次并购和业务整合。这些并购不仅扩大了公司的规模和业务范围,也带来了更多的技术和人才资源。通过并购和整合,Cypress能够更好地满足客户的需求,提供更加全面的解决方案。同时,公司还加强了内部管理和资源整合,提高了整体运营效率。

DAICO公司的发展小趣事

在电子行业中,技术创新是企业持续发展的关键。DAICO公司始终将研发创新作为核心战略,不断投入大量资源用于新技术和新产品的研发。通过持续的创新和积累,DAICO在中频/射频和微波控制领域取得了多项技术领先成果,成为行业内的佼佼者。

E-T-A Circuit Breakers公司的发展小趣事

E-T-A公司自1948年由Jakob Ellenberger和Harald A. Poensgen创立以来,一直由该家族掌管。尽管公司已经发展成为一个国际性的企业,但家族第二代和第三代领导人仍然保持着对公司的掌控和管理。他们秉承了家族的创业精神和价值观,坚持以客户为中心,以技术创新为驱动,不断推动公司向前发展。在家族传承的推动下,E-T-A公司得以保持其独特的企业文化和核心竞争力,在电子行业中持续领跑。

AUREL公司的发展小趣事

AUREL公司早期在电子行业中并不显眼,直到它成功研发出一款具有革命性的半导体芯片。这款芯片在功耗、性能和稳定性上都达到了前所未有的水平,立刻引起了市场的广泛关注。公司通过积极的市场推广和技术合作,逐渐打开了国内外市场,奠定了在电子行业中的技术领先地位。

Dresden Elektronik公司的发展小趣事

随着技术的不断进步,Dresden Elektronik公司不断加大对研发的投入,致力于推动技术的创新和突破。一次偶然的实验中,公司的研发团队发现了一种新的材料,能够显著提高电子元件的性能和稳定性。这一发现被迅速转化为产品,并成功推向市场,使公司的产品在竞争中脱颖而出。

问答坊 | AI 解惑

武汉理工大学-2009初赛题——挺不错!

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 在nuedc上看到的! 不错,当做比赛预测题来做吧!  …

查看全部问答>

对比一下欧洲某大学的考试题,国内工程师请进!

注:看了国内某电子工程师考试题,觉得国内注重实践,不知道是否知其然并知其所以然,因此小弟在此首次灌水,希望抛砖引玉,了解一下国内工程师的水平。 1。普通二极管和电力电子用的二极管在结构上有什么区别?提示:psn结构,s层的作用是什么? ...…

查看全部问答>

P0口与地址译码

一个这样的电路:主要有AT89C51、74LS32(或门)、74LS273!接法大致如下:               P3.6(WR)和P2.7(A15)接74LS32(或门)的出入;            &nb ...…

查看全部问答>

Quartus 警告中文说明

Error: Quartus II Analysis & Synthesis was unsuccessful. 1 error, 0 warnings   Error: Quartus II Analysis & Synthesis was unsuccessful. 1 error, 0 warnings   Error: Top-level design entity \"ctrl\" is und ...…

查看全部问答>

下面的结构体类型定义中的冒号代表什么?

typedef struct bGPIOx_CRL { unsigned int MODE0 :2; unsigned int CNF0  :2; unsigned int MODE1 :2; unsigned int CNF1  :2; unsigned int MODE2 :2; unsigned int CNF2  :2; unsigned int M ...…

查看全部问答>

AD7793的高精度温度测量系统--进展贴

没有按时间完成整个项目,PCB,硬件电路已完成。 电路图打包…

查看全部问答>

贴士:脉冲IV测试有讲究

之前,与大家聊了那么多关于脉冲IV测试的内容;今天,为大家总结了进行脉冲IV测试的几点注意事项:(好好收藏,一生享用!)   1、 确认连接:在连接到设备之后,执行任何脉冲测试前,使用scope-shot进行第一次测试以确认到DUT[1]的连接是正 ...…

查看全部问答>

为什么我的Application UART驱动无法安装???

我用的MSP430 G2231,电脑里装有CCS5.1,但为什么我把launchpad 接电脑usb上后无法安装驱动啊???哪位大神能帮帮忙???跪谢。。。我试过右键点更新驱动,手动找到CCS5.1的安装文件夹下的驱动,无法安装,还试过装TIUSBFET,CP2012之类的,都无效啊 ...…

查看全部问答>

请问如何测量51单片机的功耗?

低功耗的产品设计。   目前采用串入电流表分段测量。长期2uA。短期4.5mA。瞬间20mA. 有什么好方法能用示波器测量电流的波形来看时间算功耗呢 ?…

查看全部问答>

用示波器表比勾上SPI的脉冲和数据线才能使SPI工作的疑惑?

DSP 2812调试SPI,出现了下面的问题: 示波器两通道探头加上数据线和时钟线上,两通道的地都接电源地,SPI才能正常工作。松开数据线和时钟线上的波器的探头,SPI就立即停止工作。 问题可能出在哪里了呢? [ 本帖最后由 niu506 于 2012-9-9 18:12 ...…

查看全部问答>