出租车计价器
CH451_DCLK BIT P1.7 //串行数据时钟,上升沿有效
CH451_DIN BIT P1.6 //串行数据输出
CH451_LOAD BIT P1.5 //串行命令加载,上升沿有效
CH451_DOUT BIT P1.4 //INT0,键盘中断和键值数据输入 ORG 0000H
START:
ACALL CH451_INIT //调用初始化程序
MOV R5,#02H //将要显示的数放入R5中
MOV R4,#00H //将要在第几位上显示放在R4中,最右边是0位 KEYSHOW:
ACALL SCAN1
SJMP KEYSHOW
SJMP $
CH451_INIT:
CLR CH451_DIN
// SETB CH451_DIN
SETB CH451_DCLK
SETB CH451_DIN
SETB CH451_LOAD
SETB CH451_DOUT
CLR IT0
CLR IE0
SETB EX0
MOV B,#04H
MOV A,#03H
ACALL CH451_WRITE
RET
SCAN1:
MOV C,CH451_DOUT
JC SCAN1
ACALL CH451_READ
MOV R1,A
C0:
CJNE R1,#40H,C1
ACALL k1
AJMP TES
C1:
CJNE R1,#41H,C2
ACALL k2
AJMP TES
C2:
CJNE R1,#42H,C3
ACALL k3
AJMP TES
C3:
CJNE R1,#43H,SCAN1;C4
ACALL k4
AJMP TES
CH451_WRITE:
CLR EX0
CLR CH451_LOAD
MOV R7,#08H //将ACC中第8位送出
CH451_WRITE_8:
RRC A //低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C //送出一位数据
SETB CH451_DCLK
DJNZ R7,CH451_WRITE_8
MOV A,B
MOV R7,#04H //将B中4位送出
CH451_WRITE_4:
RRC A
CLR CH451_DCLK
MOV CH451_DIN,C
SETB CH451_DCLK //产生时钟上升沿通知CH451输入位数据 DJNZ R7,CH451_WRITE_4 //位数据未完继续
SETB CH451_LOAD //产生加载上升沿通知CH451处理命令数据 SETB EX0 //允许键盘中断
RET
CH451_READ:
CLR EX0//禁止键盘中断
CLR CH451_LOAD //命令开始
MOV A,#07H //读取键值命令的高4位 0111B
MOV R7,#04H //忽略12位命令的低8位
CH451_READ_4:
RRC A
CLR CH451_DCLK
MOV CH451_DIN,C
SETB CH451_DCLK
DJNZ R7,CH451_READ_4//位数据未完继续
SETB CH451_LOAD //产生加载上升沿通知CH451处理命令数据 CLR A // 先清除键值单片以便移位
MOV R7,#07H //读入7位键值
CH451_READ_7:
MOV C,CH451_DOUT //读入一位数据
CLR CH451_DCLK//产生时钟下降沿通知CH451输出下一位 RLC A //数据移入ACC,高位在前,低位在后
SETB CH451_DCLK
DJNZ R7,CH451_READ_7//位数据未完继续
CLR IE0 //清中断标志,读操作过程中有低电平脉冲 SETB EX0 //允许键盘中断
RET
END