久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1337|回復: 3
收起左側

我想用4乘4矩陣鍵盤,LCD1602,蜂鳴器實現單片機電子琴但是中斷有問題麻煩大家看看

[復制鏈接]
ID:1027053 發表于 2022-5-17 16:26 | 顯示全部樓層 |閱讀模式
  1.      RS EQU P2^6
  2.          RW EQU P2^5
  3.          E EQU P2^7
  4.          LCD EQU P0
  5.          BF EQU P0^7  
  6.          ORG 0000H
  7.      LJMP INIT
  8.          ORG 000BH
  9.          LJMP MAIN
  10.      ORG 0060H
  11.          ;初始化
  12. INIT:
  13.      CLR P2^7// 使能清0
  14.      MOV R0,#0
  15.          MOV R1,#0
  16.          MOV R0,#38H         //設置16乘2顯示,5乘7點陣,8位數據接口
  17.          ACALL WRITE_COM
  18.          MOV R0,#0
  19.          MOV R0,#0CH        //設置開顯示,不顯示光標
  20.          ACALL WRITE_COM
  21.          MOV R0,#0
  22.          MOV R0,#06H  // 寫一個字符后地址指針加1
  23.          ACALL WRITE_COM
  24.          MOV R0,#0
  25.          MOV R0,#01H   //顯示清0,數據指針清0
  26.          ACALL WRITE_COM
  27.          RET
  28.          ;寫指令函數,調用前先把指令碼放到R0中
  29. DELAY:
  30. MOV R6,#5
  31. W2:MOV R7,#239
  32. W1:DJNZ R7,W1
  33.    DJNZ R6,W2
  34.    RET
  35. WRITE_COM:
  36.   CLR P2^6//RS清0
  37.   MOV P0,R0        //R0中放指令代碼
  38.   ACALL DELAY
  39.   SETB P2^7//使能置1
  40.   ACALL DELAY
  41.   CLR P2^7
  42.   RET
  43.   ;寫數據函數,調用前先把指令放到R1中
  44. WRITE_DATA:
  45.   SETB P2^6
  46.   MOV P0,R1
  47.   ACALL DELAY
  48.   SETB P2^7
  49.   ACALL DELAY
  50.   CLR P2^7
  51.   RET   
  52. MAIN:MOV SP,#70H
  53.      MOV TMOD,#11H //定時器初始化
  54.          SETB EA
  55.          SETB ET0
  56.          MOV  DPTR,#TAB
  57.          CLR A
  58.          ACALL INIT
  59.          MOV R0,#80H//定位到第一行
  60.          ACALL WRITE_COM
  61.          ACALL DELAY
  62.          ACALL KEYSCAN
  63.          JMP $
  64.          ;線反轉法找被按下的鍵
  65. KEYSCAN:
  66.      MOV P1,#0F0H        //給P1賦值,為了讀列線
  67.          MOV A,P1                                 //此時按鍵的狀態
  68.          ANL A,#0F0H                  //與
  69.          //  找出被按下的列線
  70.          JNZ DELAY10MS
  71. DELAY10MS:   ;誤差 0us
  72.     MOV R7,#01H
  73. DL1:
  74.     MOV R6,#26H
  75. DL0:
  76.     MOV R5,#82H
  77.     DJNZ R5,$
  78.     DJNZ R6,DL0
  79.     DJNZ R7,DL1
  80.     RET          //延時去抖
  81.           MOV A,P1
  82.           ANL A, #0F0H
  83.           MOV R0,A                                             //此時列線狀態記錄在R0
  84.           JNZ KEYSCAN1                                                                                         
  85.           LJMP KEYSCAN
  86. KEYSCAN1:
  87.       MOV A,#00H                                 //清零
  88.           MOV P1,#0FH                 //置位讀行線
  89.           MOV A ,P1                         //此時按鍵的狀態
  90.           ANL A ,#0FH
  91.           MOV R1,A                                //此時行線狀態記錄在R1
  92.           ANL A ,#0FH
  93.           JNZ NUM
  94.           LJMP KEYSCAN
  95. NUM:
  96.           MOV A ,R0
  97.           MOV B,R1
  98.           ORL A,B//A或上B,數據保存在A
  99.           SJMP DISP0
  100. DISP0:
  101.      CJNE A,#0EEH,DISP1
  102.          MOV A ,#01H
  103.          MOVC A ,@A+DPTR
  104.          MOV P0,A//LCD1602顯示屏輸出音律
  105.          ACALL WRITE_DATA
  106.          ACALL DELAY
  107.          MOV TL0,#22H
  108.          MOV TH0,#0FEH
  109.          LCALL DELAY1
  110.          LCALL SOUND
  111.          LJMP KEYSCAN
  112. DISP1:
  113.     CJNE A ,#0EDH,DISP2
  114.         MOV A ,#02H
  115.         MOVC A,@A+DPTR
  116.         MOV P0,A
  117.         ACALL WRITE_DATA
  118.         ACALL DELAY
  119.         MOV TL0,#4FH
  120.         MOV TH0,#0FEH
  121.         LCALL DELAY1
  122.         LCALL SOUND
  123.         LJMP KEYSCAN
  124. DISP2:
  125.    CJNE A ,#0EBH,DISP3
  126.    MOV A ,#03H
  127.    MOVC A ,@A+DPTR
  128.    MOV P0,A
  129.    ACALL WRITE_DATA
  130.    ACALL DELAY
  131.    MOV TL0,#85H
  132.    MOV TH0,#0FEH
  133.    LCALL DELAY1
  134.    LCALL SOUND
  135.    LJMP KEYSCAN
  136. DISP3:
  137.    CJNE A,#0E7H,DISP4
  138.    MOV A,#04H
  139.    MOVC A ,@A+DPTR
  140.    MOV P0,A
  141.    ACALL WRITE_DATA
  142.    ACALL DELAY
  143.    MOV        TL0,#9AH
  144.    MOV  TH0,#0FEH
  145.    LCALL DELAY1
  146.    LCALL SOUND
  147.    LJMP KEYSCAN
  148. DISP4:
  149.    CJNE A,#0DEH,DISP5
  150.    MOV A, #05H
  151.    MOVC A ,@A+DPTR
  152.    MOV P0,A
  153.    ACALL WRITE_DATA
  154.         ACALL DELAY
  155.    MOV TL0,#0C1H
  156.    MOV TH0,#0FEH
  157.    LCALL DELAY1
  158.    LCALL SOUND
  159.    LJMP KEYSCAN
  160. DISP5:
  161.    CJNE A,#0DDH,DISP6
  162.    MOV A ,#06H
  163.    MOVC A ,@A+DPTR
  164.    MOV P0,A         
  165.    ACALL WRITE_DATA
  166.         ACALL DELAY
  167.    MOV TL0,#0E4H
  168.    MOV TH0,#0FEH
  169.    LCALL DELAY1
  170.    LCALL SOUND
  171.    LJMP KEYSCAN
  172. DISP6:
  173.    CJNE A,#0DBH,KEY
  174.    MOV A ,#07H
  175.    MOVC A ,@A+DPTR
  176.    MOV P0,A
  177.    ACALL WRITE_DATA
  178.         ACALL DELAY
  179.    MOV TL0,#03H
  180.    MOV TH0,#0FFH
  181.    LCALL DELAY1
  182.    LCALL SOUND
  183.    LJMP KEYSCAN
  184. DELAY1:MOV R2,#0FH
  185. LOOP10:MOV R3,0FAH
  186. LOOP20:DJNZ R3,LOOP20
  187.        DJNZ R2,LOOP10
  188.          RET
  189. SOUND:
  190.      SETB TR0
  191.          SETB P3^0 //輸出高電平,開始鳴叫
  192.          MOV R4,#4H
  193. LOOP:MOV R3,#0F9H
  194. LOOP1: DJNZ R3,LOOP1
  195.        DJNZ R4,LOOP
  196.            CLR P3^0        //輸出低電平,停止鳴叫
  197.            RETI
  198. KEY:LJMP MAIN

  199.          
  200. TAB:DB 31H,32H,33H,34H,35H,36H,37H
  201.            END
