第1个回答 2009-06-11
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends //原公司数据
table segment
db 16 dup(0)
table ends //定义16字节数据空间用于暂存对公司数据的相关转换
codesg segment
start:mov ax,data
mov es,ax //设原数据在es段
mov ax,table
mov ds,ax //设转换为要显示在屏幕上的数据的空间为数据段
mov dh,3
mov dl,10 //初始化在3行10列显示第一个数据
mov di,0 //读取双字单元数据的变址
mov si,0 //要显示的数据偏移地址的首地址
mov bp,0 //读取字单元数据的变址
call clear //调用清屏子程序,先清空屏幕
mov cx,21 //程序下面将循环21次,每次显示公司一条记录
main:push cx
mov cl, //显示在屏幕上字符的颜色
mov ax,es:[di]
mov ds:[0],ax
mov ax,es:2[di]
mov ds:[2],ax
call show_str //以上实现年份的字段的显示
add dl,15 //列数增加15,拉开距离,以便显示下一字段
push dx
mov ax,es:84[di]
mov dx,es:86[di]
call dtoc
pop dx
call show_str //以上实现总收入字段的显示
add dl,15 //同上,改变列的显示位置
push dx
mov ax,es:168[bp]
mov dx,0
call dtoc
pop dx
call show_str //以上实现雇员数字段的显示
add dl,15 //同上,改变列的显示位置
push dx
mov ax,es:84[di]
mov dx,es:86[di]
mov bx,es:168[bp]
div bx
mov dx,0
call dtoc
pop dx
call show_str //以上实现人平收入字段的显示
add bp,2
add di,4
inc dh //行数加1,实现换行准备显示下一条记录
mov dl,10 //重设列数为10,准备显示下一条记录,并对齐上一条
pop cx
loop main //返回main,去显示下一条记录
mov ax,4c00h
int 21h
dtoc:push ax //以下是双字型转十进制字符串的子程序
push bx
push cx
push dx
push si
push di
mov bx,0
push bx
mov di,1
s:mov cx,10
call divdw
mov bx,cx
mov cx,ax
add bl,30h
push bx
inc di
jcxz oka
jmp short s
oka:mov cx,dx
jcxz ok
jmp short s
ok:mov cx,di
oo:pop [si]
inc si
loop oo
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
show_str:push ax //以下是字符串显示的子程序
push bx
push cx
push dx
push es
push si
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax
mov ch,0
s1:push cx
mov cl,[si]
jcxz ok1
mov es:[bx],cl
pop cx
mov es:[bx+1],cl
inc si
add bx,2
jmp short s1
ok1:pop cx
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret
divdw:push bx //以下是防除法溢出子程序
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
ret
clear:push ax //以下是清空屏幕的子程序
push es
push bx
push cx
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
cls:mov word ptr es:[bx],0720h
add bx,2
loop cls
pop cx
pop bx
pop es
pop ax
ret
codesg ends //代码结束
end start //OK!大功告成...
第2个回答 2009-06-11
键盘加led显示的程序
dis_data data 40h ;显示数据首地址
key_hold bit 20h.0
ORG 0000H
JMP START
ORG 0100H
START:
MOV SP,#60H
MOV dis_data,#00H
MOV dis_data+1,#01H
MOV dis_data+2,#02H
MOV dis_data+3,#03H ;显示数据初始化
;主程序
MAIN:
CALL DISPLAY
CALL KEY_WORK
JMP MAIN
;-------------------------显示子程序---------------------------
DISPLAY:
MOV R2,#0FEH
MOV R1,#dis_data
DIS0:
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
INC R1
MOV P0,R2
MOV A,R2
RL A
MOV R2,A
CALL DELAY ;调延时子程序
CJNE R1,#44H,DIS0
RET
;-------------------------延时子程序---------------------------
DELAY: MOV R7,#02H
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
;-----------------------------------------------------------
KEY_WORK:
PUSH ACC
PUSH PSW
KEY_SCAN:
MOV P2,#0FFH
MOV A,P2
CJNE A,#0FFH,KEYHIT0
CLR key_hold ;键释放
JMP RETT
KEYHIT0:
CALL DL10MS ;防抖动
MOV P2,#0FFH
MOV A,P2
CJNE A,#0FFH,KEYHIT1
CLR key_hold ;键释放
JMP RETT
KEYHIT1:
JB key_hold,RETT ;键未释放,返回
SETB key_hold ;新键按下
JNB ACC.0,KEY0HIT
JNB ACC.1,KEY1HIT
JNB ACC.2,KEY2HIT
JNB ACC.3,KEY3HIT
JNB ACC.4,KEY4HIT
JNB ACC.5,KEY5HIT
JNB ACC.6,KEY6HIT
JNB ACC.7,KEY7HIT
JMP RETT
KEY0HIT: ;键1按下
INC dis_data
MOV A,#0AH
CJNE A,dis_data,RETT
MOV dis_data,#00H
JMP RETT
KEY1HIT: ;键2按下
INC dis_data+1
MOV A,#0AH
CJNE A,dis_data+1,RETT
MOV dis_data+1,#00H
JMP RETT
KEY2HIT: ;键3按下
INC dis_data+2
MOV A,#0AH
CJNE A,dis_data+2,RETT
MOV dis_data+2,#00H
JMP RETT
KEY3HIT: ;键4按下
INC dis_data+3
MOV A,#0AH
CJNE A,dis_data+3,RETT
MOV dis_data+3,#00H
KEY4HIT:
DEC dis_data ;键5按下
MOV A,#0ffh
CJNE A,dis_data,RETT
MOV dis_data,#09H
JMP RETT
KEY5HIT:
DEC dis_data+1 ;键6按下
MOV A,#0ffh
CJNE A,dis_data+1,RETT
MOV dis_data+1,#09H
JMP RETT
KEY6HIT:
DEC dis_data+2 ;键7按下
MOV A,#0ffh
CJNE A,dis_data+2,RETT
MOV dis_data+2,#09H
JMP RETT
KEY7HIT:
DEC dis_data+3 ;键8按下
MOV A,#0ffh
CJNE A,dis_data+3,RETT
MOV dis_data+3,#09H
RETT:
POP ACC
POP PSW
RET
;*********************
;键盘仿抖延时延时
;*********************
DL10MS:
MOV R4,#20
DELMS:
CALL DISPLAY
DJNZ R4,DELMS
RET
;将延时程序换成下面的程序看看会有什么样的变化,为什么?
DL10MS11:
MOV R4,#100
DEL11:
MOV R5,#250
NOP
NOP
DJNZ R5,$
DJNZ R4,DEL11
RET
;-------------------------LED显示码表--------------------------
TAB: DB 0c0H, 0f9H, 0a4H, 0b0H, 99H, 92H
; 0 1 2 3 4 5
; 00H 01H 02H 03H 04H 05H
;
DB 82H, 0f8H, 80H, 90H, 88H, 83H
; 6 7 8 9 A b
; 7DH 07H 08H 09H 0AH 0BH
;
DB 0c6H, 0a1H, 86H, 8eH, 8cH, 0c1H
; C D E F P U
; 0CH 0DH 0EH 0FH 10H 11H
;
DB 89H, 0c7H,0bfH, 91H,00H,0ffH
; H L - y ON OFF
; 12H 13H 14H 15H 16H 17H
;
DB 92H, 77H, 8bH, 0afH, 0a3H, 0a1H
; S t h r o d
; 18H 19H 1AH 1BH 1CH 1DH
;
DB 0f0H, 0FH, 8bH, 0afH, 0a3H, 0a1H
; S t h r o d
; 1EH 1FH 20H 21H 22H 23H
END