|
一個用51單片機做的LCD1602 時鐘顯示 下面是仿真原理圖,采用匯編語言來編程.
0.png (24.58 KB, 下載次數: 58)
下載附件
2016-9-27 18:24 上傳
0.png (64.67 KB, 下載次數: 60)
下載附件
2016-9-27 18:26 上傳
時鐘程序的所有資料打包下載:
數字時鐘.rar
(248.57 KB, 下載次數: 22)
2016-9-27 18:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序:
- ;/********************************************************************************
- ; 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
復制代碼
|
|