找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7745|回复: 5
打印 上一主题 下一主题
收起左侧

基于51单片机的DS18B20温度+LCD显示汇编语言源程序与仿真

  [复制链接]
跳转到指定楼层
楼主
基于51单片机的DS18B20温度+LCD显示(汇编编写)


单片机源程序如下:
  1.                   TEMP_ZH   DATA  24H     ;实时温度值存放单元
  2.           TEMPL     DATA  25H     ;
  3.           TEMPH     DATA  26H     ;
  4.           TEMP_TH   DATA  27H     ;高温报警值存放单元
  5.           TEMP_TL   DATA  28H     ;低温报警值存放单元
  6.           TEMPHC    DATA  29H     ;
  7.           TEMPLC    DATA  2AH

  8.           K1     EQU  P1.4
  9.           K2     EQU  P1.5
  10.           K3     EQU  P1.6
  11.           K4     EQU  P1.7

  12.           BEEP      EQU  P3.7
  13.           RELAY     EQU  P1.3
  14.           LCD_X     EQU  2FH      ;LCD 地址变量
  15.           LCD_RS    EQU  P2.0
  16.           LCD_RW    EQU  P2.1
  17.           LCD_EN    EQU  P2.2
  18.           flag1     equ  20H.0    ;DS18B20是否存在标记
  19.           KEY_UD    EQU  20H.1    ;设定 KEY 的UP与DOWN 标记
  20.           date_line equ p3.3
  21. ;=====================================================
  22.            ORG  0000H
  23.            JMP  MAIN

  24.                   
  25.                   ORG  0030H
  26. MAIN:     MOV  SP,#60H
  27.           MOV  A,#00H
  28.           MOV  R0,#20H       ;将 20H-2FH 单元清零
  29.           MOV  R1,#10H
  30. CLEAR:    MOV  @R0,A
  31.           INC  R0
  32.           DJNZ  R1,CLEAR

  33.           CALL  SET_LCD
  34.           CALL  RE_18B20

  35. start:    CALL  RESET          ;18B20复位子程序
  36.           JNB   FLAG1,START1   ;DS1820不存在
  37.           CALL  MENU_OK
  38.           CALL  READ_E2
  39.           CALL  TEMP_BJ        ;显示温度标记
  40.           JMP   START2
  41. START1:   CALL  MENU_ERROR
  42.           CALL  TEMP_BJ        ;显示温度标记
  43.           JMP  $

  44. START2:
  45.           CALL  RESET
  46.           JNB  FLAG1,START1    ;DS1820不存在
  47.           MOV   A,#0CCH        ; 跳过ROM匹配
  48.           CALL  WRITE
  49.           MOV   A,#44H         ; 发出温度转换命令
  50.           CALL  WRITE
  51.           CALL  RESET
  52.           MOV   A,#0CCH        ; 跳过ROM匹配
  53.           CALL  WRITE
  54.           MOV   A,#0BEH        ; 发出读温度命令
  55.           CALL  WRITE
  56.           CALL  READ
  57.           call CONVTEMP
  58.           Call DISPBCD
  59.           CALL CONV
  60.           CALL TEMP_COMP
  61.           CALL  PROC_KEY       ; 键扫描

  62.    SJMP START2
  63. ;-----------------------------------------------------
  64. PROC_KEY:
  65.   JB  K1,PROC_K1    ; 按键K1处理
  66.          CALL  BEEP_BL
  67.          JNB  K1,$
  68.          MOV  DPTR,#M_ALAX1
  69.          MOV  A,#1
  70.          CALL  LCD_PRINT
  71.          CALL  LOOK_ALARM
  72.          JB  K3,$
  73.          CALL  BEEP_BL
  74.          JMP  PROC_K2
  75. PROC_K1:     ; 按键K2处理
  76.          JB  K2,PROC_END
  77.          CALL  BEEP_BL
  78.          JNB  K2,$
  79.          MOV   DPTR,#RESET_A1
  80.          MOV   A,#1
  81.          CALL  LCD_PRINT
  82.          CALL  SET_ALARM
  83.          CALL  RE_18B20           ;将设定的TH,TL值写入DS18B20内
  84.          CALL  WRITE_E2
  85. PROC_K2:
  86.          CALL  MENU_OK
  87.          CALL  TEMP_BJ
  88. PROC_END:
  89.          RET
  90. ;============================================
  91. ;设定报警值 TH、TL
  92. ;============================================
  93. SET_ALARM:
  94.          ;CALL  RESET_ALARM
  95.          CALL  LOOK_ALARM
  96. AS0:
  97.          JB   K1,AS00
  98.          CALL  BEEP_BL
  99.          JNB  K1,$
  100.          CPL  20H.1            ;UP/DOWN 标记
  101. AS00:    JB  20H.1,ASZ01       ;20H.1=1,UP
  102.          JMP  ASJ01            ;20H.1=0,DOWN

  103. ASZ01:   JB  K2,ASZ02          ;TH值调整(增加)
  104.          CALL  BEEP_BL
  105.          INC  TEMP_TH
  106.          MOV  A,TEMP_TH
  107.          CJNE  A,#120,ASZ011
  108.          MOV  TEMP_TH,#0
  109. ASZ011:  CALL  LOOK_ALARM
  110.          MOV  R5,#10
  111.          CALL  DELAY
  112.          JMP  ASZ01

  113. ASZ02:   JB  K3,ASZ03          ;TL值调整(增加)
  114.          CALL  BEEP_BL
  115.          INC  TEMP_TL
  116.          MOV  A,TEMP_TL
  117.          CJNE  A,#99,ASZ021
  118.          MOV  TEMP_TL,#00H
  119. ASZ021:  CALL  LOOK_ALARM    ;
  120.          MOV  R5,#10
  121.          CALL  DELAY
  122.          JMP  ASZ02
  123. ASZ03:   JB  K4,AS0          ;确定调整 OK
  124.          CALL  BEEP_BL
  125.          JNB  K4,$
  126.          RET

  127. ASJ01:
  128.          JB  K2,ASJ02          ;TH值调整 (减少)
  129.          CALL  BEEP_BL
  130.          DEC   TEMP_TH
  131.          MOV  A,TEMP_TH
  132.          CJNE  A,#0FFH,ASJ011
  133.          JMP  ASJ022
  134. ASJ011:  CALL  LOOK_ALARM
  135.          MOV  R5,#10
  136.          CALL  DELAY
  137.          JMP  AS0

  138. ASJ02:   JB  K3,ASJ03         ;TL值调整(减少)
  139.          CALL  BEEP_BL
  140.          DEC  TEMP_TL
  141.          MOV  A,TEMP_TL
  142.          CJNE  A,#0FFH,ASJ021
  143.          JMP  ASJ022
  144. ASJ021:  CALL  LOOK_ALARM    ;
  145.          MOV  R5,#10
  146.          CALL  DELAY
  147.          JMP  AS0
  148. ASJ022:  CPL  20H.1
  149.          JMP  ASZ01
  150. ASJ03:   JMP  ASZ03
  151.          RET


  152. RESET_ALARM:
  153.           MOV  DPTR,#RESET_A1  ;指针指到显示信息区
  154.           MOV  A,#1            ;显示在第一行
  155.           CALL  LCD_PRINT
  156.           RET
  157. RESET_A1:
  158.      DB  "RESET ALERT CODE"
  159. ;====================================================
  160. ;实际温度值与标记温度值比较子程序
  161. ;====================================================
  162. TEMP_COMP:
  163.           MOV  A,TEMP_TH      
  164.           SUBB  A,TEMP_ZH       ;减数>被减数,则
  165.           JC  CHULI1            ;借位标志位C=1,转
  166.           MOV  A,TEMP_ZH
  167.           SUBB  A,TEMP_TL       ;减数>被减数,则
  168.           JC  CHULI2            ;借位标志位C=1,转
  169.           MOV  DPTR,#BJ5
  170.           CALL  TEMP_BJ3
  171.           CLR   RELAY           ;继电器吸合
  172.           RET
  173. CHULI1:
  174.           MOV  DPTR,#BJ3
  175.           CALL  TEMP_BJ3
  176.           SETB  RELAY           ;继电器关闭
  177.           CALL  BEEP_BL
  178.           RET
  179. CHULI2:
  180.           MOV  DPTR,#BJ4
  181.           CALL  TEMP_BJ3
  182.           CALL  BEEP_BL
  183.           RET
  184. ;-----------------------------------------
  185. TEMP_BJ3:
  186.           MOV  A,#0CEH
  187.           CALL WCOM
  188.           MOV  R1,#0
  189.           MOV  R0,#2

  190. BBJJ3:    MOV  A,R1
  191.           MOVC A,@A+DPTR
  192.           CALL  WDATA
  193.           INC R1
  194.           DJNZ  R0,BBJJ3
  195.           RET
  196. BJ3:
  197.       DB  ">H"
  198. BJ4:
  199.       DB  "<L"
  200. BJ5:
  201.       DB  " !"
  202. ;==================================================
  203. ;显示温度标记子程序
  204. ;==================================================
  205. TEMP_BJ:
  206.           MOV  A,#0CBH
  207.           CALL WCOM
  208.           MOV  DPTR,#BJ1  ;指针指到显示消息
  209.           MOV  R1,#0
  210.           MOV  R0,#2

  211. BBJJ1:    MOV  A,R1
  212.           MOVC A,@A+DPTR
  213.           CALL  WDATA
  214.           INC R1
  215.           DJNZ  R0,BBJJ1
  216.           RET
  217. BJ1:
  218.       DB  00H,"C"
  219. ;=================================================
  220. MENU_OK:

  221.           MOV  DPTR,#M_OK1  ;指针指到显示消息
  222.           MOV  A,#1          ;显示在第一行
  223.           CALL  LCD_PRINT
  224.           MOV  DPTR,#M_OK2  ;指针指到显示消息
  225.           MOV  A,#2          ;显示在第一行
  226.           CALL  LCD_PRINT

  227.           RET
  228. M_OK1:
  229.     DB   "   DS18B20 OK   ",0
  230. M_OK2:
  231.     DB   " TEMP:          ",0
  232. ;-----------------------------------------------
  233. MENU_ERROR:
  234.           MOV  DPTR,#M_ERROR1  ;指针指到显示消息1
  235.           MOV  A,#1          ;显示在第一行
  236.           CALL  LCD_PRINT
  237.           MOV  DPTR,#M_ERROR2  ;指针指到显示消息1
  238.           MOV  A,#2          ;显示在第一行
  239.           CALL  LCD_PRINT
  240.           RET
  241. M_ERROR1:
  242.     DB   " DS18B20 ERROR  ",0
  243. M_ERROR2:
  244.     DB   " TEMP: ----     ",0
  245. ;====================================================
  246. reset:  setb date_line
  247.         nop
  248.         clr date_line
  249.         mov r0,#6bh         ;主机发出延时复位低脉冲
  250.         mov r1,#04h
  251. tsr1:   djnz r0,$
  252.         mov r0,#6bh
  253.         djnz r1,tsr1
  254.         setb date_line        ;然后拉高数据线
  255.         nop
  256.         nop
  257.         nop
  258.         mov r0,#32h
  259. tsr2:   jnb date_line,tsr3   ;等待DS18B20回应
  260.         djnz r0,tsr2
  261.         jmp tsr4             ; 延时
  262. tsr3:   setb flag1           ; 置标志位,表示DS1820存在
  263.         jmp tsr5
  264. tsr4:   clr flag1            ; 清标志位,表示DS1820不存在
  265.         jmp tsr7
  266. tsr5:   mov r0,#06bh
  267. tsr6:   djnz r0,[        DISCUZ_CODE_1        ]nbsp;           ; 时序要求延时一段时间
  268. tsr7:   setb date_line
  269.         ret
  270. ;=======================================================
  271. RE_18B20:
  272.         JB  FLAG1,RE_18B20A
  273.         RET
  274. RE_18B20A:
  275.         CALL  RESET
  276.         MOV  A,#0CCH       ;跳过ROM匹配
  277.         LCALL  WRITE
  278.         MOV  A,#4EH        ;写暂存寄存器
  279.         LCALL  WRITE
  280.         MOV  A,TEMP_TH     ;TH(报警上限)
  281.         LCALL  WRITE
  282.         MOV  A,TEMP_TL     ;TL(报警下限)
  283.         LCALL  WRITE
  284.         MOV  A,#7FH        ;12位精确度
  285.         LCALL  WRITE
  286.         RET
  287. ;------------------------------------------------------------
  288. WRITE_E2:
  289.         CALL  RESET
  290.         MOV  A,#0CCH        ;跳过ROM匹配
  291.         LCALL  WRITE
  292.         MOV  A,#48H         ;把暂存器里的温度报警值拷贝到EEROM
  293.         LCALL  WRITE
  294.         RET
  295. ;--------------------------------------------------------------
  296. READ_E2:
  297.         CALL  RESET
  298.         MOV  A,#0CCH        ;跳过ROM匹配
  299.         LCALL  WRITE
  300.         MOV  A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器
  301.         CALL  WRITE
  302.         RET
  303. ;--------------------------------------------------------------
  304. ;将自定义字符写入LCD1602的CGRAM中
  305. ;--------------------------------------------------------------
  306. STORE_DATA:
  307.         MOV  A,#40H
  308.         CALL  WCOM
  309.         MOV  R2,#08H
  310.         MOV  DPTR,#D_DATA
  311.         MOV  R3,#00H
  312. S_DATA:
  313.         MOV  A,R3
  314.         MOVC  A,@A+DPTR
  315.         CALL  WDATA      ;写入数据
  316.         INC  R3
  317.         DJNZ  R2,S_DATA
  318.         RET

  319. D_DATA:
  320.     DB  0CH,12H,12H,0CH,00H,00H,00H,00H
  321. ;==============================================================
  322. write:  mov r2,#8            ;一共8位数据
  323.         CLR  C
  324. wr1:
  325.         clr date_line        ;开始写入DS18B20总线要处于复位(低)状态
  326.         mov r3,#07
  327.         djnz r3,[        DISCUZ_CODE_1        ]nbsp;           ;总线复位保持16微妙以上
  328.         rrc a                ;把一个字节DATA 分成8个BIT环移给C
  329.         mov date_line,c      ;写入一个BIT
  330.         mov r3,#3CH
  331.         djnz r3,[        DISCUZ_CODE_1        ]nbsp;           ;等待100微妙
  332.         setb date_line       ;重新释放总线
  333.         nop
  334.         djnz r2,wr1          ;写入下一个BIT
  335.         setb date_line
  336.         ret
  337. ;--------------------------------------------------------------------
  338. read:    mov r4,#4          ; 将温度低位、高位、TH、TL从DS18B20中读出
  339.          mov r1,#TEMPL        ; 存入25H、26H、27H、28H
  340. re00:    mov r2,#8
  341. re01:    clr cy
  342.          setb date_line
  343.          nop
  344.          nop
  345.          clr date_line        ;读前总线保持为低
  346.          nop
  347.          nop
  348.          nop
  349.          setb date_line       ;开始读总线释放
  350.          mov r3,#09           ;延时18微妙
  351.          djnz r3,$
  352.          mov c,date_line      ;从DS18B20总线读得一个BIT
  353.          mov r3,#3CH
  354.          djnz r3,[        DISCUZ_CODE_1        ]nbsp;           ;等待100微妙
  355.          rrc a                ;把读得的位值环移给A
  356.          djnz r2,re01         ;读下一个BIT
  357.          mov @r1,a
  358.          inc r1
  359.          djnz r4,re00
  360.          ret


  361. ;*****************************************************
  362. ;  处理温度 BCD 码子程序
  363. ;****************************************************
  364. CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下
  365.                ANL  A,#80H
  366.                JZ  TEMPC1         ;温度零上转
  367.                CLR  C
  368.                MOV  A,TEMPL       ;二进制数求补(双字节)
  369.                CPL  A             ;取反加1
  370.                ADD  A,#01H
  371.                MOV  TEMPL,A
  372.                MOV  A,TEMPH
  373.                CPL  A
  374.                ADDC  A,#00H
  375.                MOV  TEMPH,A
  376.                SJMP  TEMPC11

  377. TEMPC1:        MOV  TEMPHC,#0AH     ;+
  378. TEMPC11:       MOV  A,TEMPHC
  379.                SWAP  A
  380.                MOV  TEMPHC,A
  381.                MOV  A,TEMPL
  382.                ANL  A,#0FH              ;乘0.0625
  383.                MOV  DPTR,#TEMPDOTTAB
  384.                MOVC  A,@A+DPTR
  385.                MOV  TEMPLC,A            ;TEMPLC LOW=小数部分 BCD

  386.                MOV  A,TEMPL             ;整数部分
  387.                ANL  A,#0F0H             ;取出高四位
  388.                SWAP  A
  389.                MOV  TEMPL,A
  390.                MOV  A,TEMPH             ;取出低四位
  391.                ANL  A,#0FH
  392.                SWAP  A
  393.                ORL  A,TEMPL             ;重新组合
  394.                MOV  TEMP_ZH,A
  395.                LCALL  HEX2BCD1
  396.                MOV  TEMPL,A
  397.                ANL  A,#0F0H
  398.                SWAP  A
  399.                ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD
  400.                MOV  TEMPHC,A
  401.                MOV  A,TEMPL
  402.                ANL  A,#0FH
  403.                SWAP  A                  ;TEMPLC HI = 个位数 BCD
  404.                ORL  A,TEMPLC
  405.                MOV  TEMPLC,A
  406.                MOV  A,R4
  407.                JZ  TEMPC12
  408.                ANL  A,#0FH
  409.                SWAP  A
  410.                MOV  R4,A
  411.                MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
  412.                ANL  A,#0FH
  413.                ORL  A,R4
  414.                MOV  TEMPHC,A
  415. TEMPC12:       RET
  416. ;---------------------------------------------------------------
  417. HEX2BCD1:
  418.               MOV  B,#064H          ;十六进制-> BCD
  419.               DIV  AB               ;B= A % 100
  420.               MOV  R4,A             ;R7 = 百位数
  421.               MOV  A,#0AH
  422.               XCH  A,B
  423.               DIV  AB               ;B = A % B
  424.               SWAP  A
  425.               ORL  A,B
  426.               RET
  427. ;-------------------------------------------------------------
  428. ;  小数部分码表
  429. ;-------------------------------------------------------------
  430. TEMPDOTTAB:
  431.          DB   00H,00H,01H,01H,02H,03H,03H,04H
  432.          DB   05H,05H,06H,06H,07H,08H,08H,09H
  433. ;=====================================================
  434. LOOK_ALARM:

  435.           MOV  DPTR,#M_ALAX2   ;指针指到显示信息区
  436.           MOV  A,#2            ;显示在第二行
  437.           CALL  LCD_PRINT

  438.           MOV  A,#0C6H
  439.           CALL  TEMP_BJ1
  440.           MOV  A,TEMP_TH       ;加载TH数据
  441.           MOV  LCD_X,#3        ;设置位置
  442.           CALL  SHOW_DIG2H     ;显示数据

  443.           MOV  A,#0CEH
  444.           CALL  TEMP_BJ1
  445.           MOV  A,TEMP_TL       ;加载TL数据
  446.           MOV  LCD_X,#12       ;设置位置
  447.           CALL  SHOW_DIG2L     ;显示数据
  448.           RET
  449. ;--------------------------------------------
  450. M_ALAX1:
  451.      DB   " LOOK ALERT CODE",0
  452. M_ALAX2:
  453.      DB   "TH:      TL:    ",0
  454. ;--------------------------------------------
  455. TEMP_BJ1:
  456.           CALL WCOM
  457.           MOV  DPTR,#BJ2      ;指针指到显示信息区
  458.           MOV  R1,#0
  459.           MOV  R0,#2

  460. BBJJ2:    MOV  A,R1
  461.           MOVC A,@A+DPTR
  462.           CALL  WDATA
  463.           INC R1
  464.           DJNZ  R0,BBJJ2
  465.           RET
  466. BJ2:
  467.       DB  00H,"C"

  468. ;---------------------------------------------------
  469. SHOW_DIG2H:                ;在 LCD 的第二行显示数字
  470.           MOV  B,#100
  471.           DIV  AB
  472.           ADD  A,#30H
  473.           PUSH  B
  474.           MOV  B,LCD_X
  475.           CALL  LCDP2
  476.           POP  B
  477.           MOV  A,#0AH
  478.           XCH  A,B
  479.           DIV  AB
  480.           ADD  A,#30H
  481.           INC  LCD_X
  482.           PUSH  B
  483.           MOV  B,LCD_X
  484.           CALL  LCDP2
  485.           POP  B
  486.           INC  LCD_X
  487.           MOV  A,B
  488.           MOV  B,LCD_X
  489.           ADD  A,#30H
  490.           CALL  LCDP2
  491.           RET

  492. SHOW_DIG2L:                ;在 LCD 的第二行显示数字
  493.           MOV  B,#100
  494.           DIV  AB
  495.           MOV  A,#0AH
  496.           XCH  A,B
  497.           DIV  AB
  498.           ADD  A,#30H
  499.           PUSH  B
  500.           MOV  B,LCD_X
  501.           CALL  LCDP2
  502.           POP  B
  503.           INC  LCD_X
  504.           MOV  A,B
  505.           MOV  B,LCD_X
  506.           ADD  A,#30H
  507.           CALL  LCDP2
  508.           RET
  509. ;-------------------------------------------------------------
  510. ;显示区 BCD 码温度值刷新子程序
  511. ;-------------------------------------------------------------
  512. DISPBCD:
  513.               MOV  A,TEMPLC
  514.               ANL  A,#0FH
  515.               MOV  70H,A                 ;小数位
  516.               MOV  A,TEMPLC
  517.               SWAP  A
  518.               ANL  A,#0FH
  519.               MOV  71H,A                 ;个位
  520.               MOV  A,TEMPHC
  521.               ANL  A,#0FH
  522.               MOV  72H,A                 ;十位
  523.               MOV  A,TEMPHC
  524.               SWAP  A
  525.               ANL  A,#0FH
  526.               MOV  73H,A                 ;百位
  527.               MOV  A,TEMPHC
  528.               ANL  A,#0F0H
  529.               CJNE  A,#010H,DISPBCD0
  530.               SJMP  DISPBCD2

  531. DISPBCD0:     MOV  A,TEMPHC
  532.               ANL  A,#0FH
  533.               JNZ  DISPBCD2               ;十位数是0
  534.               MOV  A,TEMPHC
  535.               SWAP  A
  536.               ANL  A,#0FH
  537.               MOV  73H,#0AH               ;符号位不显示
  538.               MOV  72H,A                  ;十位数显示符号
  539. DISPBCD2:     RET

  540. ;==========================================================
  541. ; LCD 1602 显示子程序
  542. ;==========================================================
  543. CONV:
  544.           MOV  A,73H         ;加载百位数据
  545.           MOV  LCD_X,#6      ;设置位置
  546.           CJNE A,#1,CONV1
  547.           JMP  CONV2
  548. CONV1:    MOV  A,#" "
  549.           MOV  B,LCD_X
  550.           CALL  LCDP2
  551.           JMP  CONV3
  552. CONV2:    CALL  SHOW_DIG2    ;显示数据
  553. CONV3:    INC  LCD_X             ;
  554.           mov  a,72h         ;十位
  555.           CALL  SHOW_DIG2
  556.           inc  LCD_X
  557.           mov  a,71h         ;个位
  558.           CALL  SHOW_DIG2
  559.           inc  LCD_X
  560.           MOV  A,#'.'
  561.           MOV  B,LCD_X
  562.           CALL  LCDP2
  563.           MOV  A,70h         ;加载小数点位
  564.           INC  LCD_X         ;设置位置
  565.           CALL  SHOW_DIG2    ;显示数据
  566.           RET
  567. ;-------------------------------------------------------
  568. SHOW_DIG2:                 ;在 LCD 的第二行显示数字
  569.           ADD  A,#30H
  570.           MOV  B,LCD_X
  571.           CALL  LCDP2
  572.           RET
  573. ;---------------------------------------------------------
  574. LCDP2:                    ;在LCD的第二行显示字符
  575.          PUSH  ACC        ;
  576.          MOV  A,B         ;设置显示地址
  577.          ADD  A,#0C0H     ;设置LCD的第二行地址
  578.          CALL  WCOM       ;写入命令
  579.          POP  ACC         ;由堆栈取出A
  580.          CALL  WDATA      ;写入数据
  581.          RET
  582. ;---------------------------------------------------------


  583. SET_LCD:                     ;对 LCD 做初始化设置及测试
  584.           CLR  LCD_EN
  585.           CALL  INIT_LCD     ;初始化 LCD
  586.           CALL  STORE_DATA   ;将自定义字符存入LCD的CGRAM
  587.           RET
  588. INIT_LCD:                  ;8位I/O控制 LCD 接口初始化
  589.           MOV  A,#38H        ;双列显示,字形5*7点阵
  590.           CALL  WCOM
  591.           call  delay1
  592.           MOV  A,#38H
  593.           CALL  WCOM
  594.           call  delay1

  595.           MOV  A,#38H
  596.           CALL  WCOM
  597.           call  delay1
  598.           MOV  A,#0CH        ;开显示,显示光标,光标不闪烁
  599.           CALL  WCOM
  600.           call  delay1
  601.           MOV  A,#01H        ;清除 LCD 显示屏
  602.           CALL  WCOM
  603.           call  delay1
  604.           RET
  605. ;==================================================
  606. CLR_LINE1:                   ;清除LCD的第一行字符
  607.           MOV  A,#80H        ;设置 LCD 的第一行地址
  608.           CALL  WCOM         ;
  609.           MOV  R0,#24        ;设置计数值
  610.     C1:   MOV  A,#' '        ;载入空格符至LCD
  611.           CALL  WDATA        ;输出字符至LCD
  612.           DJNZ  R0,C1        ;计数结束
  613.           RET
  614. ;==================================================
  615. LCD_PRINT:       ;在LCD的第一行或第二行显示字符

  616.           CJNE  A,#1,LINE2  ;判断是否为第一行
  617.   LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
  618.           CALL  WCOM        ;写入命令
  619.           CALL  CLR_LINE    ;清除该行字符数据
  620.           MOV  A,#80H       ;设置 LCD 的第一行地址
  621.           CALL  WCOM        ;写入命令
  622.           JMP  FILL

  623.   LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
  624.           CALL  WCOM        ;写入命令
  625.           CALL  CLR_LINE    ;清除该行字符数据
  626.           MOV  A,#0C0H      ;设置 LCD 的第二行地址
  627.           CALL  WCOM
  628.   FILL:   CLR  A            ;填入字符
  629.           MOVC  A,@A+DPTR   ;由消息区取出字符
  630.           CJNE  A,#0,LC1    ;判断是否为结束码
  631. ……………………

  632. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
单片机DS18B20.rar (79.88 KB, 下载次数: 142)





评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:278194 发表于 2018-11-27 17:23 | 只看该作者
想问一下 你的硬件仿真感觉少好多东西?
回复

使用道具 举报

板凳
ID:681943 发表于 2020-1-6 10:13 | 只看该作者
硬件仿真少了一些电路?
回复

使用道具 举报

地板
ID:783871 发表于 2020-6-28 13:01 | 只看该作者
程序调试的好多未定义啊,怎么解决啊?
回复

使用道具 举报

5#
ID:61140 发表于 2022-4-4 19:22 | 只看该作者
可以仿真成功,但硬件实测第一行显示白块,第二行不显示
回复

使用道具 举报

6#
ID:1032085 发表于 2022-6-4 13:20 | 只看该作者
这个怎么设置让他显示负数啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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