全文只有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
|