找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2734|回復(fù): 8
收起左側(cè)

lcd顯示問(wèn)號(hào),應(yīng)該是數(shù)字(設(shè)計(jì)單片機(jī)電子時(shí)鐘)匯編語(yǔ)言

[復(fù)制鏈接]
ID:1085721 發(fā)表于 2023-6-26 12:07 | 顯示全部樓層 |閱讀模式
IMG20230626120355.jpg
單片機(jī)源程序如下:
  1. ;初始化      

  2.         P_Lcd equ P0            ;液晶lcd數(shù)據(jù)總線
  3.         pq equ p3              ;按鍵接口
  4.         pf bit p2.5             ;蜂鳴器接口
  5.         led bit p2.0            ;led燈指示接口
  6.         lcdrs bit p2.6         ;lcdrs=1選擇數(shù)據(jù)寄存器,lcdrs=0選擇指令寄存器
  7.         lcdrw bit p2.5                ;lcdrw=1進(jìn)行讀操作,lcdrw=0進(jìn)行寫(xiě)操作
  8.         lcde bit p2.7                ;lcdep由1-->0 時(shí),液晶模塊執(zhí)行命令
  9.         sclk bit p3.6           ;時(shí)鐘芯片時(shí)鐘線引腳
  10.         io bit p3.4             ;時(shí)鐘芯片數(shù)據(jù)傳輸線引腳
  11.         rst bit p3.5            ;時(shí)鐘芯片復(fù)位線引腳
  12.         IsSheZhi bit 30h        ;設(shè)置狀態(tài)標(biāo)示位
  13.         BJ bit 31h              ;比較標(biāo)示位
  14.         QH bit 32h              ;切換標(biāo)示位
  15.         bs bit 33h              ;報(bào)時(shí)功能標(biāo)示位
  16.         cxbs bit 34h            ;執(zhí)行報(bào)時(shí)標(biāo)志位
  17.         sec equ 50h
  18.         min equ 51h
  19.         hour equ 52h
  20.         day equ 53h
  21.         week equ 54h
  22.         month equ 55h
  23.         year equ 56h
  24.         KeyCode equ 57h         ;按鍵1功能子程序序號(hào)存儲(chǔ)地址
  25.         jiepai equ 58h          ;存放報(bào)時(shí)聲音的節(jié)拍常數(shù)
  26.         chuzhi equ 59h          ;報(bào)時(shí)開(kāi)始秒時(shí)間常數(shù)
  27.         shengshu equ 5ah        ;存放報(bào)時(shí)聲數(shù)
  28.         DspBuf equ 60h          ;當(dāng)前時(shí)間拆字后存儲(chǔ)首地址
  29.         dspba  equ 70h          ;鬧鐘時(shí)間首地址
  30. org 0h
  31.         ljmp main
  32.         org 00bh
  33.         ljmp sub1
  34. org 01bh
  35.         ljmp sub2
  36.         org 30h

  37. ;主程序      

  38. main:
  39.         clr IsSheZhi
  40.         clr QH
  41.         setb BJ
  42.         setb bs
  43.         setb cxbs
  44.         mov  KeyCode,#00h
  45.         mov sp ,#30h
  46.         mov year,#16h            ;為當(dāng)前時(shí)間賦初值
  47.         mov month,#06h
  48.         mov week,#4h
  49.         mov day,#30h
  50.         mov hour,#00h
  51.         mov min,#00h
  52.         mov sec,#00h
  53.         mov DspBuf-1,#0h
  54.         mov DspBuf-2,#02h
  55.         mov jiepai,#80h          ;設(shè)置節(jié)拍常數(shù)
  56.         mov chuzhi,#00h          ;設(shè)置1秒時(shí)開(kāi)始報(bào)時(shí)
  57.         mov dspba+0,#00h         ;為鬧鐘時(shí)間賦初值
  58.         mov dspba+1,#09h
  59.         mov dspba+2,#0h
  60.         mov dspba+3,#0h
  61.         mov TH0,#0ffh
  62.         mov TL0,#0ffh
  63.         mov TH1,#0ffh
  64.         mov TL1,#0ffh
  65.         mov IE,#8aH
  66.         mov TMOD,#11h
  67.         setb pf
  68.         acall lcd_init          ;調(diào)LCM的初始化程序
  69.         lcall word              ;把自創(chuàng)字符寫(xiě)入CGRAM的子程序
  70.         lcall set1302           ;DS1302初始化
  71. mainloop:
  72.         jb IsSheZhi, SheZhi     ;判斷是否處于設(shè)置狀態(tài),處于設(shè)置狀態(tài)則跳轉(zhuǎn)
  73.         lcall get1302           ;調(diào)讀時(shí)間子程序
  74.         lcall chaizi
  75.         lcall display           ;調(diào)顯示子程序,顯示當(dāng)前時(shí)間與溫度
  76. SheZhi:      
  77.         jb BJ,xq                ;判斷鬧鐘功能是否開(kāi)啟,未開(kāi)啟則跳轉(zhuǎn)
  78.         lcall bijiao            ;調(diào)比較子程序,比較當(dāng)前時(shí)間與鬧鐘時(shí)間
  79. xq:  
  80.         lcall  anjian           ;按鍵掃描
  81.         jb bs,bs_1
  82.         lcall zhengshi          ;判斷當(dāng)前時(shí)間是否是整時(shí),即能否報(bào)時(shí)
  83. bs_1:   
  84.         jb cxbs,cx_1
  85.         lcall baoshi            ;執(zhí)行報(bào)時(shí)功能
  86. cx_1:   
  87.         sjmp mainloop

  88. ;液晶顯示初始化設(shè)定            

  89. lcd_init:
  90.         mov a,#01h                ;清除LCD的顯示內(nèi)容(清屏)
  91.         acall LcdWrCmd
  92.         mov a,#6                ;10ms延時(shí)
  93.         acall delay
  94.         mov a,#38h              ;顯示模式設(shè)置(使用8位數(shù)據(jù),顯示兩行,使用5*7的字型)
  95.         acall LcdWrCmd
  96.         mov a,#6
  97.         acall delay
  98.         mov a,#0ch                ;顯示開(kāi)及光標(biāo)設(shè)置(顯示器開(kāi),光標(biāo)關(guān),字符不閃爍)
  99.         acall LcdWrCmd
  100.         mov a,#6
  101.         acall delay
  102.         mov a,#06h                ;顯示光標(biāo)移動(dòng)設(shè)置(字符不動(dòng),光標(biāo)自動(dòng)右移)
  103.         acall LcdWrCmd
  104.         mov a,#6
  105.         acall delay
  106.         ret

  107. ;LCM命令嵌入        

  108. LcdWrCmd:
  109.         ACALL CMBUSY
  110.         clr        LCDRW
  111.         clr        LCDRS
  112.         mov        P_Lcd, A
  113.         mov a,#6
  114.         acall delay
  115.         setb        LcdE
  116.         mov a,#6
  117.         acall delay
  118.         clr        LcdE
  119.         ret

  120. ;LCM數(shù)據(jù)輸入      

  121. LcdWrDat:
  122.         ACALL CMBUSY
  123.         setb        LCDRS
  124.         clr        LCDRW
  125.         mov        P_Lcd, A
  126.         mov a,#6
  127.         acall delay
  128.         setb        LcdE
  129.         mov a,#6
  130.         acall delay
  131.         clr        LcdE
  132.         ret

  133. ;延時(shí)子程序         

  134. delay:
  135.         mov r7,a           ;設(shè)置a為自定義變量,可省去其他延時(shí)程序的編寫(xiě)
  136.         d2:        mov r6,#250           ;設(shè)置1ms延時(shí)
  137. d1:
  138.         nop
  139.         nop
  140.         djnz r6,d1
  141.         djnz r7,d2
  142.         ret
  143. CMBUSY:
  144.         PUSH ACC
  145.         MOV P0,#0FFH
  146.         CLR LCDRS
  147.         SETB LCDRW
  148.         SETB LcdE
  149. LOOP1:
  150.         NOP
  151.         JB P0.7,LOOP1
  152.         CLR LcdE
  153.         POP ACC
  154. RET







  155. ;ds1302初始化程序set1302        

  156. set1302:
  157.         mov a,#8eh               ;寫(xiě)ds1302控制寄存器地址
  158.         mov b,#00h           ;允許寫(xiě)操作,將WP位設(shè)置為低電平
  159.         lcall clockwr
  160.         mov a,#8ch           ;寫(xiě)年初值
  161.         mov b,year
  162.         lcall clockwr
  163.         mov a,#88h           ;寫(xiě)月初值
  164.         mov b,month
  165.         lcall clockwr
  166.         mov a,#8ah           ;寫(xiě)星期初值
  167.         mov b,week
  168.         lcall clockwr
  169.         mov a,#86h           ;寫(xiě)日期初值
  170.         mov b,day
  171.         lcall clockwr
  172.         mov a,#84h           ;寫(xiě)時(shí)初值
  173.         mov b,hour
  174.         lcall clockwr
  175.         mov a,#82h           ;寫(xiě)分初值      
  176.         mov b,min
  177.         lcall clockwr
  178.         mov a,#80h           ;寫(xiě)秒初值
  179.         mov b,sec
  180.         lcall clockwr
  181.         ret

  182. ;讀時(shí)間子程序get1302     

  183.         get1302:mov a,#81h           ;讀秒
  184.         lcall clockrd
  185.         mov sec,a
  186.         mov a,#83h           ;讀分
  187.         lcall clockrd
  188.         mov min,a
  189.         mov a,#85h           ;讀時(shí)
  190.         lcall clockrd
  191.         mov hour,a
  192.         mov a,#87h           ;讀日
  193.         lcall clockrd
  194.         mov day,a
  195.         mov a,#8bh           ;讀星期
  196.         lcall clockrd
  197.         mov week,a
  198.         mov a,#89h           ;讀月
  199.         lcall clockrd
  200.         mov month,a
  201.         mov a,#8dh           ;讀年
  202.         lcall clockrd
  203.         mov year,a
  204.         ret

  205. ;ds1302讀子程序     
  206.         clockrd:clr rst    ;rst先設(shè)置低電平,再設(shè)置高電平,起到去亂碼作用
  207.         clr sclk           ;sclk置為低電平
  208.         setb rst           ;rst置為高電平,選通DS1302
  209.         mov r7,#8          ;串行移位傳送次數(shù)
  210. rds1:      
  211.         rrc a
  212.         mov io,c           ;輸出一位寄存器讀地址
  213.         setb sclk          ;發(fā)串行脈沖
  214.         nop
  215.         nop
  216.         clr sclk           ;sclk置為低電平
  217.         djnz r7,rds1
  218.         nop                ;延時(shí),防后面串行讀數(shù)據(jù)丟失
  219.         nop
  220.         setb io            ;8位地址輸出完畢,IO設(shè)置為輸入端口
  221.         mov r7,#8
  222. rds2:  
  223.         mov c,io           ;讀入一位數(shù)據(jù)
  224.         rrc a
  225.         setb sclk          ;發(fā)串行脈沖
  226.         nop
  227.         nop
  228.         clr sclk
  229.         djnz r7,rds2
  230.         clr rst
  231.         setb sclk
  232.         ret

  233. ;ds1302寫(xiě)數(shù)據(jù)子程序         

  234. clockwr:
  235.         push acc           ;設(shè)置堆棧,入棧
  236.         push b
  237.         clr rst
  238.         clr sclk
  239.         setb rst           ;選通DS1302
  240.         mov r7,#8
  241. wrs1:   
  242.         rrc a
  243.         mov io,c           ;輸出一位寄存器寫(xiě)地址
  244.         clr sclk           ;發(fā)串行輸出脈沖
  245.         setb sclk
  246.         djnz r7,wrs1
  247.         nop
  248.         mov a,b            ;將待寫(xiě)入數(shù)據(jù)送A
  249.         mov r7,#8
  250. wrs2:   
  251.         rrc a
  252.         mov io,c           ;經(jīng)IO輸出一位數(shù)據(jù)
  253.         clr sclk
  254.         setb sclk
  255.         djnz r7,wrs2
  256.         pop b              ;出棧
  257.         pop acc
  258.         ret

  259. ;顯示設(shè)置—— 分配時(shí)間顯示空間   

  260. chaizi:
  261.         mov a,year          ;拆年
  262.         mov r0,#60h
  263.         acall hex2bcd
  264.         mov a,month            ;拆月
  265.         mov r0,#62h
  266.         acall hex2bcd
  267.         mov a,day            ;拆日期
  268.         mov r0,#64h
  269.         lcall  hex2bcd
  270.         mov a,week;
  271.         mov 66h,a
  272.         mov a,hour            ;拆時(shí)
  273.         mov r0,#67h
  274.         lcall  hex2bcd
  275.         mov a,min
  276.         mov r0,#69h            ;拆分
  277.         lcall  hex2bcd
  278.         mov a,sec
  279.         mov r0,#6bh            ;拆秒
  280.         acall hex2bcd
  281.         ret

  282. ;顯示設(shè)置—— 采用除法指令實(shí)現(xiàn)的拆字子程序

  283. hex2bcd:
  284.         mov b,a
  285.         anl a,#0f0h
  286.         swap a
  287.         mov @r0,a
  288.         mov a,b
  289.         anl a,#0fh
  290.         inc r0
  291.         mov @r0,a
  292.         ret

  293. ;顯示設(shè)置——連續(xù)顯示相鄰的兩字節(jié)

  294. LcdDspBuf:
  295.         mov A, @R0
  296.         orl a,#30h
  297.         acall LcdWrDat
  298.         mov a,6
  299.         lcall delay
  300.         inc R0
  301.         djnz R2, LcdDspBuf
  302.         ret

  303. ;顯示設(shè)置——自創(chuàng)字符寫(xiě)入CGRAM的子程序

  304. word:         
  305.         mov a,#40h
  306.         lcall LcdWrCmd
  307.         mov r5,#40
  308.         mov dptr,#tab1
  309.         mov r4,#0
  310. nextt:        
  311.         mov a,r4
  312.         movc a,@a+dptr
  313.         lcall LcdWrDat
  314.         inc r4
  315.         djnz r5,nextt
  316.         ret
  317. tab1:      
  318.         db 08h,0fh,12h,0fh,0ah,1fh,02h,00h;年
  319.         db 0fh,09h,0fh,09h,0fh,09h,13h,00h;月
  320.         db 0fh,09h,09h,0fh,09h,09h,0fh,00h;日
  321.         db 06h,0fh,1fh,0fh,07h,1bh,19h,00h;顯示鬧鐘功能開(kāi)啟標(biāo)示符號(hào)
  322.         db 15h,15h,04h,11h,1bh,1fh,0eh,00h;顯示報(bào)時(shí)功能開(kāi)啟標(biāo)示符號(hào)

  323. ;進(jìn)入鬧鐘功能設(shè)置顯示   

  324. display_nz:
  325.         mov a,#0c2h
  326.         acall LcdWrCmd     ;確定鬧鐘時(shí)間的首地址
  327.         mov R0, #dspba+0
  328.         mov R2, #2
  329.         acall LcdDspBuf           ;顯示時(shí)
  330.         mov a,#3ah         ;顯示分隔符號(hào)
  331.         acall        LcdWrDat
  332.         mov R0, #dspba+2
  333.         mov R2, #2
  334.         acall LcdDspBuf           ;顯示時(shí)
  335.         jb BJ,XT           ;判斷鬧鐘功能是否開(kāi)啟
  336.         mov a,#0c0h
  337.         acall LcdWrCmd
  338.         mov  a,#03h           ;顯示鬧鐘功能開(kāi)啟標(biāo)示符號(hào)
  339.         acall        LcdWrDat
  340. XT:    ret

  341. ;正常顯示設(shè)置     

  342. display:
  343.         mov a,#80h
  344.         acall LcdWrCmd           ;指明顯示的首地址
  345.         mov R0, #DspBuf-2
  346.         mov R2, #2
  347.         acall LcdDspBuf           ;顯示年份前兩位
  348.         mov R0, #DspBuf+0
  349.         mov R2, #2
  350.         acall LcdDspBuf           ;顯示年后兩位
  351.         mov  a,#00h           ;顯示漢字年
  352.         acall        LcdWrDat
  353.         mov R0, #DspBuf+2
  354.         mov R2, #2
  355.         acall LcdDspBuf           ;顯示月份
  356.         mov  a,#01h           ;顯示漢月字年
  357.         acall        LcdWrDat
  358.         mov R0, #DspBuf+4
  359.         mov R2, #2
  360.         acall LcdDspBuf           ;顯示日期
  361.         mov  a,#02h           ;顯示漢日字年
  362.         acall        LcdWrDat
  363.         mov a,#8ch           ;w指明星期的首地址
  364.         acall LcdWrCmd
  365.         mov a,#57h
  366.         acall        LcdWrDat   ;顯示w
  367.         mov a,#3ah         ;顯示分隔符號(hào)
  368.         acall        LcdWrDat
  369.         mov  a,66h         ;顯示星期值
  370.         orl a,#30h
  371.         acall        LcdWrDat
  372.         jb bs,XtT           ;判斷報(bào)時(shí)功能是否開(kāi)啟
  373.         mov  a,#04h           ;顯示報(bào)時(shí)功能開(kāi)啟標(biāo)示符號(hào)
  374.         acall        LcdWrDat
  375. XtT:      
  376.         mov a,#0c2h
  377.         acall LcdWrCmd           ;確定地址
  378.         mov R0, #DspBuf+7
  379.         mov R2, #2
  380.         acall LcdDspBuf           ;顯示時(shí)
  381.         mov a,#3ah         ;顯示分隔符號(hào)
  382.         acall        LcdWrDat
  383.         mov R0, #DspBuf+9
  384.         mov R2, #2
  385.         acall LcdDspBuf           ;顯示分
  386.         mov a,#3ah           ;顯示分隔符號(hào)
  387.         acall        LcdWrDat
  388.         mov R0, #DspBuf+11
  389.         mov R2, #2
  390.         acall LcdDspBuf    ;顯示秒
  391.         jb BJ,xyz           ;判斷鬧鐘功能是否開(kāi)啟
  392.         mov a,#0c0h
  393.         acall LcdWrCmd
  394.         mov  a,#03h           ;顯示鬧鐘功能開(kāi)啟標(biāo)示符號(hào)
  395.         acall        LcdWrDat
  396. xyz:          ret
  397.         ret

  398. ;按鍵處理

  399. anjian:
  400.         mov a,pq
  401.         anl a,#0fh
  402.         cjne a,#0fh,kp1
  403.         ret
  404. kp1:         
  405.         mov a,#5                ;設(shè)置5ms延時(shí),起到去抖掃描
  406.         acall delay
  407.         mov a,pq
  408.         anl a,#0fh
  409.         cjne a,#0fh,kp2
  410.         ret
  411. kp2:        
  412.         JB pq.0,KK1
  413.         jnb pq.0,$
  414.         lcall  anjian1
  415.         ret
  416. KK1:         
  417.         JB pq.1,KK2
  418.         jnb pq.1,$
  419.         lcall  anjian2
  420.         ret
  421. KK2:         
  422.         JB pq.2,KK3
  423.         jnb pq.2,$
  424.         lcall  anjian3
  425.         ret
  426. KK3:         
  427.         JB pq.3,KK4
  428.         jnb pq.3,$
  429.         lcall  anjian4
  430. KK4:        ret

  431. ;該子程序根據(jù)的KeyCode內(nèi)容轉(zhuǎn)入各對(duì)應(yīng)的操作程序中

  432. anjian1:
  433.         mov a,KeyCode
  434.         mov dptr,#tab5
  435.         add a,KeyCode
  436.         jnc nadd
  437.         inc dph                   ;KeyCode乘2進(jìn)位加到DPH中
  438. nadd:      
  439.         mov r3,a           ;暫存
  440.         movc a,@a+dptr           ;取地址高八位
  441.         xch a,r3           ;保存轉(zhuǎn)移地址高8位
  442.         inc a
  443.         movc a,@a+dptr           ;取地址低八位
  444.         mov dpl,a           ;置轉(zhuǎn)移地址低8位
  445.         mov dph,r3
  446.         clr a
  447.         jmp @a+dptr
  448.         ret
  449. tab5:        dw  opr00,opr01,opr02 ,opr03 ;16位轉(zhuǎn)移地址表的首地址

  450. ;進(jìn)入時(shí)間調(diào)整設(shè)置狀態(tài)

  451. opr00:
  452.         setb IsSheZhi
  453.         mov r1,#DspBuf+12   ;編輯時(shí)間從秒個(gè)位開(kāi)始
  454.         mov a,#0fh
  455.         acall LcdWrCmd
  456.         mov a,#0c9h
  457.         acall LcdWrCmd
  458.         mov  KeyCode,#02h
  459.         ret

  460. ;進(jìn)入設(shè)置鬧鐘時(shí)間狀態(tài)            

  461. opr01:
  462.         setb IsSheZhi
  463.         mov r1,#dspba+3     ;編輯時(shí)間從分個(gè)位開(kāi)始
  464.         mov a,#0fh
  465.         acall LcdWrCmd
  466.         mov a,#0c6h
  467.         acall LcdWrCmd
  468.         mov  KeyCode,#03h
  469.         ret

  470. ;把所設(shè)置的時(shí)間作為當(dāng)前時(shí)間        

  471. opr02:
  472.         mov a,DspBuf+11
  473.         swap  a
  474.         mov b,DspBuf+12
  475.         orl a,b
  476.         mov sec,a             ;存秒
  477.         mov a,DspBuf+9
  478.         swap  a
  479.         mov b,DspBuf+10
  480.         orl a,b
  481.         mov min,a             ;存分
  482.         mov a,DspBuf+7
  483.         swap  a
  484.         mov b,DspBuf+8
  485.         orl a,b
  486.         mov hour,a              ;存時(shí)
  487.         mov a,DspBuf+4
  488.         swap  a
  489.         mov b,DspBuf+5
  490.         orl a,b
  491.         mov day,a              ;存日期
  492.         mov week,DspBuf+4;    ;存星期值
  493.         mov a,DspBuf+2
  494.         swap  a
  495.         mov b,DspBuf+3
  496.         orl a,b
  497.         mov month,a              ;存月
  498.         mov a,DspBuf+0
  499.         swap  a
  500.         mov b,DspBuf+1
  501.         orl a,b
  502.         mov year,a              ;存年
  503.         lcall set1302              ;為當(dāng)前時(shí)間
  504.         cpl IsSheZhi          ;退出設(shè)置狀態(tài)
  505.         mov a,#0ch            ;開(kāi)啟 閃動(dòng)
  506.         acall LcdWrCmd
  507.         mov  KeyCode,#00h
  508.         ret

  509. ;把所設(shè)置的時(shí)間作為鬧鐘時(shí)間      

  510. opr03:
  511.         mov a,#0c0h
  512.         acall LcdWrCmd
  513.         mov  a,#03h              ;顯示鬧鐘功能開(kāi)啟標(biāo)示符號(hào)
  514.         acall        LcdWrDat
  515.         mov a,#0ch              ;撤銷閃動(dòng)
  516.         acall LcdWrCmd
  517.         clr IsSheZhi              ;退出設(shè)置狀態(tài)
  518.         mov  KeyCode,#00h
  519.         clr QH
  520.         clr BJ                      ;開(kāi)啟鬧鐘功能
  521.         ret      
  522. anjian2:
  523.         mov a, KeyCode
  524.         clr c
  525.         subb a,#02h
  526.         jc ppr1              ;判斷鐘是否處于設(shè)置狀態(tài),不是則跳
  527.         jb  QH, opr1a
  528.         mov a,r1
  529.         clr c
  530.         subb a,#5eh
  531.         mov dptr,#taba4
  532.         movc a,@a+dptr
  533.         mov b,a
  534.         inc @r1
  535.         mov a,@r1
  536.         cjne a,        b,ppra1
  537.         mov @r1,#0
  538. ppra1:
  539.         lcall www             ;掃描當(dāng)前時(shí)間編輯位
  540.         ret
  541. taba4:        db 0ah,0ah,0ah,0ah,02h,0ah,04h,0ah,08h,03h,0ah,06h,0ah,06h,0ah;當(dāng)前時(shí)間各編輯位極大值表
  542. opr1a:
  543.         mov a,r1
  544.         clr c
  545.         subb a,#70h
  546.         mov dptr,#taba6
  547.         movc a,@a+dptr
  548.         mov b,a
  549.         inc @r1
  550.         mov a,@r1
  551.         cjne a,b,ppra1k
  552.         mov @r1,#0
  553. ppra1k:
  554.         lcall wwwa          ;掃描鬧鐘時(shí)間編輯位
  555.         ret
  556. taba6 :        db 03h,0ah,06h,0ah  ;鬧鐘時(shí)間各編輯位極大值表
  557. ppr1:         cpl IsSheZhi
  558.         cpl QH              ;切換屏幕
  559.         jnb QH,TY
  560.         mov a,#01h          ;清屏幕
  561.         acall LcdWrCmd
  562.         mov  KeyCode,#01h   ;指明按鍵1下次執(zhí)行的功能子程序
  563.         acall display_nz    ;顯示鬧鐘時(shí)間
  564.         ret
  565. TY:     mov  KeyCode,#00h   ;指明按鍵1下次執(zhí)行的功能子程序
  566.         ret

  567. ;按鍵3處理設(shè)計(jì)      

  568. anjian3:
  569.         mov a, KeyCode
  570.         clr c
  571.         subb a,#02h
  572.         jc ajppr2           ;判斷鐘是否處于設(shè)置狀態(tài),不是跳
  573.         jb  QH, opr2b       ;判斷鐘是否處于編輯鬧鐘時(shí)間狀態(tài)
  574.         dec r1                    ;移位
  575.         cjne r1,#DspBuf-3,ppr2a
  576.         mov r1,#DspBuf+12
  577. ppr2a:  
  578.         lcall www            ;掃描當(dāng)前時(shí)間編輯位
  579.         ret
  580. opr2b:      
  581.         dec r1                    ;移位
  582.         cjne r1,#dspba-1,ppr2ak
  583.         mov r1,#dspba+3
  584. ppr2ak:
  585.         lcall wwwa            ;掃描鬧鐘時(shí)間編輯位
  586.         ret
  587. ajppr2:
  588.         mov a,#01h            ;清除屏幕
  589.         acall LcdWrCmd
  590.         cpl BJ
  591.         JB BJ,TY_1
  592.         ret
  593. TY_1:
  594.         clr tr0
  595.         setb pf
  596.         ret

  597. ;按鍵4處理設(shè)計(jì)      

  598. anjian4:
  599.         mov a, KeyCode
  600.         clr c
  601.         subb a,#02h
  602.         jc anjian4_1        ;判斷鐘是否處于設(shè)置狀態(tài),否則跳
  603.         clr IsSheZhi
  604.         mov  KeyCode,#00h
  605.         mov a,#0ch            ;取消閃動(dòng)
  606.         acall LcdWrCmd
  607.         ret
  608. anjian4_1:
  609.         mov a,#01h            ;清除屏幕
  610.         acall LcdWrCmd
  611.         cpl bs              ;控制報(bào)時(shí)功能
  612.         JB bs,TY_2
  613.         ret
  614. TY_2:
  615.         clr tr1
  616.         setb pf
  617.         ret

  618. ;掃描當(dāng)前時(shí)間編輯位     

  619. www:
  620.         mov a,r1
  621.         clr c
  622.         subb a,#5eh
  623.         mov dptr,#tab4
  624.         movc a,@a+dptr
  625.         mov b,a                   ;暫存 閃動(dòng)位置
  626.         acall LcdWrCmd      ;寫(xiě)入編輯位的位置
  627.         mov a,#10                ;設(shè)置10ms延時(shí)
  628.         acall delay
  629.         mov a,@r1
  630.         orl a,#30h
  631.         acall LcdWrDat      ;寫(xiě)入數(shù)據(jù)
  632.         mov a,b                    ;確定閃動(dòng)位置
  633.         acall LcdWrCmd
  634.         ret

  635. ;掃描鬧鐘時(shí)間編輯位      

  636. wwwa:
  637.           mov a,r1
  638.         clr c
  639.         subb a,#70h
  640.         mov dptr,#tab6
  641.         movc a,@a+dptr
  642.         mov b,a             ;暫存 閃動(dòng)位置
  643.         acall LcdWrCmd            ;寫(xiě)入編輯位的位置
  644.         mov a,#10           ;設(shè)置10ms延時(shí)
  645.         acall delay
  646.         mov a,@r1
  647.         orl a,#30h
  648.         acall LcdWrDat      ;寫(xiě)入數(shù)據(jù)
  649.         mov a,b                    ;確定閃動(dòng)位置
  650.         acall LcdWrCmd
  651.         ret
  652. tab4:db 80h,81h,82h,83h,85h,86h,88h,89h,8eh,0c2h,0c3h,0c5h,0c6h,0c8h,0c9h
  653. ;當(dāng)前時(shí)間各編輯位在LCD上的位置表
  654. tab6:db 0c2h,0c3h,0c5h,0c6h ;鬧鐘時(shí)間各編輯位在LCD上的位置表

  655. ;比較子程序            

  656. bijiao:
  657.         mov a, dspba+0
  658.         cjne a,DspBuf+7,bijiao_1 ;比較當(dāng)前時(shí)間與鬧鐘時(shí)間的時(shí)十位
  659.         mov a, dspba+1
  660.         cjne a,DspBuf+8,bijiao_1 ;比較當(dāng)前時(shí)間與鬧鐘時(shí)間的時(shí)個(gè)位
  661.         mov a, dspba+2
  662.         cjne a,DspBuf+9,bijiao_1 ;比較當(dāng)前時(shí)間與鬧鐘時(shí)間的分鐘十位
  663.         mov a, dspba+3
  664.         cjne a,DspBuf+10,bijiao_1;比較當(dāng)前時(shí)間與鬧鐘時(shí)間的分鐘個(gè)位
  665.         setb TR0
  666.         ret
  667. bijiao_1:
  668.         clr TR0
  669.         setb pf
  670.         clr  led
  671.         ret

  672. ; 整點(diǎn)報(bào)時(shí)子程序         

  673. zhengshi:
  674.         mov a,sec             ;判斷當(dāng)前時(shí)間是否是整時(shí),即能否報(bào)時(shí)
  675.         jnz js                 ;判斷是否位0秒
  676.         mov a,min
  677.         jnz js                  ;判斷是否位0分
  678.         mov a,DspBuf+7
  679.         mov b,#10
  680.         mul ab
  681.         add a,DspBuf+8         ;;BCD碼轉(zhuǎn)化位二進(jìn)制
  682.         cjne a,#13,$+3         ;判斷時(shí)是否超過(guò)12小時(shí)
  683.         jc ss
  684.         clr c
  685.         subb a,#12
  686. ss:      
  687.         mov shengshu,a
  688.         cpl bs                 ;暫時(shí)關(guān)閉判斷整時(shí)
  689.         clr cxbs               ;開(kāi)始報(bào)時(shí)
  690. js:        ret

  691. ;執(zhí)行報(bào)時(shí)baoshi        

  692. baoshi:                 ;執(zhí)行報(bào)時(shí)功能
  693.         mov a,chuzhi
  694.         cjne a,sec,ltt
  695.         setb tr1
  696.         mov a,chuzhi
  697.         add a,#01h      
  698.         da a
  699.         mov chuzhi,a
  700.         djnz shengshu,ltt
  701.         cpl bs
  702.         setb cxbs
  703.         mov chuzhi,#00h
  704. ltt:          ret

  705. ;蜂鳴器響功能設(shè)置     

  706. sub1:
  707.         cpl pf
  708.         reti
  709. sub2:
  710.         mov th1,#0f8h          ;設(shè)置報(bào)時(shí)聲的音色
  711.         cpl pf
  712.         djnz jiepai,sub2_1
  713.         mov jiepai,#80h    ;設(shè)置節(jié)拍常數(shù)
  714.         clr tr1
  715. sub2_1: reti
  716.         end


