找回密码
 立即注册

QQ登录

只需一步,快速开始

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

液晶显示数值

[复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-26 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


  1.           LCD_X  EQU   23H     ;LCD 地址变量(决定文字的在LCD上的显示位置)

  2. ;-----------------------------------------------------------
  3.           LCD_RS    EQU   P4.0    ;LCD 数据/命令选择端
  4.           LCD_RW    EQU   P4.1    ;LCD 读/写选择端
  5.           LCD_EN    EQU   P4.2    ;LCD 使能信号
  6.           LCD_BG    EQU   P4.3    ;LCD 背光控制端
  7.           LCD_SJ    EQU   P0      ;LCD 数据


  8. ;===========================================================
  9.           ORG  0000H
  10.           AJMP  MAIN
  11.           ORG  0100H
  12. ;===========================================================
  13. MAIN:     MOV  SP,#60H
  14.           CLR  LCD_BG          ;打开LCD背光
  15.           CALL  SET_LCD        ;初始化 LCD
  16.           CALL  MENU_1         ;显示菜单1
  17.           MOV  73H,#1          ;加载百位数据
  18.           MOV  72H,#2          ;加载十位数据
  19.           MOV  71H,#3          ;加载个位数据
  20.           MOV  70H,#4          ;加载小数位数据
  21.           ACALL CONV01
  22.           SJMP $

  23. ;=================================================
  24. ;对 LCD 做初始化设置
  25. ;=================================================
  26. SET_LCD:  MOV A,#34H      ;34H--扩充指令操作
  27.           CALL  WCOM         ;写入命令
  28.    MOV A,#30H      ;30H--基本指令操作
  29.           CALL  WCOM         ;写入命令
  30.    MOV A,#01H      ;清除显示
  31.           CALL  WCOM         ;写入命令
  32.           MOV A,#06H      ;指定在资料写入或读取时,光标的移动方向
  33.           CALL  WCOM         ;DDRAM 的地址计数器(AC)加1
  34.    MOV A,#0CH      ;开显示,关光标,不闪烁
  35.           CALL  WCOM         ;写入命令
  36.           RET
  37. ;==========================================================
  38. ;73H-70H 分别存放百位、十位、个位、小数位的数据
  39. ;==========================================================
  40. CONV01:   MOV  A,73H          ;加载百位数据
  41.           MOV  LCD_X,#1       ;设置显示位置
  42.           CJNE A,#00H,CONV2
  43. CONV1:    MOV  A,#" "        ;百位数等于0显示空格
  44.           MOV  B,LCD_X
  45.           CALL  LCDP2
  46.           MOV  A,72H         ;十位
  47.           CJNE A,#00H,CONV3
  48.           INC  LCD_X         ;调整显示地址
  49.           MOV  A,#" "        ;十位数等于0显示空格
  50.           MOV  B,LCD_X
  51.           CALL  LCDP2
  52.           JMP  CONV4

  53. CONV2:    CALL  SHOW_DIG2    ;显示数据

  54. CONV3:    INC  LCD_X         ;调整显示地址
  55.           MOV  A,72H         ;十位
  56.           CALL  SHOW_DIG2

  57. CONV4:    INC  LCD_X         ;调整显示地址
  58.           MOV  A,71H         ;个位
  59.           CALL  SHOW_DIG2
  60.           INC  LCD_X         ;调整显示地址
  61.           MOV  A,#'.'
  62.           MOV  B,LCD_X
  63.           CALL  LCDP2
  64.           MOV  A,70H         ;加载小数位
  65.           INC  LCD_X         ;设置位置
  66.           CALL  SHOW_DIG2    ;显示数据
  67.           RET
  68. ;=============================================
  69. ;在LCD的第二行显示数据字符
  70. ;A=ASCII 数据, B=位置变量
  71. ;==============================================
  72. LCDP2:   PUSH  ACC           ;在LCD的第二行显示字符
  73.          MOV  A,B            ;设置显示地址
  74.          ADD  A,#90H         ;设置LCD的第二行地址
  75.          CALL  WCOM          ;写入命令
  76.          POP  ACC            ;由堆栈取出A
  77.          CALL  WDATA         ;写入数据
  78.          RET
  79. ;-------------------------------------------------------
  80. SHOW_DIG2:                   ;在 LCD 的第二行显示数字
  81.           ADD  A,#30H        ;加30H,转换为ASCII码
  82.           MOV  B,LCD_X       ;确定显示位置
  83.           CALL  LCDP2        ;送显示
  84.           RET

  85. ;===============================================
  86. ;命令写入子程序
  87. ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
  88. ;以8位控制方式将命令写至LCD
  89. ;===============================================
  90. WCOM:    LCALL CHK_BUSY       ;写入指令
  91.   CLR LCD_RS
  92.   CLR LCD_RW
  93.   MOV LCD_SJ,A
  94.   SETB LCD_EN
  95.   NOP
  96.   NOP
  97.   CLR LCD_EN
  98.   RET
  99. ;===============================================
  100. ;数据写入子程序
  101. ;RS=H,RW=L,D0-D7=指令码,E=高脉冲
  102. ;以8位控制方式将数据写至LCD
  103. ;===============================================
  104. WDATA:    MOV  LCD_SJ,A       ;写入数据
  105.           SETB  LCD_RS
  106.           CLR  LCD_RW
  107.           SETB  LCD_EN
  108.           CALL  DE
  109.           CLR  LCD_EN
  110.           CALL  DE
  111.           RET
  112. ;===============================================
  113. ;测LCD忙碌子程序
  114. ;RS=0,RW=1,E=H,D0-D7=状态字
  115. ;===============================================
  116. CHK_BUSY: MOV LCD_SJ,#0FFH   ;测忙碌子程序
  117.    CLR LCD_RS
  118.    SETB LCD_RW
  119.    SETB LCD_EN
  120.    JB LCD_SJ.7,$
  121.    CLR LCD_EN
  122.    RET

  123. ;==========================================================
  124. ;LCD 显示第一页菜单
  125. ;==========================================================
  126. MENU_OK1: MOV  DPTR,#M_OK11  ;指针指到显示信息区
  127.           MOV  A,#1          ;显示在第一行
  128.           CALL  LCD_PRINT
  129.           MOV  DPTR,#M_OK12  ;指针指到显示信息区
  130.           MOV  A,#2          ;显示在第二行
  131.           CALL  LCD_PRINT
  132.           MOV  DPTR,#M_OK13  ;指针指到显示信息区
  133.           MOV  A,#3          ;显示在第二行
  134.           CALL  LCD_PRINT
  135.           MOV  DPTR,#M_OK14  ;指针指到显示信息区
  136.           MOV  A,#4          ;显示在第二行
  137.           CALL  LCD_PRINT
  138.           RET
  139. M_OK11:   DB"一氧化氮浓度:  ",0
  140. M_OK12:   DB"            PPM",0   ;超过120PPM报警
  141. M_OK13:   DB"油量:         ",0
  142. M_OK14:   DB"            升 ",0

  143. ;==================================================
  144. ;在LCD的显示字符串
  145. ;DPTR = 放字符串的地址
  146. ;==================================================
  147. LCD_PRINT:CJNE  A,#1,LINE2  ;判断是否为第一行
  148. LINE1:    MOV  A,#80H       ;设置 LCD 的第一行地址
  149.           CALL  WCOM        ;写入命令
  150.           CALL  CLR_LINE    ;清除该行字符数据
  151.           MOV  A,#80H       ;设置 LCD 的第一行地址
  152.           CALL  WCOM        ;写入命令
  153.           JMP  FILL

  154. LINE2:    CJNE  A,#2,LINE3  ;判断是否为第二行
  155.           MOV  A,#90H       ;设置 LCD 的第二行地址
  156.           CALL  WCOM        ;写入命令
  157.           CALL  CLR_LINE    ;清除该行字符数据
  158.           MOV  A,#90H       ;设置 LCD 的第二行地址
  159.           CALL  WCOM
  160.           JMP  FILL

  161. LINE3:    CJNE  A,#3,LINE4  ;判断是否为第三行
  162.           MOV  A,#88H       ;设置 LCD 的第三行地址
  163.           CALL  WCOM        ;写入命令
  164.           CALL  CLR_LINE    ;清除该行字符数据
  165.           MOV  A,#88H       ;设置 LCD 的第三行地址
  166.           CALL  WCOM
  167.           JMP  FILL

  168. LINE4:    MOV  A,#98H       ;设置 LCD 的第四行地址
  169.           CALL  WCOM        ;写入命令
  170.           CALL  CLR_LINE    ;清除该行字符数据
  171.           MOV  A,#98H       ;设置 LCD 的第四行地址
  172.           CALL  WCOM

  173. FILL:     CLR  A            ;填入字符
  174.           MOVC  A,@A+DPTR   ;由信息区取出字符
  175.           CJNE  A,#0,LC1    ;判断是否为结束码
  176.           RET

  177. LC1:      CALL  WDATA       ;写入数据
  178.           INC  DPTR         ;指针加1
  179.           JMP  FILL         ;继续填入字符
  180. ;===============================================
  181. ;清除一行 LCD 的字符
  182. ;输入一行空格,来替代原显示字符
  183. ;===============================================
  184. CLR_LINE: MOV  R0,#24       ;清除该行 LCD 的字符
  185. CL1:      MOV  A,#' '
  186.           CALL  WDATA
  187.           DJNZ  R0,CL1
  188.           RET

  189. ;====================================================
  190. ;实时温度值与设定报警温度值 TH、TL 比较子程序
  191. ;当实际温度大于 TH 的设定值时,显示“过高”并闪动显示
  192. ;当实际温度小于 TH 的设定值时,显示“正常”
  193. ;当实际温度小于 TL 的设定值时,显示“过低”
  194. ;====================================================
  195. TEMP_COMP:JNB FLAG2,L101         ;读取水温传感器时用以下程序
  196.           MOV TEMP_TH,#SWGWSD
  197.           MOV TEMP_TL,#SWDWSD    ;设置 LCD 的第一行地址
  198.           SJMP L102
  199. L101:     JNB FLAG3,L104         ;读取油温传感器时用以下程序
  200.           MOV TEMP_TH,#YWGWSD
  201.           MOV TEMP_TL,#YWDWSD

  202. L102:     CLR C
  203.           MOV  A,TEMP_ZH
  204.           CJNE  A,TEMP_TH,T_COMP0;实时温度与设定报警温度比较,运行后当A<TEMP_TH则C=1
  205. T_COMP0:  JNC   CHULI1          ;检查温度是否过高
  206.           MOV  A,TEMP_ZH
  207.           SUBB  A,TEMP_TL       ;检查温度是否过低,减数>被减数,则
  208.           JC  CHULI2            ;借位标志位C=1,转

  209.           MOV  DPTR,#BJ50       ;显示"正常"
  210.           CALL  TEMP_BJ3
  211. L106:     JNB FLAG2,L103        ;读取水温传感器时用以下程序
  212.           CLR  FLAH1            ;清除水温报警标志
  213.           SJMP L104
  214. L103:     JNB FLAG3,L104        ;读取油温传感器时用以下程序
  215.           CLR  FLAH2            ;清除油温报警标志
  216. L104:     RET

  217. CHULI1:   MOV  DPTR,#BJ60       ;显示形成闪烁效果
  218.           CALL  TEMP_BJ3
  219.           MOV  R5,#10           ;延时10MS
  220.           LCALL DELAY1
  221.           MOV  DPTR,#BJ30       ;显示"过高"
  222.           CALL  TEMP_BJ3
  223.           JNB FLAG2,L105
  224.           SETB  FLAH1           ;设置水温报警标志
  225.           SJMP L104
  226. L105:     JNB FLAG3,L104
  227.           SETB  FLAH2           ;设置油温报警标志
  228.           SJMP L104

  229. CHULI2:   MOV  DPTR,#BJ40       ;显示"过低"
  230.           CALL TEMP_BJ3
  231.           SJMP L106
  232. ;=========================================
  233. ;标记字符写入子程序
  234. ;=========================================
  235. TEMP_BJ3: JNB FLAG2,L001       ;读取水温传感器时用以下程序
  236.           MOV  A,#86H          ;设置 LCD 的第一行地址
  237.           SJMP L002
  238. L001:     JNB FLAG3,L004       ;读取油温传感器时用以下程序
  239.           MOV  A,#8EH          ;设置 LCD 的第三行地址
  240. L002:     CALL  WCOM           ;写入指令
  241. L003:     CLR  A               ;填入字符
  242.           MOVC  A,@A+DPTR      ;由信息区取出字符
  243.           CJNE  A,#0,L005      ;判断是否为结束码
  244. L004:     RET

  245. L005:     CALL  WDATA          ;写入数据
  246.           INC  DPTR            ;指针加1
  247.           JMP  L003            ;继续填入字符

  248. BJ30:     DB  "浓度超标请注意!",0 ;温度过高显示内容
  249. BJ40:     DB  "               ",0 ;温度正常显示内容
  250. BJ50:     DB  "低油位,请加油!",0 ;温度过低显示内容
  251. BJ60:     DB  "               ",0 ;清除以上标记
  252. ;**********************************************************
  253. ;延时子程序
  254. ;**********************************************************
  255. DE:      MOV  R7,#229        ;延时 500 微秒,此条2个机器周期
  256.          DJNZ  R7,$
  257.          RET    ;此条2个机器周期,总延时(229*2+2+2)*(12/11.0592)≈500uS

  258.          END
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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