復制代碼


回復

使用道具 舉報

ID:624769 發表于 2022-5-18 00:07 | 顯示全部樓層

  •          ORG 0000H
  •      LJMP INIT
  •          ORG 000BH
  •          LJMP MAIN

開頭看了這4行,我就有不祥的預感……

再往下一核對……,稍微找了一下。
  • MAIN:MOV SP,#70H
  •      MOV TMOD,#11H //定時器初始化
  •          SETB EA
  •          SETB ET0
  •          MOV  DPTR,#TAB
  •          CLR A
  •          ACALL INIT
  •          MOV R0,#80H//定位到第一行
  •          ACALL WRITE_COM
  •          ACALL DELAY
  •          ACALL KEYSCAN
  •          JMP $

看到這里,我確定了,這代碼不用看了。 你如果不是疏忽,就不要學匯編了。匯編不適合你。
難怪沒人回復,我也不知道怎么回復了,改用 C 吧,或者匯編從最基本的開始重新回爐學吧……
回復

使用道具 舉報

ID:123289 發表于 2022-5-18 17:28 | 顯示全部樓層
1、先畫出邏輯框圖,走通框圖后,再寫程序。
2、搞清楚各中斷入口地址。
問題1:
程序開始后,直接轉入INIT,INIT的未句是 RET,執行RET時,程序就跑飛了。
RET 指令是從SP所指的位置中取運行地址。開機時SP=07,即RET的返回地址在[07H][06H]中,
這時你的[07H][06H]中放的是什么里?沒有給出,很隨機,所以程序飛了。
即使僥幸放的是0000,返回0000運行,又會執行到RET,而這時SP已于上次RET時-2了,即SP=05,于是又從[05H][06H]中,取地址運行,如此下去必跑飛,死機。
問題2:
不要用DELAY,它占用CPU的時間!在DELAY時CPU不能干其它活。
……
回復

