找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1937|回复: 8
收起左侧

lcd显示问号,应该是数字(设计单片机电子时钟)汇编语言

[复制链接]
ID:1085721 发表于 2023-6-26 12:07 | 显示全部楼层 |阅读模式
IMG20230626120355.jpg
单片机源程序如下:
  1. ;初始化      

  2.         P_Lcd equ P0            ;液晶lcd数据总线
  3.         pq equ p3              ;按键接口
  4.         pf bit p2.5             ;蜂鸣器接口
  5.         led bit p2.0            ;led灯指示接口
  6.         lcdrs bit p2.6         ;lcdrs=1选择数据寄存器,lcdrs=0选择指令寄存器
  7.         lcdrw bit p2.5                ;lcdrw=1进行读操作,lcdrw=0进行写操作
  8.         lcde bit p2.7                ;lcdep由1-->0 时,液晶模块执行命令
  9.         sclk bit p3.6           ;时钟芯片时钟线引脚
  10.         io bit p3.4             ;时钟芯片数据传输线引脚
  11.         rst bit p3.5            ;时钟芯片复位线引脚
  12.         IsSheZhi bit 30h        ;设置状态标示位
  13.         BJ bit 31h              ;比较标示位
  14.         QH bit 32h              ;切换标示位
  15.         bs bit 33h              ;报时功能标示位
  16.         cxbs bit 34h            ;执行报时标志位
  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功能子程序序号存储地址
  25.         jiepai equ 58h          ;存放报时声音的节拍常数
  26.         chuzhi equ 59h          ;报时开始秒时间常数
  27.         shengshu equ 5ah        ;存放报时声数
  28.         DspBuf equ 60h          ;当前时间拆字后存储首地址
  29.         dspba  equ 70h          ;闹钟时间首地址
  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            ;为当前时间赋初值
  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          ;设置节拍常数
  56.         mov chuzhi,#00h          ;设置1秒时开始报时
  57.         mov dspba+0,#00h         ;为闹钟时间赋初值
  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          ;调LCM的初始化程序
  69.         lcall word              ;把自创字符写入CGRAM的子程序
  70.         lcall set1302           ;DS1302初始化
  71. mainloop:
  72.         jb IsSheZhi, SheZhi     ;判断是否处于设置状态,处于设置状态则跳转
  73.         lcall get1302           ;调读时间子程序
  74.         lcall chaizi
  75.         lcall display           ;调显示子程序,显示当前时间与温度
  76. SheZhi:      
  77.         jb BJ,xq                ;判断闹钟功能是否开启,未开启则跳转
  78.         lcall bijiao            ;调比较子程序,比较当前时间与闹钟时间
  79. xq:  
  80.         lcall  anjian           ;按键扫描
  81.         jb bs,bs_1
  82.         lcall zhengshi          ;判断当前时间是否是整时,即能否报时
  83. bs_1:   
  84.         jb cxbs,cx_1
  85.         lcall baoshi            ;执行报时功能
  86. cx_1:   
  87.         sjmp mainloop

  88. ;液晶显示初始化设定            

  89. lcd_init:
  90.         mov a,#01h                ;清除LCD的显示内容(清屏)
  91.         acall LcdWrCmd
  92.         mov a,#6                ;10ms延时
  93.         acall delay
  94.         mov a,#38h              ;显示模式设置(使用8位数据,显示两行,使用5*7的字型)
  95.         acall LcdWrCmd
  96.         mov a,#6
  97.         acall delay
  98.         mov a,#0ch                ;显示开及光标设置(显示器开,光标关,字符不闪烁)
  99.         acall LcdWrCmd
  100.         mov a,#6
  101.         acall delay
  102.         mov a,#06h                ;显示光标移动设置(字符不动,光标自动右移)
  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数据输入      

  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. ;延时子程序         

  134. delay:
  135.         mov r7,a           ;设置a为自定义变量,可省去其他延时程序的编写
  136.         d2:        mov r6,#250           ;设置1ms延时
  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               ;写ds1302控制寄存器地址
  158.         mov b,#00h           ;允许写操作,将WP位设置为低电平
  159.         lcall clockwr
  160.         mov a,#8ch           ;写年初值
  161.         mov b,year
  162.         lcall clockwr
  163.         mov a,#88h           ;写月初值
  164.         mov b,month
  165.         lcall clockwr
  166.         mov a,#8ah           ;写星期初值
  167.         mov b,week
  168.         lcall clockwr
  169.         mov a,#86h           ;写日期初值
  170.         mov b,day
  171.         lcall clockwr
  172.         mov a,#84h           ;写时初值
  173.         mov b,hour
  174.         lcall clockwr
  175.         mov a,#82h           ;写分初值      
  176.         mov b,min
  177.         lcall clockwr
  178.         mov a,#80h           ;写秒初值
  179.         mov b,sec
  180.         lcall clockwr
  181.         ret

  182. ;读时间子程序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           ;读时
  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先设置低电平,再设置高电平,起到去乱码作用
  207.         clr sclk           ;sclk置为低电平
  208.         setb rst           ;rst置为高电平,选通DS1302
  209.         mov r7,#8          ;串行移位传送次数
  210. rds1:      
  211.         rrc a
  212.         mov io,c           ;输出一位寄存器读地址
  213.         setb sclk          ;发串行脉冲
  214.         nop
  215.         nop
  216.         clr sclk           ;sclk置为低电平
  217.         djnz r7,rds1
  218.         nop                ;延时,防后面串行读数据丢失
  219.         nop
  220.         setb io            ;8位地址输出完毕,IO设置为输入端口
  221.         mov r7,#8
  222. rds2:  
  223.         mov c,io           ;读入一位数据
  224.         rrc a
  225.         setb sclk          ;发串行脉冲
  226.         nop
  227.         nop
  228.         clr sclk
  229.         djnz r7,rds2
  230.         clr rst
  231.         setb sclk
  232.         ret

  233. ;ds1302写数据子程序         

  234. clockwr:
  235.         push acc           ;设置堆栈,入栈
  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           ;输出一位寄存器写地址
  244.         clr sclk           ;发串行输出脉冲
  245.         setb sclk
  246.         djnz r7,wrs1
  247.         nop
  248.         mov a,b            ;将待写入数据送A
  249.         mov r7,#8
  250. wrs2:   
  251.         rrc a
  252.         mov io,c           ;经IO输出一位数据
  253.         clr sclk
  254.         setb sclk
  255.         djnz r7,wrs2
  256.         pop b              ;出栈
  257.         pop acc
  258.         ret

  259. ;显示设置—— 分配时间显示空间   

  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            ;拆时
  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. ;显示设置—— 采用除法指令实现的拆字子程序

  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. ;显示设置——连续显示相邻的两字节

  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. ;显示设置——自创字符写入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;显示闹钟功能开启标示符号
  322.         db 15h,15h,04h,11h,1bh,1fh,0eh,00h;显示报时功能开启标示符号

  323. ;进入闹钟功能设置显示   

  324. display_nz:
  325.         mov a,#0c2h
  326.         acall LcdWrCmd     ;确定闹钟时间的首地址
  327.         mov R0, #dspba+0
  328.         mov R2, #2
  329.         acall LcdDspBuf           ;显示时
  330.         mov a,#3ah         ;显示分隔符号
  331.         acall        LcdWrDat
  332.         mov R0, #dspba+2
  333.         mov R2, #2
  334.         acall LcdDspBuf           ;显示时
  335.         jb BJ,XT           ;判断闹钟功能是否开启
  336.         mov a,#0c0h
  337.         acall LcdWrCmd
  338.         mov  a,#03h           ;显示闹钟功能开启标示符号
  339.         acall        LcdWrDat
  340. XT:    ret

  341. ;正常显示设置     

  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         ;显示分隔符号
  368.         acall        LcdWrDat
  369.         mov  a,66h         ;显示星期值
  370.         orl a,#30h
  371.         acall        LcdWrDat
  372.         jb bs,XtT           ;判断报时功能是否开启
  373.         mov  a,#04h           ;显示报时功能开启标示符号
  374.         acall        LcdWrDat
  375. XtT:      
  376.         mov a,#0c2h
  377.         acall LcdWrCmd           ;确定地址
  378.         mov R0, #DspBuf+7
  379.         mov R2, #2
  380.         acall LcdDspBuf           ;显示时
  381.         mov a,#3ah         ;显示分隔符号
  382.         acall        LcdWrDat
  383.         mov R0, #DspBuf+9
  384.         mov R2, #2
  385.         acall LcdDspBuf           ;显示分
  386.         mov a,#3ah           ;显示分隔符号
  387.         acall        LcdWrDat
  388.         mov R0, #DspBuf+11
  389.         mov R2, #2
  390.         acall LcdDspBuf    ;显示秒
  391.         jb BJ,xyz           ;判断闹钟功能是否开启
  392.         mov a,#0c0h
  393.         acall LcdWrCmd
  394.         mov  a,#03h           ;显示闹钟功能开启标示符号
  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                ;设置5ms延时,起到去抖扫描
  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. ;该子程序根据的KeyCode内容转入各对应的操作程序中

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

  450. ;进入时间调整设置状态

  451. opr00:
  452.         setb IsSheZhi
  453.         mov r1,#DspBuf+12   ;编辑时间从秒个位开始
  454.         mov a,#0fh
  455.         acall LcdWrCmd
  456.         mov a,#0c9h
  457.         acall LcdWrCmd
  458.         mov  KeyCode,#02h
  459.         ret

  460. ;进入设置闹钟时间状态            

  461. opr01:
  462.         setb IsSheZhi
  463.         mov r1,#dspba+3     ;编辑时间从分个位开始
  464.         mov a,#0fh
  465.         acall LcdWrCmd
  466.         mov a,#0c6h
  467.         acall LcdWrCmd
  468.         mov  KeyCode,#03h
  469.         ret

  470. ;把所设置的时间作为当前时间        

  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              ;存时
  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              ;为当前时间
  504.         cpl IsSheZhi          ;退出设置状态
  505.         mov a,#0ch            ;开启 闪动
  506.         acall LcdWrCmd
  507.         mov  KeyCode,#00h
  508.         ret

  509. ;把所设置的时间作为闹钟时间      

  510. opr03:
  511.         mov a,#0c0h
  512.         acall LcdWrCmd
  513.         mov  a,#03h              ;显示闹钟功能开启标示符号
  514.         acall        LcdWrDat
  515.         mov a,#0ch              ;撤销闪动
  516.         acall LcdWrCmd
  517.         clr IsSheZhi              ;退出设置状态
  518.         mov  KeyCode,#00h
  519.         clr QH
  520.         clr BJ                      ;开启闹钟功能
  521.         ret      
  522. anjian2:
  523.         mov a, KeyCode
  524.         clr c
  525.         subb a,#02h
  526.         jc ppr1              ;判断钟是否处于设置状态,不是则跳
  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             ;扫描当前时间编辑位
  540.         ret
  541. taba4:        db 0ah,0ah,0ah,0ah,02h,0ah,04h,0ah,08h,03h,0ah,06h,0ah,06h,0ah;当前时间各编辑位极大值表
  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          ;扫描闹钟时间编辑位
  555.         ret
  556. taba6 :        db 03h,0ah,06h,0ah  ;闹钟时间各编辑位极大值表
  557. ppr1:         cpl IsSheZhi
  558.         cpl QH              ;切换屏幕
  559.         jnb QH,TY
  560.         mov a,#01h          ;清屏幕
  561.         acall LcdWrCmd
  562.         mov  KeyCode,#01h   ;指明按键1下次执行的功能子程序
  563.         acall display_nz    ;显示闹钟时间
  564.         ret
  565. TY:     mov  KeyCode,#00h   ;指明按键1下次执行的功能子程序
  566.         ret

  567. ;按键3处理设计      

  568. anjian3:
  569.         mov a, KeyCode
  570.         clr c
  571.         subb a,#02h
  572.         jc ajppr2           ;判断钟是否处于设置状态,不是跳
  573.         jb  QH, opr2b       ;判断钟是否处于编辑闹钟时间状态
  574.         dec r1                    ;移位
  575.         cjne r1,#DspBuf-3,ppr2a
  576.         mov r1,#DspBuf+12
  577. ppr2a:  
  578.         lcall www            ;扫描当前时间编辑位
  579.         ret
  580. opr2b:      
  581.         dec r1                    ;移位
  582.         cjne r1,#dspba-1,ppr2ak
  583.         mov r1,#dspba+3
  584. ppr2ak:
  585.         lcall wwwa            ;扫描闹钟时间编辑位
  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处理设计      

  598. anjian4:
  599.         mov a, KeyCode
  600.         clr c
  601.         subb a,#02h
  602.         jc anjian4_1        ;判断钟是否处于设置状态,否则跳
  603.         clr IsSheZhi
  604.         mov  KeyCode,#00h
  605.         mov a,#0ch            ;取消闪动
  606.         acall LcdWrCmd
  607.         ret
  608. anjian4_1:
  609.         mov a,#01h            ;清除屏幕
  610.         acall LcdWrCmd
  611.         cpl bs              ;控制报时功能
  612.         JB bs,TY_2
  613.         ret
  614. TY_2:
  615.         clr tr1
  616.         setb pf
  617.         ret

  618. ;扫描当前时间编辑位     

  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                   ;暂存 闪动位置
  626.         acall LcdWrCmd      ;写入编辑位的位置
  627.         mov a,#10                ;设置10ms延时
  628.         acall delay
  629.         mov a,@r1
  630.         orl a,#30h
  631.         acall LcdWrDat      ;写入数据
  632.         mov a,b                    ;确定闪动位置
  633.         acall LcdWrCmd
  634.         ret

  635. ;扫描闹钟时间编辑位      

  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             ;暂存 闪动位置
  643.         acall LcdWrCmd            ;写入编辑位的位置
  644.         mov a,#10           ;设置10ms延时
  645.         acall delay
  646.         mov a,@r1
  647.         orl a,#30h
  648.         acall LcdWrDat      ;写入数据
  649.         mov a,b                    ;确定闪动位置
  650.         acall LcdWrCmd
  651.         ret
  652. tab4:db 80h,81h,82h,83h,85h,86h,88h,89h,8eh,0c2h,0c3h,0c5h,0c6h,0c8h,0c9h
  653. ;当前时间各编辑位在LCD上的位置表
  654. tab6:db 0c2h,0c3h,0c5h,0c6h ;闹钟时间各编辑位在LCD上的位置表

  655. ;比较子程序            

  656. bijiao:
  657.         mov a, dspba+0
  658.         cjne a,DspBuf+7,bijiao_1 ;比较当前时间与闹钟时间的时十位
  659.         mov a, dspba+1
  660.         cjne a,DspBuf+8,bijiao_1 ;比较当前时间与闹钟时间的时个位
  661.         mov a, dspba+2
  662.         cjne a,DspBuf+9,bijiao_1 ;比较当前时间与闹钟时间的分钟十位
  663.         mov a, dspba+3
  664.         cjne a,DspBuf+10,bijiao_1;比较当前时间与闹钟时间的分钟个位
  665.         setb TR0
  666.         ret
  667. bijiao_1:
  668.         clr TR0
  669.         setb pf
  670.         clr  led
  671.         ret

  672. ; 整点报时子程序         

  673. zhengshi:
  674.         mov a,sec             ;判断当前时间是否是整时,即能否报时
  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码转化位二进制
  682.         cjne a,#13,$+3         ;判断时是否超过12小时
  683.         jc ss
  684.         clr c
  685.         subb a,#12
  686. ss:      
  687.         mov shengshu,a
  688.         cpl bs                 ;暂时关闭判断整时
  689.         clr cxbs               ;开始报时
  690. js:        ret

  691. ;执行报时baoshi        

  692. baoshi:                 ;执行报时功能
  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. ;蜂鸣器响功能设置     

  706. sub1:
  707.         cpl pf
  708.         reti
  709. sub2:
  710.         mov th1,#0f8h          ;设置报时声的音色
  711.         cpl pf
  712.         djnz jiepai,sub2_1
  713.         mov jiepai,#80h    ;设置节拍常数
  714.         clr tr1
  715. sub2_1: reti
  716.         end


