找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602 时钟显示 汇编语言编程带proteus仿真

[复制链接]
跳转到指定楼层
楼主
一个用51单片机做的LCD1602 时钟显示 下面是仿真原理图,采用汇编语言来编程.

时钟程序的所有资料打包下载:
数字时钟.rar (248.57 KB, 下载次数: 22)


源程序:
  1. ;/********************************************************************************
  2. ;                               LCD1602 时钟显示Cekong time测控何小双
  3. ;********************************************************************************/
  4.           RS   EQU  P2.0;    //控制端接口
  5.           R_W  EQU  P2.1
  6.           E    EQU  P2.2
  7.           DB0_DB7  EQU  P0
  8. ;***********定义时、分、秒及50ms单元*******
  9.           DI_DA   DATA 20H
  10.           SEC     DATA 21H
  11.           MIN     DATA 22H
  12.           HOUR    DATA 23H
  13. ;************程序开始***********************
  14.           ORG  000H
  15.           LJMP MAIN
  16.           ORG  000BH  //定时器TO的中断入口地址
  17.           LJMP CLOCK
  18.           ORG  0030H
  19. MAIN:MOV TMOD,#01H                   //工作方式1.16位定时计数
  20.      MOV TL0,#0B0H                          //设置初值
  21.      MOV TH0,#03CH
  22.      SETB  ET0         //允许T0中断
  23.      SETB  TR0          //启动T0
  24.      MOV DI_DA,#00H
  25.      SETB  EA                //总中断开放
  26.      MOV   SP,#60H     //设置堆栈指针
  27.      LCALL  INITIAL           //初始化
  28.      LCALL  CLS                   //清屏
  29. ;*************显示Cekong time**************
  30.      MOV A,#10000000B
  31.      LCALL WRITE_COM
  32.      MOV   DPTR,#LINE0
  33.      LCALL DISP
  34. ;***********************************************
  35.      MOV A,#11000000B
  36.      LCALL WRITE_COM
  37.      MOV DPTR,#LINE1
  38.      LCALL DISP
  39. ;***********************************************
  40.      MOV A,#11001100B
  41.      LCALL WRITE_COM
  42.      MOV DPTR,#LINE1
  43.      LCALL DISP
  44. ;****************计时开始***********************
  45. BEGIN:MOV P1,#7FH
  46.       MOV A,P1
  47.       CJNE A,#7FH,NEXT        //首先对两个规定的操作数进行比较,然后根据比较的结果来决定是否转移--若两个操作数相等,程序按顺序往下执行NEXT;
  48. ;      SETB P1.7                           
  49.       ACALL CONV  //计时转换
  50.       ACALL DIS         //显示出时间
  51.       AJMP BEGIN
  52. NEXT: ACALL KEY
  53.       AJMP BEGIN
  54. ;****************扫描按键***********************
  55. KEY:  ACALL DEL10MS                 //软件滤波        delay后检测
  56.       JB  P1.4,HOUR_KEY                                 //1.4和1.5硬件设计
  57. MIN_ADJ:CLR C
  58.         MOV A,MIN
  59.         INC A
  60.         DA A
  61.         CJNE A,#60H,X1
  62.         CLR A
  63. X1:     MOV MIN,A
  64.         ACALL DIS
  65.         ACALL DEL200MS
  66.         MOV P1,#7FH
  67.         JNB P1.4,MIN_ADJ
  68. HOUR_KEY:JB P1.5,X2
  69. HOUR_ADJ:CLR C
  70.          MOV A,HOUR
  71.          INC A
  72.          DA A
  73.          CJNE A,#24H,X3
  74.          CLR A
  75. X3:      MOV HOUR,A
  76.          ACALL DIS
  77.          ACALL DEL200MS
  78. X2:      MOV P1,#7FH
  79.          JNB P1.5,HOUR_ADJ
  80.         // SETB P1.7
  81.          RET
  82. ;**********************计时转换*************************
  83. CONV:    MOV A,DI_DA
  84.          CJNE A,#14H,DONE
  85.          MOV DI_DA,#00H
  86.          MOV A,SEC
  87.          ADD A,#01H
  88.          DA  A
  89.          MOV SEC,A
  90.          CJNE A,#60H,DONE
  91.          MOV SEC,#00H
  92.          MOV A,MIN
  93.          ADD A,#01H
  94.          DA  A
  95.          MOV MIN,A
  96.          CJNE A,#60H,DONE
  97.          MOV MIN,#00H
  98.          MOV A,HOUR
  99.          ADD A,#01H
  100.          DA  A
  101.          MOV HOUR,A
  102.          CJNE A,#24H,DONE
  103.          MOV HOUR,#00H
  104. DONE:    RET
  105. ;******************显示时间****************************
  106. DIS:    MOV A,#11000100B
  107.                 //MOV   A,#00111000B 当为这个值是能在lcd显示跳秒,但就是不知道上面的值在protues中怎么就不能正常显示,而实际中能显示
  108.          LCALL WRITE_COM
  109.          MOV   A,HOUR
  110.          SWAP  A ///累加器内高低半字节交换
  111.          ANL   A,#0FH
  112.          ADD   A,#30H
  113.          LCALL WRITE_DATA
  114.          MOV   A,HOUR
  115.          ANL   A,#0FH
  116.          ADD   A,#30H
  117.          LCALL WRITE_DATA
  118.          MOV   A,#3AH
  119.          LCALL WRITE_DATA        
  120. ;********************************************
  121.         MOV   A,MIN
  122.          SWAP  A
  123.          ANL   A,#0FH
  124.          ADD   A,#30H
  125.          LCALL WRITE_DATA
  126.          MOV   A,MIN
  127.          ANL   A,#0FH
  128.          ADD   A,#30H
  129.          LCALL WRITE_DATA
  130.          MOV   A,#3AH
  131.          LCALL WRITE_DATA            //分
  132. ;******************************************
  133.          MOV   A,SEC
  134.          SWAP  A
  135.          ANL   A,#0FH
  136.          ADD   A,#30H
  137.          LCALL WRITE_DATA
  138.          MOV   A,SEC
  139.          ANL   A,#0FH
  140.          ADD   A,#30H
  141.          LCALL WRITE_DATA
  142.          RET                                   //秒
  143. ;*****************50ms定时中断服务子程序***************
  144. CLOCK:   MOV   TL0,#0B0H
  145.          MOV   TH0,#3CH
  146.          INC    DI_DA        //增加1
  147.          RETI
  148. ;*****************显示字符串到LCD子程序****************
  149. DISP:     PUSH   ACC
  150. DISP_LOOP:CLR A
  151.           MOVC A,@A+DPTR
  152.           JZ   END_DISP
  153.           LCALL WRITE_DATA
  154.           INC DPTR
  155.           SJMP DISP_LOOP
  156. END_DISP: POP  ACC
  157.           RET
  158. ;***************************************************************
  159. ;                      LCD1602初始化设定子程序
  160. ;***************************************************************
  161. INITIAL:  MOV   A,#00111000B          //显示模式设置
  162.           LCALL WRITE_COM
  163.           MOV   A,#00001100B        //开显示及光标显示
  164.           LCALL WRITE_COM
  165.           MOV   A,#00000110B
  166.           LCALL WRITE_COM
  167.           RET
  168.          
  169. ;*****************清除LCD1602子程序**********************
  170. CLS:      MOV     A,#00000001B
  171.           LCALL    WRITE_COM
  172.           RET
  173. ;*****************写指令程序*********************************
  174. WRITE_COM:    LCALL   CHECK_BUSY
  175.               CLR     E
  176.               CLR     RS
  177.               CLR     R_W         //        RS与RW低电平
  178.               SETB    E                 //E引脚来脉冲           从而实现写指令
  179.               MOV     DB0_DB7,A
  180.               CLR     E
  181.               RET
  182. ;****************写数据到LCD子程序******************
  183. WRITE_DATA:   LCALL   CHECk_BUSY
  184.               CLR     E
  185.               SETB    RS
  186.               CLR     R_W
  187.               SETB    E
  188.               MOV     DB0_DB7,A
  189.               CLR     E
  190.               RET

  191. ;***************查询忙碌标志信号子程序**********
  192. CHECK_BUSY:   PUSH    ACC                   //压进去
  193. BUSY_LOOP:    CLR     E
  194.               SETB    R_W
  195.               CLR     RS
  196.               SETB    E
  197.               MOV     A,DB0_DB7
  198.               CLR     E
  199.               JB      ACC.7,BUSY_LOOP          //直接寻址位为1则转移
  200.               POP     ACC                //推出来
  201.               LCALL   DEL
  202.               RET                                //DB7=1则忙反之不忙则可以接收数据与命令
  203. ;*******************************************************************************延时2.5ms子程序********************
  204. DEL:          MOV     R6,#5
  205. TX0:          MOV     R7,#248
  206.               DJNZ    R7,[        DISCUZ_CODE_2        ]nbsp;                //248*2us*5
  207.               DJNZ    R6,TX0
  208.               RET

  209. ;*****************延时10ms子程序*********************
  210. DEL10MS:      MOV     R5,#10H
  211. TX1:          MOV     R4,#0FFH
  212.               DJNZ    R4,$
  213.               DJNZ    R5,TX1
  214.               RET
  215. ;*****************延时200ms子程序********************
  216. DEL200MS:     MOV     R3,#14H         //20*10ms
  217. TX2:          ACALL   DEL10MS
  218.               DJNZ    R3,TX2
  219.               RET
  220. ;*****************字符串*****************************
  221. LINE0:        DB "**CeKong2 Time**",00H         //第一行
  222. LINE1:        DB "    ",00H                  //第二行标记
  223.               END
复制代码


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

使用道具 举报

沙发
ID:102963 发表于 2017-12-18 17:38 | 只看该作者
坑人的程序,不好用!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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