復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2023-6-26 16:59 | 顯示全部樓層
蜂鳴器和lcdrw共用了P2.5
而且蜂鳴器會(huì)在中斷里取反
于是有機(jī)會(huì)LCD在讀寫(xiě)數(shù)據(jù)時(shí)
lcdrw被取反了

評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
木木老大 + 8 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2023-6-26 17:17 | 顯示全部樓層
1、弄清楚LCD顯示原理(點(diǎn)的位置,顯示命令)。
2、字庫(kù)與LCD中顯示點(diǎn)的對(duì)應(yīng)關(guān)系。
3、走單步調(diào)試。
回復(fù)

使用道具 舉報(bào)

ID:1085721 發(fā)表于 2023-6-26 22:47 | 顯示全部樓層
lkc8210 發(fā)表于 2023-6-26 16:59
蜂鳴器和lcdrw共用了P2.5
而且蜂鳴器會(huì)在中斷里取反
于是有機(jī)會(huì)LCD在讀寫(xiě)數(shù)據(jù)時(shí)

太有道理了!
可是我這個(gè)似乎還有問(wèn)題,
我按照您這個(gè)把蜂鳴器的口改過(guò)之后(原來(lái)那個(gè)口我看的串了,確實(shí)是錯(cuò)的!),還是有問(wèn)號(hào)
想請(qǐng)問(wèn)您還有沒(méi)有什么建議,求指導(dǎo)
回復(fù)

