全文只有5個漢字
那么長的代碼,就算是常用的8051C,沒有注釋都不是那么容易理清你的思路,匯編就更加不用說了,而且你還是合泰的匯編,如果不是工作要求,誰會去玩合泰呢?一個燒錄器就400塊錢,11塊的STC燒錄器它不香嗎?
你多少有點注釋吧,不然誰看得明白,就你自己寫的都不好找
我以前也用過合泰,我代碼的風格和你這完全不是一個世界的.......
;============================================================================
;作者:** *
;日期:2016/11/26 *
;功能:測試HT66F50的按鍵,主要學習:按鍵去抖動,間接指針尋址操作 *
;備注:工程設定:使用4MHZ內部晶振,PD端口要設定為輸入功能,還要設定上拉電阻 *
;對于查表,要注意,高位不用的指針一定要定義為0,如果不定義的話,查表結果會出錯 *
;============================================================================
include HT66F50.inc ;包含HT66F50頭文件
S1 EQU PD.0 ;PD0聲明為S1
ds .section 'data' ;數據存儲空間
DEL1 DB ? ;在數據空間保留一個字節的空間,延時
DEL2 DB ? ;在數據空間保留一個字節的空間,延時
DEL3 DB ? ;在數據空間保留一個字節的空間,延時
COUNT DB ? ;在數據空間保住一個字節的空間,顯示計數
;============================================================================
cs .SECTION 'code' ;程序存儲空間,從000H開始執行
ORG 040H ;程序從050H開始執行
STAR: CLR ACERL ;作為I/O端口使用,不使用ADC輸入引腳功能
CLR C0SEL ;關閉比較器電路,比較器無功耗
MOV A,08H ;比較輸出不連接,作為單獨的I/O端口使用
MOV CP1C,A ;關閉比較器
MOV CP0C,A ;關閉比較器
CLR PCC ;PC 作為輸出端口
CLR PAC ;PA 作為輸出端口
SET PDC ;PD 作為輸入端口
SET PDPU ;PD 加上上拉電阻
MAIN: MOV A,10
MOV COUNT,A ;顯示的個數為10
MOV A,OFFSET TAB_7_SEG ;取得七段碼顯示表格的表頭地址
MOV TBLP,A ;表頭地址加載到查表指針低位,小于255的數據都只用到低位指針
MOV A,1FH ;HT66F50最后一頁地址是1FF8H,所以,高位就是1FH
MOV TBHP,A ;查表指針的高位一定要確定,不能不設定,不然的話,查表會出錯
LOOP: TABRDC PC ;查表,并在PC顯示
MOV A,TBLH ;查表結果的高位保存到A
MOV PA,A ;高位的結果在PA輸出
SZ S1 ;S1是0就跳過下一條指令,1:按下,0:沒按下
JMP LOOP ;S1為1,沒有按下按鍵,跳去顯示
CALL DELAY ;S1按下,調用50mS延時,去抖動
SZ S1 ;S1是0就跳過下一條指令,這是去抖動之后的動作,1:按鍵松開,0:按鍵沒松開
JMP LOOP ;去顯示,檢測50mS之后,如果按鍵還沒有松開,就是按下,否則,視為抖動
INC TBLP ;查表指針加1
SDZ COUNT ;COUNT減1,是0就跳過下一條指令
JMP LOOP ;去顯示
JMP MAIN ;重新開始
;===========================================================================================
;******************************************************************************************
;合泰指令系統是4個時鐘為一個指令周期,4MHZ的晶振,一個指令是1uS
;這是一個50mS的延時程序,由A決定了總延時時間
DELAY: MOV A,1
MOV DEL1,A ;這時個性DEL1的值,可以改變延時的時間為50mS的整倍數
DLOOP1: MOV A,200D ;1
MOV DEL2,A ;1
DLOOP2: MOV A,167D ;1
MOV DEL3,A ;1 *****************************************************
DLOOP3: SDZ DEL3 ;1X167=167,*DLOOP3的指令執行次數是499次,時間是499uS=0.5mS *
JMP DLOOP3 ;2X166=132 *以后,如果是要改變延時的話,可以通過改變A的值來改變 *
SDZ DEL2 ;1 *其它指令的執行時間可以補償最終的時間誤差 *
JMP DLOOP2 ;2 *****************************************************
SDZ DEL1 ;1
JMP DLOOP1 ;2
RET
;====================================================================================
;這個表是一個七段碼顯示表,自己焊的學習板上用的就是這個
ORG LASTPAGE ;把表的數據放在最后一頁,LASTPAGE是最后一頁的偽指令
TAB_7_SEG:
DC 001+00010001B SHL 8 ;0
DC 002+10011111B SHL 8 ;1
DC 004+00110010B SHL 8 ;2
DC 008+00010110B SHL 8 ;3
DC 016+10011100B SHL 8 ;4
DC 032+01010100B SHL 8 ;5
DC 064+01010000B SHL 8 ;6
DC 128+00011111B SHL 8 ;7
DC 0F0H+00010000B SHL 8 ;8
DC 0FFH+00010100B SHL 8 ;9
;對于30H+000101000B SHL 8
;這是一個16位的表,運行的結果是30H被放在表的低位,00010100B被放在高位
;SHL在二元運算上的等級要比+二元運算的等級高,所以,先是左移,然后才加
;==================================================================================
END
|