|
一個(gè)用51單片機(jī)做的LCD1602 時(shí)鐘顯示 下面是仿真原理圖,采用匯編語(yǔ)言來(lái)編程.
0.png (24.58 KB, 下載次數(shù): 58)
下載附件
2016-9-27 18:24 上傳
0.png (64.67 KB, 下載次數(shù): 60)
下載附件
2016-9-27 18:26 上傳
時(shí)鐘程序的所有資料打包下載:
數(shù)字時(shí)鐘.rar
(248.57 KB, 下載次數(shù): 22)
2016-9-27 18:27 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
源程序:
- ;/********************************************************************************
- ; LCD1602 時(shí)鐘顯示Cekong time測(cè)控何小雙
- ;********************************************************************************/
- RS EQU P2.0; //控制端接口
- R_W EQU P2.1
- E EQU P2.2
- DB0_DB7 EQU P0
- ;***********定義時(shí)、分、秒及50ms單元*******
- DI_DA DATA 20H
- SEC DATA 21H
- MIN DATA 22H
- HOUR DATA 23H
- ;************程序開(kāi)始***********************
- ORG 000H
- LJMP MAIN
- ORG 000BH //定時(shí)器TO的中斷入口地址
- LJMP CLOCK
- ORG 0030H
- MAIN:MOV TMOD,#01H //工作方式1.16位定時(shí)計(jì)數(shù)
- MOV TL0,#0B0H //設(shè)置初值
- MOV TH0,#03CH
- SETB ET0 //允許T0中斷
- SETB TR0 //啟動(dòng)T0
- MOV DI_DA,#00H
- SETB EA //總中斷開(kāi)放
- MOV SP,#60H //設(shè)置堆棧指針
- 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
- ;****************計(jì)時(shí)開(kāi)始***********************
- BEGIN:MOV P1,#7FH
- MOV A,P1
- CJNE A,#7FH,NEXT //首先對(duì)兩個(gè)規(guī)定的操作數(shù)進(jìn)行比較,然后根據(jù)比較的結(jié)果來(lái)決定是否轉(zhuǎn)移--若兩個(gè)操作數(shù)相等,程序按順序往下執(zhí)行NEXT;
- ; SETB P1.7
- ACALL CONV //計(jì)時(shí)轉(zhuǎn)換
- ACALL DIS //顯示出時(shí)間
- AJMP BEGIN
- NEXT: ACALL KEY
- AJMP BEGIN
- ;****************掃描按鍵***********************
- KEY: ACALL DEL10MS //軟件濾波 delay后檢測(cè)
- JB P1.4,HOUR_KEY //1.4和1.5硬件設(shè)計(jì)
- 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
- ;**********************計(jì)時(shí)轉(zhuǎn)換*************************
- 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
- ;******************顯示時(shí)間****************************
- DIS: MOV A,#11000100B
- //MOV A,#00111000B 當(dāng)為這個(gè)值是能在lcd顯示跳秒,但就是不知道上面的值在protues中怎么就不能正常顯示,而實(shí)際中能顯示
- LCALL WRITE_COM
- MOV A,HOUR
- SWAP A ///累加器內(nèi)高低半字節(jié)交換
- 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定時(shí)中斷服務(wù)子程序***************
- 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初始化設(shè)定子程序
- ;***************************************************************
- INITIAL: MOV A,#00111000B //顯示模式設(shè)置
- LCALL WRITE_COM
- MOV A,#00001100B //開(kāi)顯示及光標(biāo)顯示
- LCALL WRITE_COM
- MOV A,#00000110B
- LCALL WRITE_COM
- RET
-
- ;*****************清除LCD1602子程序**********************
- CLS: MOV A,#00000001B
- LCALL WRITE_COM
- RET
- ;*****************寫(xiě)指令程序*********************************
- WRITE_COM: LCALL CHECK_BUSY
- CLR E
- CLR RS
- CLR R_W // RS與RW低電平
- SETB E //E引腳來(lái)脈沖 從而實(shí)現(xiàn)寫(xiě)指令
- MOV DB0_DB7,A
- CLR E
- RET
- ;****************寫(xiě)數(shù)據(jù)到LCD子程序******************
- WRITE_DATA: LCALL CHECk_BUSY
- CLR E
- SETB RS
- CLR R_W
- SETB E
- MOV DB0_DB7,A
- CLR E
- RET
- ;***************查詢忙碌標(biāo)志信號(hào)子程序**********
- CHECK_BUSY: PUSH ACC //壓進(jìn)去
- BUSY_LOOP: CLR E
- SETB R_W
- CLR RS
- SETB E
- MOV A,DB0_DB7
- CLR E
- JB ACC.7,BUSY_LOOP //直接尋址位為1則轉(zhuǎn)移
- POP ACC //推出來(lái)
- LCALL DEL
- RET //DB7=1則忙反之不忙則可以接收數(shù)據(jù)與命令
- ;*******************************************************************************延時(shí)2.5ms子程序********************
- DEL: MOV R6,#5
- TX0: MOV R7,#248
- DJNZ R7,[ DISCUZ_CODE_2 ]nbsp; //248*2us*5
- DJNZ R6,TX0
- RET
- ;*****************延時(shí)10ms子程序*********************
- DEL10MS: MOV R5,#10H
- TX1: MOV R4,#0FFH
- DJNZ R4,$
- DJNZ R5,TX1
- RET
- ;*****************延時(shí)200ms子程序********************
- DEL200MS: MOV R3,#14H //20*10ms
- TX2: ACALL DEL10MS
- DJNZ R3,TX2
- RET
- ;*****************字符串*****************************
- LINE0: DB "**CeKong2 Time**",00H //第一行
- LINE1: DB " ",00H //第二行標(biāo)記
- END
復(fù)制代碼
|
|