使用道具 舉報(bào)

ID:384109 發(fā)表于 2023-6-26 22:53 | 顯示全部樓層
1302沒(méi)有能正常運(yùn)行,或者讀取1302錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

ID:1085721 發(fā)表于 2023-6-27 09:54 | 顯示全部樓層
人中狼 發(fā)表于 2023-6-26 22:53
1302沒(méi)有能正常運(yùn)行,或者讀取1302錯(cuò)誤

我后來(lái)用這個(gè)程序去仿真,發(fā)現(xiàn)它可以正常運(yùn)行,和預(yù)期的一樣
回復(fù)

使用道具 舉報(bào)

ID:1085721 發(fā)表于 2023-6-27 10:29 | 顯示全部樓層
現(xiàn)在程序在每次讀字符的時(shí)候都加了nop,給1602加了檢測(cè)它是否繁忙的程序,任然是仿真沒(méi)有問(wèn)題,硬件有問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:1085721 發(fā)表于 2023-6-27 10:30 | 顯示全部樓層
yzwzfyz 發(fā)表于 2023-6-26 17:17
1、弄清楚LCD顯示原理(點(diǎn)的位置,顯示命令)。
2、字庫(kù)與LCD中顯示點(diǎn)的對(duì)應(yīng)關(guān)系。
3、走單步調(diào)試。

我的仿真沒(méi)有問(wèn)題,但是硬件顯示不來(lái)
回復(fù)

使用道具 舉報(bào)

ID:1085721 發(fā)表于 2023-6-27 10:35 | 顯示全部樓層
大家:現(xiàn)在我的程序把初始化的數(shù)字改成其他數(shù)字時(shí),出現(xiàn)問(wèn)號(hào)亂碼的位置也變了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表