复制代码


回复

使用道具 举报

ID:161164 发表于 2023-6-26 16:59 | 显示全部楼层
蜂鸣器和lcdrw共用了P2.5
而且蜂鸣器会在中断里取反
于是有机会LCD在读写数据时
lcdrw被取反了

评分

参与人数 1黑币 +8 收起 理由
木木老大 + 8 很给力!

查看全部评分

回复

使用道具 举报

ID:123289 发表于 2023-6-26 17:17 | 显示全部楼层
1、弄清楚LCD显示原理(点的位置,显示命令)。
2、字库与LCD中显示点的对应关系。
3、走单步调试。
回复

使用道具 举报

ID:1085721 发表于 2023-6-26 22:47 | 显示全部楼层
lkc8210 发表于 2023-6-26 16:59
蜂鸣器和lcdrw共用了P2.5
而且蜂鸣器会在中断里取反
于是有机会LCD在读写数据时

太有道理了!
可是我这个似乎还有问题,
我按照您这个把蜂鸣器的口改过之后(原来那个口我看的串了,确实是错的!),还是有问号
想请问您还有没有什么建议,求指导
回复

使用道具 举报

ID:384109 发表于 2023-6-26 22:53 | 显示全部楼层
1302没有能正常运行,或者读取1302错误
回复

使用道具 举报

ID:1085721 发表于 2023-6-27 09:54 | 显示全部楼层
人中狼 发表于 2023-6-26 22:53
1302没有能正常运行,或者读取1302错误

我后来用这个程序去仿真,发现它可以正常运行,和预期的一样
回复

使用道具 举报

ID:1085721 发表于 2023-6-27 10:29 | 显示全部楼层
现在程序在每次读字符的时候都加了nop,给1602加了检测它是否繁忙的程序,任然是仿真没有问题,硬件有问题
回复

使用道具 举报

ID:1085721 发表于 2023-6-27 10:30 | 显示全部楼层
yzwzfyz 发表于 2023-6-26 17:17
1、弄清楚LCD显示原理(点的位置,显示命令)。
2、字库与LCD中显示点的对应关系。
3、走单步调试。

我的仿真没有问题,但是硬件显示不来
回复

使用道具 举报

ID:1085721 发表于 2023-6-27 10:35 | 显示全部楼层
大家:现在我的程序把初始化的数字改成其他数字时,出现问号乱码的位置也变了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表