查看: 791|回复: 11
打印 上一主题 下一主题

电子表的设计程序

[复制链接] qrcode

4

主题

8

帖子

22

积分

新手上路

Rank: 1

积分
22
楼主
跳转到指定楼层
发表于 2015-12-8 01:45 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

电子表的设计程序

要求有电路图和源程序

最好有流程图

回复

使用道具 举报

4

主题

8

帖子

22

积分

新手上路

Rank: 1

积分
22
沙发
 楼主| 发表于 2015-12-9 11:30 AM | 只看该作者
你这是在请教了,还是在强迫了                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
板凳
发表于 2015-12-20 05:41 AM | 只看该作者
我已经设计出来了一段程序,但是有错误

不知道有没有大虾帮忙改一下.
程序如下:
DATA SEGMENT
DISPLAY DB ?
MSG DB "PRESS 'ESC' TO EXIT...",10H,13H
BKCOLOR DW 6D6DH
MCOLOR DW 0030H
SCOLOR DW 0028H
MEM DW ?
NUBTBL DB 1, 1, 1, 0, 1, 1, 1 ; 0
DB 0, 0, 1, 0, 0, 1, 0 ; 1
DB 1, 0, 1, 1, 1, 0, 1 ; 2
DB 1, 0, 1, 1, 0, 1, 1 ; 3
DB 0, 1, 1, 1, 0, 1, 0 ; 4
DB 1, 1, 0, 1, 0, 1, 1 ; 5
DB 1, 1, 0, 1, 1, 1, 1 ; 6
DB 1, 0, 1, 0, 0, 1, 0 ; 7
DB 1, 1, 1, 1, 1, 1, 1 ; 8
DB 1, 1, 1, 1, 0, 1, 1 ; 9
PTSEG DW 7,2,35,10
DW 2,7,10,35
DW 32,7,40,35
DW 7,32,35,40
DW 2,37,10,65
DW 32,37,40,65
DW 7,62,35,70
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AX,0A000H
MOV ES,AX

MOV AH,0FH
INT 10H
MOV DISPLAY,AL ;save display

MOV AX,0013H
INT 10H ;set display

CLD
MOV AX,BKCOLOR
XOR DI,DI
MOV CX,08000H
REP STOSW
_WAIT:
MOV AH,2CH
INT 21H ;read time

PUSH CX
PUSH DX
CALL MYTIME

MOV AH,1
INT 16H ;read buffer of keyboard

PUSH AX
MOV DL,0FFH
MOV AX,0C06H ;clear keyboard buffer
INT 21H

POP AX
SUB AL,1BH
JNZ _WAIT

MOV AL,DISPLAY
MOV AH,00
INT 10H ;resume the model of displing

MOV AX,4C00H
INT 21H ;return to dos

;************* End Of Main() *************************

;------------ my three process ---------------------
;------------ proc 0:
MYTIME PROC NEAR PASCAL USES AX BX CX DX DI SI,
hm:word,sec:word
MOV CX,HM ;hour
XOR AX,AX
MOV AL,CH
AAM
PUSH AX
MOV CL,8
SHR AX,CL
MOV DX,20
PUSH DX
MOV DX,50
PUSH DX
PUSH MCOLOR
PUSH AX
CALL DISPLAYDIGIT

POP AX
AND AX,0FH
MOV DX,62
PUSH DX
MOV DX,50
PUSH DX
PUSH MCOLOR
PUSH AX
CALL DISPLAYDIGIT
MOV CX,HM ;mintute
XOR AX,AX
MOV AL,CL
AAM
PUSH AX
MOV CL,8
SHR AX,CL
MOV DX,116
PUSH DX
MOV DX,50
PUSH DX
PUSH MCOLOR
PUSH AX
CALL DISPLAYDIGIT

POP AX
AND AX,0FH
MOV DX,158
PUSH DX
MOV DX,50
PUSH DX
PUSH MCOLOR
PUSH AX
CALL DISPLAYDIGIT
MOV CX,SEC ;second
XOR AX,AX
MOV AL,CH
AAM
PUSH AX
MOV CL,8
SHR AX,CL
MOV DX,212
PUSH DX
MOV DX,50
PUSH DX
PUSH SCOLOR
PUSH AX
CALL DISPLAYDIGIT

POP AX
AND AX,0FH
MOV DX,254
PUSH DX
MOV DX,50
PUSH DX
PUSH SCOLOR
PUSH AX
CALL DISPLAYDIGIT

RET
MYTIME ENDP

;------------ proc 1:
DISPLAYDIGIT PROC NEAR PASCAL USES AX BX CX DX DI SI,
x:word,y:word,color:word,num:word
LEA SI,NUBTBL
MOV BX,7
MOV AX,NUM
MUL BX
ADD SI,AX ;choise a number
LEA DI,PTSEG
XOR CX,CX
_FOR:
MOV BX,BKCOLOR
CMP BYTE PTR DS:[SI],0
JE DISPL
MOV BX,COLOR
DISPL:
MOV DX,X
ADD DX,DS:[DI]
PUSH DX