使用道具 舉報

ID:73992 發表于 2022-5-20 23:32 來自手機 | 顯示全部樓層
我覺得程序寫的很好,寫程序是為了達到創意。程序格式是有點問題,不用氣餒慢慢修改漸漸就會了。org0000h  ljmp main 意思是程序開始后跳轉到主程序 org 000bh ljmp init 意思是如果t0溢出則跳轉到init子程序,org 0060h 意思是程序從60h開始寫。中斷子程序init  返回不用ret
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久国产精品 | 日日夜夜免费精品视频 | 午夜免费网 | 国产一区二区视频在线观看 | 欧美精品久久 | 亚洲网址在线观看 | 午夜播放器在线观看 | 亚洲狠狠丁香婷婷综合久久久 | 国产特一级黄色片 | 亚洲日本欧美日韩高观看 | 欧美 日韩 国产 成人 在线 | 日日躁狠狠躁aaaaxxxx | 精品久久久久久久 | 五月天激情电影 | 草比av| 国产极品车模吞精高潮呻吟 | 网站黄色在线 | 日日操夜夜操天天操 | 国产精品视频久久久久 | 精品福利视频一区二区三区 | 剑来高清在线观看 | 中文字幕一区二区三区四区不卡 | 国产午夜在线 | 国产中文字幕网 | 亚洲国产成人精品女人久久久 | 一区二区三区四区日韩 | 国产精品视频区 | 国产一区二区三区免费观看视频 | 亚洲喷水 | 国产精品久久久久久久岛一牛影视 | 亚洲精品久久久9婷婷中文字幕 | 久久av综合| 毛片a级| 性色在线 | 中文字幕av网 | 国产成人综合久久 | 欧美日高清视频 | 超碰最新在线 | 久久国内精品 | 亚洲h视频 | 91亚洲国产精品 |