|
一个用51单片机做的LCD1602 时钟显示 下面是仿真原理图,采用汇编语言来编程.
时钟程序的所有资料打包下载:
数字时钟.rar
(248.57 KB, 下载次数: 22)
源程序:
- ;/********************************************************************************
- ; LCD1602 时钟显示Cekong time测控何小双
- ;********************************************************************************/
- RS EQU P2.0; //控制端接口
- R_W EQU P2.1
- E EQU P2.2
- DB0_DB7 EQU P0
- ;***********定义时、分、秒及50ms单元*******
- DI_DA DATA 20H
- SEC DATA 21H
- MIN DATA 22H
- HOUR DATA 23H
- ;************程序开始***********************
- ORG 000H
- LJMP MAIN
- ORG 000BH //定时器TO的中断入口地址
- LJMP CLOCK
- ORG 0030H
- MAIN:MOV TMOD,#01H //工作方式1.16位定时计数
- MOV TL0,#0B0H //设置初值
- MOV TH0,#03CH
- SETB ET0 //允许T0中断
- SETB TR0 //启动T0
- MOV DI_DA,#00H
- SETB EA //总中断开放
- MOV SP,#60H //设置堆栈指针
- LCALL INITIAL //初始化
- LCALL CLS //清屏
- ;*************显示Cekong time**************
- MOV A,#10000000B
- LCALL WRITE_COM
- MOV DPTR,#LINE0
- LCALL DISP
- ;***********************************************
- MOV A,#11000000B
- LCALL WRITE_COM
- MOV DPTR,#LINE1
- LCALL DISP
- ;***********************************************
- MOV A,#11001100B
- LCALL WRITE_COM
- MOV DPTR,#LINE1
- LCALL DISP
- ;****************计时开始***********************
- BEGIN:MOV P1,#7FH
- MOV A,P1
- CJNE A,#7FH,NEXT //首先对两个规定的操作数进行比较,然后根据比较的结果来决定是否转移--若两个操作数相等,程序按顺序往下执行NEXT;
- ; SETB P1.7
- ACALL CONV //计时转换
- ACALL DIS //显示出时间
- AJMP BEGIN
- NEXT: ACALL KEY
- AJMP BEGIN
- ;****************扫描按键***********************
- KEY: ACALL DEL10MS //软件滤波 delay后检测
- JB P1.4,HOUR_KEY //1.4和1.5硬件设计
- MIN_ADJ:CLR C
- MOV A,MIN
- INC A
- DA A
- CJNE A,#60H,X1
- CLR A
- X1: MOV MIN,A
- ACALL DIS
- ACALL DEL200MS
- MOV P1,#7FH
- JNB P1.4,MIN_ADJ
- HOUR_KEY:JB P1.5,X2
- HOUR_ADJ:CLR C
- MOV A,HOUR
- INC A
- DA A
- CJNE A,#24H,X3
- CLR A
- X3: MOV HOUR,A
- ACALL DIS
- ACALL DEL200MS
- X2: MOV P1,#7FH
- JNB P1.5,HOUR_ADJ
- // SETB P1.7
- RET
- ;**********************计时转换*************************
- CONV: MOV A,DI_DA
- CJNE A,#14H,DONE
- MOV DI_DA,#00H
- MOV A,SEC
- ADD A,#01H
- DA A
- MOV SEC,A
- CJNE A,#60H,DONE
- MOV SEC,#00H
- MOV A,MIN
- ADD A,#01H
- DA A
- MOV MIN,A
- CJNE A,#60H,DONE
- MOV MIN,#00H
- MOV A,HOUR
- ADD A,#01H
- DA A
- MOV HOUR,A
- CJNE A,#24H,DONE
- MOV HOUR,#00H
- DONE: RET
- ;******************显示时间****************************
- DIS: MOV A,#11000100B
- //MOV A,#00111000B 当为这个值是能在lcd显示跳秒,但就是不知道上面的值在protues中怎么就不能正常显示,而实际中能显示
- LCALL WRITE_COM
- MOV A,HOUR
- SWAP A ///累加器内高低半字节交换
- ANL A,#0FH
- ADD A,#30H
- LCALL WRITE_DATA
- MOV A,HOUR
- ANL A,#0FH
- ADD A,#30H
- LCALL WRITE_DATA
- MOV A,#3AH
- LCALL WRITE_DATA
- ;********************************************
- MOV A,MIN
- SWAP A
- ANL A,#0FH
- ADD A,#30H
- LCALL WRITE_DATA
- MOV A,MIN
- ANL A,#0FH
- ADD A,#30H
- LCALL WRITE_DATA
- MOV A,#3AH
- LCALL WRITE_DATA //分
- ;******************************************
- MOV A,SEC
- SWAP A
- ANL A,#0FH
- ADD A,#30H
- LCALL WRITE_DATA
- MOV A,SEC
- ANL A,#0FH
- ADD A,#30H
- LCALL WRITE_DATA
- RET //秒
- ;*****************50ms定时中断服务子程序***************
- CLOCK: MOV TL0,#0B0H
- MOV TH0,#3CH
- INC DI_DA //增加1
- RETI
- ;*****************显示字符串到LCD子程序****************
- DISP: PUSH ACC
- DISP_LOOP:CLR A
- MOVC A,@A+DPTR
- JZ END_DISP
- LCALL WRITE_DATA
- INC DPTR
- SJMP DISP_LOOP
- END_DISP: POP ACC
- RET
- ;***************************************************************
- ; LCD1602初始化设定子程序
- ;***************************************************************
- INITIAL: MOV A,#00111000B //显示模式设置
- LCALL WRITE_COM
- MOV A,#00001100B //开显示及光标显示
- LCALL WRITE_COM
- MOV A,#00000110B
- LCALL WRITE_COM
- RET
-
- ;*****************清除LCD1602子程序**********************
- CLS: MOV A,#00000001B
- LCALL WRITE_COM
- RET
- ;*****************写指令程序*********************************
- WRITE_COM: LCALL CHECK_BUSY
- CLR E
- CLR RS
- CLR R_W // RS与RW低电平
- SETB E //E引脚来脉冲 从而实现写指令
- MOV DB0_DB7,A
- CLR E
- RET
- ;****************写数据到LCD子程序******************
- WRITE_DATA: LCALL CHECk_BUSY
- CLR E
- SETB RS
- CLR R_W
- SETB E
- MOV DB0_DB7,A
- CLR E
- RET
- ;***************查询忙碌标志信号子程序**********
- CHECK_BUSY: PUSH ACC //压进去
- BUSY_LOOP: CLR E
- SETB R_W
- CLR RS
- SETB E
- MOV A,DB0_DB7
- CLR E
- JB ACC.7,BUSY_LOOP //直接寻址位为1则转移
- POP ACC //推出来
- LCALL DEL
- RET //DB7=1则忙反之不忙则可以接收数据与命令
- ;*******************************************************************************延时2.5ms子程序********************
- DEL: MOV R6,#5
- TX0: MOV R7,#248
- DJNZ R7,[ DISCUZ_CODE_2 ]nbsp; //248*2us*5
- DJNZ R6,TX0
- RET
- ;*****************延时10ms子程序*********************
- DEL10MS: MOV R5,#10H
- TX1: MOV R4,#0FFH
- DJNZ R4,$
- DJNZ R5,TX1
- RET
- ;*****************延时200ms子程序********************
- DEL200MS: MOV R3,#14H //20*10ms
- TX2: ACALL DEL10MS
- DJNZ R3,TX2
- RET
- ;*****************字符串*****************************
- LINE0: DB "**CeKong2 Time**",00H //第一行
- LINE1: DB " ",00H //第二行标记
- END
复制代码
|
|