课程设计内容:电子时钟(CLOCK)
一.课程设计目的
进一步熟悉和掌握8253、8255、8259芯片以及硬件中断编程的综合性应用。
二、实验设备及软件环境
PC机一台、DOSBox 0.74、masm 5、EditPlus 5.2、Proteus 8 Professional
三、课程设计内容及方案
1、使用8253定时功能,产生0.5s的定时中断给8259,8259中断服务程序实现半秒级计数(中断2次为1秒);
2、使用8255 A口(显示字模)和B口(位驱动)实现在数码管上显示标准时间;
3、使用8255 C口构造4X4的键盘,自定义键值,用于设置时钟初值。
4、实现可校对的电子时钟。
四、课程设计步骤
1、建立本实验的工程文件,绘制实验的原理图方案,编写程序代码。
2、运行程序,设置时钟初值;
3、观察数码管上显示的时间是否正确,并验证程序逻辑的正确性。
五、课程设计参考原理图
图3.1 电子时钟原理图
图3.1.1 8086CPU原理图
图3.1.2 数据总线原理图
图3.1.3 地址总线原理图
图3.1.4 地址译码原理图
图3.1.5 8259中断控制器原理图
图3.1.6 8253定时原理图
图3.1.7 8255并行接口原理图
图3.1.8 键盘结构原理图
图3.1.9 数码管显示原理图
六、程序流程图
图3.2 主程序流程图
图3.3 DISPLAY子程序
图3.4 KEY_SCAN键盘扫描子程序
图3.5 8253中断服务子程序
图3.6 adj_Time子程序
七、参考源程序
DATA SEGMENT
C8255_A_PORT EQU 380H
C8255_B_PORT EQU 382H
C8255_C_PORT EQU 384H
C8255_CTRL_PORT EQU 386H
C8259_0_ICW1 EQU 0390H
C8259_1_ICW2 EQU 0392H
C8259_1_ICW3 EQU 0392H
C8259_1_ICW4 EQU 0392H
C8259_1_OCW1 EQU 0392H
C8259_0_OCW2 EQU 0390H
C8259_0_OCW3 EQU 0390H
C8254_0_PORT EQU 3A0H
C8254_1_PORT EQU 3A2H
C8254_2_PORT EQU 3A4H
C8254_CONTROL_PORT EQU 3A6H
;Key 键扫描码
KEY_1 EQU 77H
KEY_2 EQU 7BH
KEY_3 EQU 7DH
KEY_4 EQU 0B7H
KEY_5 EQU 0BBH
KEY_6 EQU 0BDH
KEY_7 EQU 0D7H
KEY_8 EQU 0DBH
KEY_9 EQU 0DDH
KEY_0 EQU 0EBH
KEY_ADD EQU 7EH
KEY_SUB EQU 0BEH
KEY_MUL EQU 0DEH
KEY_DIV EQU 0EEH
KEY_ENTER EQU 0EDH
KEY_ESC EQU 0E7H
;共阳数码管,数字0-9对应的七段数码管字模
CA_Font_Code DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 0BFH,0FFH ;-间隔符、熄灭
;8个字节显示缓冲区,对应八位数码管,存放要显示的十进制数0-9
;10对应“-”间隔符的字模偏移量
; 时 - 分 - 秒
DisPlay_Buf DB ?,?,10,?,?,10,?,?
;8个字节调时缓冲区,对应八位数码管,存放新调整的时、分、秒
; 时 - 分 - 秒
adj_Buf DB ?,?,10,?,?,10,?,?
;时、分、秒计数--二进制
Hour DB ? ;0--23
Min DB ? ;0--59
Sec DB ? ;0--59
FreshFlag DB 0
HalfsecFlag DB 0
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 1024 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
CLI ;关中断
CALL Init_8254
CALL Init_8255
CALL Init_8259
CALL WriIntver
MOV FreshFlag,0
MOV Hour,23
MOV Min,58
MOV Sec,45
CALL Time_TO_DisPlay_Buf
STI ;开中断
MAIN:
CALL DISPLAY
CALL KEY_SCAN
CMP AL,0FH
JE NO
CMP AL,KEY_ENTER
JNZ NO
CALL adj_Time
NO:CMP FreshFlag,1
JNE MAIN
CALL Time_TO_DisPlay_Buf
MOV FreshFlag,0
JMP MAIN
;调整时间子程序
adj_Time PROC NEAR
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
CALL Time_TO_adj_Buf
MOV BX,0
ContinueWait:
MOV SI,OFFSET adj_Buf
MOV DI,OFFSET DisPlay_Buf
MOV CX,8
REP MOVSB
CMP HalfsecFlag,1
JNE DIS
LEA SI,DisPlay_Buf
MOV BYTE PTR [SI+BX],11
DIS:CALL DISPLAY
CALL KEY_SCAN
CMP AL,0FH
JE ContinueWait ;无键按下,继续
CMP AL,KEY_ESC ;按下ESC放弃键
JNE GO ;跳转跨度受限处理,等价于JE RTN
JMP RTN
GO:CMP AL,KEY_ENTER ;按下ENTER确认键
JE OK
CMP AL,9 ;按下非数字键(其它功能键)
JNBE ContinueWait
;-------------调整时-------------
CMP BX,0 ;从时的十位开始设置
JNE SET_HOUR_L
CMP AL,2 ;数据合法性检测
JA ContinueWait
MOV adj_Buf+0,AL ;合法的十位“时”,写入
JMP NEXT_ADJ_Bit
SET_HOUR_L:
CMP BX,1 ;时的个位设置
JNE SET_Min_H
CMP adj_Buf+0,2
JNE SET_HOUR_L_1
CMP AL,3 ;数据合法性检测
JA ContinueWait
SET_HOUR_L_1:
MOV adj_Buf+1,AL ;合法的个位时,写入
INC BX ;跳过间隔符
JMP NEXT_ADJ_Bit
;-------------调整分-------------
SET_Min_H:
CMP BX,3 ;分的十位设置
JNE SET_Min_L
CMP AL,5 ;数据合法性检测
JA ContinueWait
MOV adj_Buf+3,AL ;合法的十位“分”,写入
JMP NEXT_ADJ_Bit
SET_Min_L:
CMP BX,4 ;分的个位设置
JNE SET_Sec_H
MOV adj_Buf+4,AL ;合法的个位“分”,写入
INC BX ;跳过间隔符
JMP NEXT_ADJ_Bit
;-------------调整秒-------------
SET_Sec_H:
CMP BX,6 ;秒的十位设置
JNE SET_Sec_L
CMP AL,5 ;数据合法性检测
JBE OK1
JMP ContinueWait
OK1:MOV adj_Buf+6,AL ;合法的十位“秒”,写入
JMP NEXT_ADJ_Bit
SET_Sec_L:
CMP BX,7 ;秒的个位设置
JNE NEXT_ADJ_Bit
MOV adj_Buf+7,AL ;合法的个位“秒”,写入
;-------------
NEXT_ADJ_Bit:
INC BX
CMP BX,8
JNB OK
JMP ContinueWait
OK:MOV AL,adj_Buf+0 ;确认回写“时”
MOV BL,10
MUL BL
ADD AL,adj_Buf+1
MOV Hour,AL
MOV AL,adj_Buf+3 ;确认回写“分”
MOV BL,10
MUL BL
ADD AL,adj_Buf+4
MOV Min,AL
MOV AL,adj_Buf+6 ;确认回写“秒”
MOV BL,10
MUL BL
ADD AL,adj_Buf+7
MOV Sec,AL
RTN:POP DI
POP SI
POP CX
POP BX
POP AX
POPF
RET
adj_Time ENDP
Init_8255 PROC NEAR
PUSHF
PUSH AX
PUSH DX
MOV DX,C8255_CTRL_PORT
MOV AL,81H ;方式控制字,方式0,A口输出,B口输出,C口高四位C7-C4输出,低四位C3-C0输入
OUT DX,AL
POP DX
POP AX
POPF
RET
Init_8255 ENDP
Init_8254 PROC NEAR
PUSHF
PUSH AX
PUSH DX
MOV DX,C8254_CONTROL_PORT
MOV AL,00110110B ;Mode 3 of 8254 Channels 0
OUT DX,AL
MOV DX,C8254_0_PORT
MOV AL,12H ;Low 8 Bit OF TIME_CONST 0.5s定时
OUT DX,AL
MOV AL,7AH ;High 8 Bit OF TIME_CONST
OUT DX,AL
POP DX
POP AX
POPF
RET
Init_8254 ENDP
Init_8259 PROC NEAR
PUSHF
PUSH AX
PUSH DX
MOV DX,C8259_0_ICW1
MOV AL,13H ;ICW1=00010011B:边沿触发、单片、需要ICW4
OUT DX,AL
NOP
MOV DX,C8259_1_ICW2
MOV AL,08H ;ICW2=00001000B:IRQ0的中断类型基号为08H
OUT DX,AL
NOP
MOV DX,C8259_1_ICW4
MOV AL,01H ;ICW4=00000001B:非特殊全嵌套、缓冲方式,发中断结束EOI
OUT DX,AL
NOP
MOV DX,C8259_1_OCW1
MOV AL,11111101B
OUT DX,AL ;OCW1,允许IRQ1中断
POP DX
POP AX
POPF
RET
Init_8259 ENDP
WriIntver PROC NEAR
PUSHF
PUSH AX
PUSH ES
MOV AX,0000H
MOV ES,AX
MOV BX,09H*4
MOV AX,OFFSET IRQ1Int
MOV ES:[BX],AX
MOV AX,CS
MOV ES:[BX+2],AX ;初始化中断向量表
POP ES
POP AX
POPF
RET
WriIntver ENDP
IRQ1Int PROC NEAR
CLI
PUSHF
PUSH AX
PUSH DX
PUSH SI
INC HalfsecFlag
CMP HalfsecFlag,2
;半秒标记HalfsecFlag不等于2,表明本次是半秒计时到,直接返回,不进行时分秒计数
JNE GOON
MOV FreshFlag,1
;1秒计时到,进行时分秒计数,将刷新标记FreshFlag置1,表明需要刷新显示数据
MOV HalfsecFlag,0
INC Sec
CMP Sec,60
JNE GOON
MOV Sec,0
INC Min
CMP Min,60
JNE GOON
MOV Min,0
INC Hour
CMP Hour,24
JNE GOON
MOV Hour,0
GOON:
MOV DX,C8259_0_OCW2
MOV AL,20H
OUT DX,AL ;8259发中断结束命令
POP SI
POP DX
POP AX
POPF
STI
IRET
IRQ1Int ENDP
;功能:将时、分、秒转换到DisPlay_Buf显示缓冲区
Time_TO_DisPlay_Buf PROC NEAR
CLI
PUSH SI
MOV SI,OFFSET DisPlay_Buf
CALL Time_TO_Buf
POP SI
STI
RET
Time_TO_DisPlay_Buf ENDP
;功能:将时、分、秒转换到adj_Buf调时缓冲区
Time_TO_adj_Buf PROC NEAR
CLI
PUSH SI
MOV SI,OFFSET adj_Buf
CALL Time_TO_Buf
POP SI
STI
RET
Time_TO_adj_Buf ENDP
;功能:将时、分、秒转换到SI指定的缓冲区
;入口参数:SI指向缓冲区
Time_TO_Buf PROC NEAR ;bin TO dec
PUSHF
PUSH AX
PUSH BX
;将二进制“时”转换成两位十进制“时”
MOV AH,0
MOV AL,Hour
MOV BL,10
DIV BL
MOV [SI+0],AL
MOV [SI+1],AH
;将二进制“分”转换成两位十进制“分”
MOV AH,0
MOV AL,Min
MOV BL,10
DIV BL
MOV [SI+3],AL
MOV [SI+4],AH
;将二进制“秒”转换成两位十进制“秒”
MOV AH,0
MOV AL,Sec
MOV BL,10
DIV BL
MOV [SI+6],AL
MOV [SI+7],AH
POP BX
POP AX
POPF
RET
Time_TO_Buf ENDP
DISPLAY PROC NEAR ;显示8个缓冲区的字模值
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV SI,0
;SI指向显示位,从DisPlay_Buf缓冲区,从左至右显示(时的“十”位开始)
MOV CL,80H
NEXT:
MOV DX,C8255_B_PORT ;先送位控到8255 B口,CL=10000000B 位控
MOV AL,CL
OUT DX,AL
MOV DX,C8255_A_PORT ;再送字模到8255 A口
MOV AL,DisPlay_Buf[SI] ;查字模表将字模放入到对应的显示缓冲单元
MOV BX,OFFSET CA_Font_Code
XLAT
OUT DX,AL
CALL DELAY_10ms
INC SI ;SI指向下一显示位
ROR CL,1 ;同时移动位控
CMP CL,80H ;判断8位是否显示结束
JNE NEXT
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
RET
DISPLAY ENDP
;键盘扫描程序
;出口参数:若有键按下,AL中为返回值(数字键返回数字,功能键返回其键值),无键按下时返回0FH
KEY_SCAN PROC
PUSHF
PUSH DX
MOV DX,C8255_C_PORT
MOV AL,00H ;PC7、PC6、PC5、PC4行线输出低电平
OUT DX,AL
IN AL,DX ;从PC3、PC2、PC1、PC0读入列值
AND AL,0FH ;保留低四位
CMP AL,0FH
JE RETURN ;判断是否有键按下,若无键按下,返回
KEY_FUNC:
MOV AH,AL ;保存列值
MOV DX,C8255_CTRL_PORT
;反转C口的输入和输出:C口高四位C7-C4输入,低四位C3-C0输出
MOV AL,88H
OUT DX,AL
MOV DX,C8255_C_PORT
MOV AL,AH
OUT DX,AL ;列值反向输出到列线
IN AL,DX ;读入新行值
AND AL,0F0H ;保留高四位
OR AL,AH ;行值+列值-->键值存入AL
PUSH AX
KEYNoRelease:
IN AL,DX ;再读入当前行值,判断键是否抬起。若键未抬起,等待。
AND AL,0F0H
CMP AL,0F0H
JNE KEYNoRelease
POP AX
PRESS_KEY_1:
CMP AL,KEY_1 ;1#键处理
JNE PRESS_KEY_2
MOV AL,1
JMP OVER
PRESS_KEY_2:
CMP AL,KEY_2 ;2#键处理
JNE PRESS_KEY_3
MOV AL,2
JMP OVER
PRESS_KEY_3:
CMP AL,KEY_3 ;3#键处理
JNE PRESS_KEY_4
MOV AL,3
JMP OVER
PRESS_KEY_4:
CMP AL,KEY_4 ;4#键处理
JNE PRESS_KEY_5
MOV AL,4
JMP OVER
PRESS_KEY_5:
CMP AL,KEY_5 ;5#键处理
JNE PRESS_KEY_6
MOV AL,5
JMP OVER
PRESS_KEY_6:
CMP AL,KEY_6 ;6#键处理
JNE PRESS_KEY_7
MOV AL,6
JMP OVER
PRESS_KEY_7:
CMP AL,KEY_7 ;7#键处理
JNE PRESS_KEY_8
MOV AL,7
JMP OVER
PRESS_KEY_8:
CMP AL,KEY_8 ;8#键处理
JNE PRESS_KEY_9
MOV AL,8
JMP OVER
PRESS_KEY_9:
CMP AL,KEY_9 ;9#键处理
JNE PRESS_KEY_0
MOV AL,9
JMP OVER
PRESS_KEY_0:
CMP AL,KEY_0 ;0#键处理
JNE OVER
MOV AL,0
;功能键返回其键值
OVER:PUSH AX
MOV DX,C8255_CTRL_PORT
MOV AL,81H
;恢复方式控制字,方式0,A口输出,B口输出,C口高四位C7-C4输出,低四位C3-C0输入。
OUT DX,AL
POP AX
RETURN:
POP DX
POPF
RET
KEY_SCAN ENDP
CLEAR_DisPlay_Buf PROC NEAR
PUSHF
PUSH AX
PUSH SI
MOV SI,0
MOV AL,CA_Font_Code[11]
LAST:MOV DisPlay_Buf[SI],AL
INC SI
CMP SI,WORD PTR 7
JBE LAST
POP SI
POP AX
POPF
RET
CLEAR_DisPlay_Buf ENDP
DELAY_10us PROC
PUSH CX
LOOP $
POP CX
RET
DELAY_10us ENDP
DELAY_10ms PROC NEAR
PUSHF
PUSH BX
PUSH CX
MOV CX,5 ;参考值10
TIME1:MOV BX,20 ;参考值50
TIME2:DEC BX
JNZ TIME2
DEC CX
JNZ TIME1
POP CX
POP BX
POPF
RET
DELAY_10ms ENDP
CODE ENDS
END START
原理图源文件:
链接:https://pan.baidu.com/s/1iCJ46t03hWu75aSykzp1bA?pwd=abcd
提取码:abcd
八、实验结果及思考问题(可扩展)
1、分析程序执行过程中,下列波形的含义;
2、简述数码管显示原理;
3、简述键盘扫描原理;
4、叙述中断处理的详细过程;