MOV DX,Y
ADD DX,DS:[DI+2]
PUSH DX

MOV DX,X
ADD DX,DS:[DI+4]
PUSH DX

MOV DX,Y
ADD DX,DS:[DI+6]
PUSH DX
PUSH BX
CALL DRAWSIXGON

INC SI
ADD DI,8
INC CX
CMP CX,7
JNE _FOR

RET
DISPLAYDIGIT ENDP


;------------ proc 2:
DRAWSIXGON PROC NEAR PASCAL USES AX BX CX DX DI SI,
startX:word,startY:word,endX:word,endY:word,color:word
LOCAL FLAG:word

MOV FLAG,1
MOV BX,startX
MOV SI,startY
MOV AX,320
MUL SI
ADD AX,BX
MOV MEM,AX ;mem=320*startY+startX
MOV AX,endY
SUB AX,startY
MOV DX,endX
SUB DX,startX
MOV CX,DX

CMP AX,DX
JC DRAW
MOV FLAG,320 ;direct
MOV CX,AX
DRAW:
XOR BX,BX
XOR SI,SI
MOV DX,3
MOV BX,COLOR
SUB CX,8 ;length of line - 8
PUSH CX
ABOVE:
MOV DI,SI ;retive point of starting
PUSH DX
MOV AX,FLAG
MUL DX
POP DX
ADD SI,AX
ADD SI,MEM
L1:
MOV BYTE PTR ES:[SI],BL
ADD SI,FLAG ;next pix
DEC CX ;bx-->next line
JNZ L1
POP CX
ADD CX,2
PUSH CX
CMP FLAG,1
JNE L2
ADD DI,320
JMP $+3
L2:
INC DI
MOV SI,DI ;next line
DEC DX
JNZ ABOVE
DOWN:
MOV DI,SI ;retive point of starting
PUSH DX
MOV AX,FLAG
MUL DX
POP DX
ADD SI,AX
ADD SI,MEM
L3:
MOV BYTE PTR ES:[SI],BL
ADD SI,FLAG
DEC CX
JNZ L3
POP CX
SUB CX,2
PUSH CX
CMP FLAG,1
JNE L4
ADD DI,320
JMP $+3
L4:
INC DI
MOV SI,DI
INC DX
CMP DX,4
JNZ DOWN

POP CX
RET
DRAWSIXGON ENDP
CODE ENDS
END START
回复 支持 反对

使用道具 举报

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
地板
发表于 2006-6-13 12:29 PM | 只看该作者
你的程序连注释都没有,看起来很费劲!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

30

主题

1982

帖子

4004

积分

论坛元老

Rank: 8Rank: 8

积分
4004
5#
发表于 2015-3-7 07:58 AM | 只看该作者
靠,你的程序连注释都没有,看起来很费劲!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
6#
发表于 2015-3-10 11:25 AM | 只看该作者
谢谢prill 了
我已经做好了,现在传上来给后来的人共享,希望大家多多支持!!
程序如下:
data segment
mess1 db '
****************ASM ASSIGNMENT**************** ',0ah,0dh
db ' ',0ah,0dh
db '
***************ELECTRONIC CLOCK*************** ',0ah,0dh
db ' ',0ah,0dh
db '
*****Designed by Xie jiasheng and Guoding***** ',0ah,0dh
db ' ',0ah,0dh
db '
*****Press C or c to correct the time********* ',0ah,0dh
db ' ',0ah,0dh
db '
***********Press ESC button to exit*********** ',0ah,0dh,'$'
tn db 'Please input the new time (hh:mm:ss):',0dh,0ah,'$' ;提示输入时间的格式
mess2 db '*******Time is:',0ah,0dh,'$'
t_buff db 40 ;在数据段开一段时间显示缓冲区
db ?
db 40 dup (?)
hor db ?
min db ?
sec db ?
fg db 0
data ends
stack segment
db 100 dup(?)
stack ends
code segment
assume cs:code,ss:stack,ds:data ;确定各个逻辑段的类型
start:
call clear ;调用清屏子程序
display: ;时间显示部分
mov ax,seg data
mov ds,ax
mov bx,offset t_buff ;送t_buff的偏移地址到BX
mov ah,2ch ;调用DOS时间调用功能,功能号:2cH,小时,分钟,秒数
;分别保存在CH,CL,DH中
int 21h
mov al,ch ;小时数设定
mov ah,0
call bctd ;调用进制转换子程序
push ax
and al,0f0h ;选取al高四位
mov cl,4 ;设置右循环的次数
rol al,cl ;右循环
or al,30h ;加30h得到ACSII码
mov [bx],al ;将得到的结果送到t_buff缓冲区
inc bx ;BX自加1,指针指向下一个缓冲区的下一个地址
pop ax
and al,0fh ;选取低四位
or al,30h
mov [bx],al ;将转换后的低四位值送入缓冲区的第二个地址
inc bx
;----------------------------------------------------------
mov al,':' ;显示分隔符号
mov [bx],al
inc bx
;-------------------------------------------------------
mov ah,2ch
int 21h

