LEDBuf equ 60h ; 显示缓冲 ORG 0000H ljmp Start ORG 000BH AJMP DINGSHI
LEDMAP: ; 八段管显示码
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
Delay: ; 延时子程序 mov r7, #0 DelayLoop:
djnz r7, DelayLoop djnz r6,delayLoop ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6个八段管 mov r2, #00100000b ; 从左边开始显示 Loop:
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; 关所有八段管
mov a, @r0
mov dptr, #OUTSEG movx @dptr, a
mov dptr, #OUTBIT mov a, r2
movx @dptr, a ; 显示一位八段管
mov r6, #1 call Delay
mov a, r2 ; 显示下一位 rr a
mov r2, a
inc r0
djnz r1, Loop
ret
TestKey:
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; 输出线置为0 mov dptr, #IN
movx a, @dptr ; 读入键状态 cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 键码定义 db 16h, 15h, 14h, 0ffh db 13h, 12h, 11h, 10h db 0dh, 0ch, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07h
GetKey:
mov dptr, #OUTBIT mov P2, dph
mov r0, #Low(IN) mov r1, #00100000b mov r2, #6 KLoop:
mov a, r1 ; 找出键所在列 cpl a
movx @dptr, a cpl a rr a
mov r1, a ; 下一列
movx a, @r0 cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入
djnz r2, KLoop
mov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp Exit Goon1:
mov r1, a ; 键值 = 列 X 4 + 行
mov a, r2 dec a rl a rl a
mov r2, a ; r2 = (r2-1)*4
mov a, r1 ; r1中为读入的行值 mov r1, #4 LoopC:
rrc a ; 移位找出所在行 jc Exit
inc r2 ; r2 = r2+ 行值 djnz r1, LoopC Exit:
mov a, r2 ; 取出键码 mov dptr, #KeyTable movc a, @a+dptr mov r2, a
WaitRelease:
mov dptr, #OUTBIT ; 等键释放 clr a
movx @dptr, a
mov r6, #10 call Delay call TestKey jnz WaitRelease
mov a, r2 ret
chuzhi:MOV A,20H ;将四个数转换成一四位数 MOV R0,#0E8H ;第一个数乘以1000 MOV R1,#03H MOV B,R0
MUL AB MOV 61H,B
MOV 60H,A ;低8位 MOV A,20H MOV B,R1 MUL AB ADD A,61H
MOV 61H,A ;高8位
CLR C
MOV A,21H
MOV R0,#64H MOV B,R0 MUL AB ADD A,60H
MOV 62H,A MOV A,61H ADDC A,B
MOV 63H,A
CLR C
MOV A,22H
MOV R0,#0AH MUL AB ADD A,62H
MOV 64H,A MOV A,63H ADDC a,B
MOV 65H,A
CLR C
MOV A,23H ADD A,64H
MOV 66H,A MOV A,65H ADDC A,#0h
MOV 67H,A
MOV R7,66H MOV R6,67H MOV R3,#0H MOV R2,#0H MOV R4,#27H
;第2个数乘以100 ;低8位 ;高8位 ;第3个数乘以10 ;低8位 ;高8位 ;频率值的低八位 ;频率值的高八位 MOV R5,#10H
DIVD: CLR C ;比较被除数和除数 MOV A,R3 SUBB A,R7 MOV A,R2 SUBB A,R6 JC DVD1
SETB OV ;溢出 RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位 MOV A,R5 RLC A MOV R5,A MOV A,R4 RLC A MOV R4,A MOV A,R3 RLC A MOV R3,A XCH A,R2 RLC A XCH A,R2
MOV F0,C ;保存溢出位 CLR C
SUBB A,R7 ;计算(R2R3-R6R7) MOV R1,A MOV A,R2 SUBB A,R6
ANL C,/F0 ;结果判断 JC DVD3
MOV R2,A ;够减,存放新的余数 MOV A,R1 MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完16位商(R4,R5) MOV A,R4 ;将商移到R2R3中 MOV R2,A MOV A,R5 MOV R3,A
CLR OV ;设立成功标志 MOV 67H,R2 MOV 66H,R3
MOV R0,#00H ;求定时器初值 MOV R1,#00H MOV R3,#01H CLR C MOV A,R0 SUBB A,66H
MOV 50H,A ;初值的低八位 MOV A,R1 SUBB A,67H
MOV 51H,A ;初值的高八位 ret
L1: call displayled ;显示F call testkey jz L1 call getkey
mov 30h,a ;在30H中存放电压幅值 anl a, #1fh ; 显示键码 mov dptr, #LEDMap movc a, @a+dptr mov LEDBuf+5, a L2: call displayled call testkey jz L2 call getkey cjne a,#16h,L2 mov a,#0ch anl a, #1fh
mov dptr, #LEDMap movc a, @a+dptr mov LEDBuf+4, a
L31: call displayled ;显示C call testkey jz L31 call getkey mov 23h,a anl a,#1fh
mov dptr,#ledmap movc a,@a+dptr mov ledbuf+3,a L32: call displayled call testkey jz L32 call getkey
cjne a,#16h,LN2 ljmp L4 LN2:mov r1,23h mov 22h,r1 mov 23h,a anl a,#1fh
mov dptr,#ledmap movc a,@a+dptr
mov ledbuf+2,ledbuf+3 mov ledbuf+3,a L33: call displayled call testkey jz L33 call getkey
cjne a,#16h,LN3 ljmp L4
LN3: mov r1,22h mov 21h,r1 mov r1,23h mov 22h,r1 mov 23h,a anl a,#1fh
mov dptr,#ledmap movc a,@a+dptr mov r0,ledbuf+2 mov ledbuf+1,r0 mov r0,ledbuf+3 mov ledbuf+2,r0 mov ledbuf+3,a L34: call displayled call testkey jz L34 call getkey
cjne a,#16h,LN4 ljmp L4
LN4:mov r1,21h mov 20h,r1 mov r1,22h mov 21h,r1 mov r1,23h mov 22h,r1 mov 23h,a anl a,#1fh
mov dptr,#ledmap
movc a,@a+dptr mov r0,ledbuf+1 mov ledbuf+0,r0 mov r0,ledbuf+2 mov ledbuf+1,r0 mov r0,ledbuf+3 mov ledbuf+2,r0 mov ledbuf+3,a L4: call displayled call testkey jz L4
call getkey cjne a,#16h,L4 mov a,#0Ah anl a,#1fh
mov dptr,#ledmap movc a,@a+dptr mov ledbuf+4,a ret
Start:
mov LEDBuf+0, #3fh ; 显示 0.0.0.0. mov LEDBuf+1, #3fh mov LEDBuf+2, #3fh mov LEDBuf+3, #3fh mov LEDBuf+4, #3fh mov LEDBuf+5, #3fh MLoop:
lcall DisplayLED ; 显示 lcall TestKey ; 有键入?
jz MLoop ; 无键入, 继续显示 lcall GetKey ; 读入键码 cjne a,#13h,mloop mov a,#0fh
anl a, #1fh ; 显示键码 mov dptr, #LEDMap movc a, @a+dptr mov LEDBuf+4, a call L1 start1:mov r1,#064h mov a,#00h mov r7,a
lcall CHUZHI
mov r4,30h
cjne r4,#1,LOOP2 ljmp LOOP7
LOOP2: cjne r4,#2,LOOP3 MOV A,#0 ljmp LOOP8
LOOP3: cjne r4,#3,LOOP4 MOV A,#0 ljmp LOOP9
LOOP4: cjne r4,#4,LOOP5 MOV A,#0 ljmp LOOP10 LOOP5:
MOV A,#0 LJMP LOOP11 loop7: mov a,#0 LOOP6:
mov 40h,a
MOV DPTR,#SIN1 MOVC A,@A+DPTR
mov dptr,#0a000h movx @dptr,a
call DINGSHI
mov a,40h inc a
djnz r1,LOOP6 mov a,#0h mov r1,#64h lcall testkey jz LOOP6 ljmp start LOOP8:
mov 40h,a
MOV DPTR,#SIN2 MOVC A,@A+DPTR
mov dptr,#0a000h movx @dptr,a
call DINGSHI
mov a,40h inc a
;置D\\A转换地址;调用定时 ;置D\\A转换地址;调用定时 djnz r1,LOOP8 mov a,#0h mov r1,#64h lcall testkey jz LOOP8 ljmp start LOOP9:
mov 40h,a
MOV DPTR,#SIN3 MOVC A,@A+DPTR
mov dptr,#0a000h movx @dptr,a
call DINGSHI
mov a,40h inc a
djnz r1,LOOP9 mov a,#0h mov r1,#64h lcall testkey jz LOOP9 ljmp start LOOP10:
mov 40h,a
MOV DPTR,#SIN4 MOVC A,@A+DPTR
mov dptr,#0a000h movx @dptr,a
call DINGSHI
mov a,40h inc a
djnz r1,LOOP10 mov a,#0h mov r1,#64h lcall testkey jz LOOP10 ljmp start LOOP11:
mov 40h,a
MOV DPTR,#SIN5
;置D\\A转换地址;调用定时 ;置D\\A转换地址;调用定时 MOVC A,@A+DPTR
mov dptr,#0a000h ;置D\\A转换地址 movx @dptr,a
call DINGSHI ;调用定时
mov a,40h inc a
djnz r1,LOOP11 mov a,#0h mov r1,#64h lcall testkey jz LOOP11 ljmp start
DINGSHI:
clr tf0
mov tmod,#01h ;定时器 mov th0,#00 mov tl0,#01 setb tr0 nov: jbc tf0,ovr sjmp nov ovr: ret
SIN1: DB 26,28,29,31,32,34,36,37,39,40,41,43,44,45,46 DB 47,48,49,50,50,51,51,52,53,53,53,52,52,52,51 DB 51,50,50,49,48,47,46,45,44,43,41,40,39,37,36 DB 34,32,31,29,28,26,24,23,21,20,18,16,15,13,12 DB 11,9,8,7,6,5,4,3,2,2,2,1,1,1,0 DB 0,0,0,1,1,2,2,2,3,4,5,6,7,8,9
DB 11,12,13,15,16,18,20,21,23,24,26
SIN2: DB 51,54,57,61,64,67,70,73,76,78,81,84,86 DB 88,90,92,94,96,97,98,100,100,101,102,102,102 DB 102,102,101,100,100,98,97,96,94,92,90,88,86 DB 84,81,78,76,73,70,67,64,61,57,54,51,48 DB 45,41,38,35,32,29,26,24,21,18,16,14,12 DB 10,8,6,5,4,2,2,1,0,0,0,0,0 DB 1,2,2,4,5,6,8,10,12,14,16,18,21 DB 24,26,29,32,35,38,41,45,48,51
SIN3: DB 76,81,86,90,95,99,104,108,113,117,121,124,128,131,135
DB 137,140,143,145,147,148,150,151,151,152,152,152,151,151,150 DB 148,147,145,143,140,137,135,131,128,124,121,117,113,108,104 DB 99,95,90,86,81,76,71,66,62,57,53,48,44,39,35 DB 31,28,24,21,17,15,12,9,7,5,4,2,1,1,0 DB 0,0,1,1,2,4,5,7,9,12,15,17,21,24,28
DB 31,35,39,44,48,53,57,62,66,71,76
SIN4: DB 102,108,115,121,127,134,140,145,151,157,162,167,172,176,181 DB 185,188,191,194,197,199,201,202,203,204,204,204,203,202,201 DB 199,197,194,191,188,185,181,176,172,167,162,157,151,145,140 DB 134,127,121,115,108,102,96,89,83,77,70,64,59,53,47 DB 42,37,32,28,23,19,16,13,10,7,5,3,2,1,0 DB 0,0,1,2,3,5,7,10,13,16,19,23,28,32,37 DB 42,47,53,59,64,70,77,83,89,96,102
SIN5: DB 127,135,143,151,159,166,174,181,188,195,202,208,214,220,225 DB 230,234,238,242,245,248,250,252,253,254,254,254,253,252,250 DB 248,245,242,238,234,230,225,220,214,208,202,195,188,181,174 DB 166,159,151,143,135,127,119,111,103,95,88,80,73,66,59 DB 52,46,40,34,29,24,20,16,12,9,6,4,2,1,0 DB 0,0,1,2,4,6,9,12,16,20,24,29,34,40,46 DB 52,59,66,73,80,88,95,103,111,119,127 end
因篇幅问题不能全部显示,请点此查看更多更全内容