mov al,cl ;分钟数设定
mov ah,0
call bctd
push ax
and al,0f0h
mov cl,4
rol al,cl
or al,30h

mov [bx],al
inc bx
pop ax
and al,0fh
or al,30h
mov [bx],al
inc bx
;-------------------------------------------------------------------------
mov al,':' ;显示分隔符号
mov [bx],al
inc bx
;-------------------------------------------------------------------------

mov ah,2ch ;秒设定
int 21h
mov al,dh
mov ah,0
call bctd
push ax
and al,0f0h
mov cl,4
rol al,cl
or al,30h

mov [bx],al
inc bx
pop ax
and al,0fh
or al,30h
mov [bx],al
inc bx
;----------------------------------------------------------------------
mov al,'$' ;将字符串的结束位送至显示缓冲区的最后一位
mov [bx],al
;------------------------------------------------------------------------
push bx ;置光标位置 ,AH=2,BH=0,
; DH跟DL分别为行号与列号,并入栈保护BX
mov ah,2
mov bh,0
mov dh,17
mov dl,41
int 10h
pop bx
lea dx,t_buff ;送t_buff偏移地址到DX,并调用DOS显示功能,功能号为9
mov ah,9
int 21h

push bx ;置光标位置
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h
pop bx
lea dx,mess1
mov ah,9
int 21h

push bx ;置光标位置
mov ah,2
mov bh,0
mov dh,17
mov dl,21
int 10h
pop bx

lea dx,mess2
mov ah,9
int 21h

;-----------------------------
call delay1
mov ah,1 ;调用键盘I/O中断功能号1,获取键值到AL
int 16h
cmp al,'c' ;是c键,转到时间修改程序
je Cor
cmp al,'C' ;是C键,转到时间修改程序
je Cor
cmp al,1bh
jz quit ;是ESC键,退出程序
jmp display

quit:
mov ah,4ch ;程序终止功能号
int 21h
ret

Cor: call correct ;调用时间修改子程序
;-------------------------------
bctd proc near ;二进制转BCD码子程序
;AX输入参数
;AX输出参数,存放调整过的BCD码
mov dx,ax
mov ax,0
mov cx,16 ;设循环次数
bctd1:
clc ;清进位标志C
rcl dx,1 ;通过进位的循环右移
adc al,al ;带进位加法
daa ;加法的十进制调整
xchg al,ah ;交换高、低八位
adc al,al
daa
xchg al,ah
loop bctd1 ;循环次数保存在CX里
ret
bctd endp
;-------------------------------------------
clear proc near
push ax ;入栈保护现场
push bx
push cx
push dx
mov ax,0600h ;ah=06(滚动)al=00(全屏空白)
mov bh,2eh ;设置背景颜色(2)和前景颜色(e)
sub cx,cx
mov dx,5f5fh
int 10h
pop dx ;出栈恢复现场
pop cx
pop bx
pop ax
ret
clear endp



;-----------------------------------------
delay1 PROC ;精确延迟时间子程序

MOV DX,04ffh ;循环次数
up:XOR CX,CX
a:NOP
LOOP a
DEC DX
JNZ up
RET
delay1 ENDP
;----------------------------
correct proc ;时间修改子程序
call input ;调用键盘输入子程序输入数据
mov ch,hor
mov cl,min
mov dh,sec
and dl,0h
mov ah,2dh
int 21h
jmp start
ret
correct endp

input proc ;键盘输入子程序
push ax ;入栈保护数据
push bx
push cx
push dx
pushf

mov dx,offset tn ;显示修改时间的格式提示
mov ah,09h
int 21h

mov dx,offset t_buff ;数据缓冲区的数据输入
mov ah,0ah
int 21h
and dx,0h
lea bx,t_buff
inc bx
inc bx
mov dh,[bx]
sub dh,30h
inc bx
mov dl,[bx]
sub dl,30h
mov cl,10
mov al,dh
mul cl
add al,dl
mov ch,al
mov hor,al
inc bx
inc bx
mov dh,[bx]
sub dh,30h
inc bx
mov dl,[bx]
sub dl,30h
mov cl,10
mov al,dh
mul cl
add al,dl
mov cl,al
mov min,al
inc bx
inc bx
mov dh,[bx]
sub dh,30h
inc bx
mov dl,[bx]
sub dl,30h
mov cl,10
mov al,dh
mul cl
add al,dl
mov dh,al
mov sec,al
popf ;出栈恢复数据
pop dx
pop cx
pop bx
pop ax
ret
input endp
;----------------------------
code ends
end start
回复 支持 反对

使用道具 举报

0

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
7#
发表于 2015-3-10 12:17 PM | 只看该作者
还有硬件设计原理图及电路图吗?麻烦贴出来共享啊!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
8#
发表于 2015-3-10 01:48 PM | 只看该作者
你都不说是用的什么芯片?                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
9#
发表于 2015-3-10 04:00 PM | 只看该作者
给了思想但是没有身体,呵呵                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
10#
发表于 2015-3-10 06:01 PM | 只看该作者
怕大家盗用啊                                                                                                                                                                       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表