微机原理课程设计——在液晶模块上面实现秒表功能——00.00~10.00
使液晶屏实现秒表功能,显示数字00.00~10.00,每隔0.01 秒数字变化一次
流程图
中断程序流程图
液晶屏显示流程图
代码
1 ;----------------------------------------------------------- 2 CNT0 EQU 0280H 3 CNT1 EQU 0281H 4 CNT2 EQU 0282H 5 CON_8253 EQU 0283H 6 CON_NUM EQU 36H ;8253的控制字,采用方式3,36H 7 INITIAL EQU 2710H ;写入8253的初值 8 INT_NUM EQU 0BH ;IRQ3终端类型号 9 IO_ADDRESS EQU 0288H 10 ;----------------------------------------------------------- 11 DATA SEGMENT 12 FOUR DB 30H ;代表第四位的值 13 THIR DB 30H 14 SEC DB 30H 15 FIR DB 30H 16 NUM_BUFF DB 30H,30H,2EH,30H,30H 17 NUM_ADR DB ? ;存放显示行起始端口地址 18 INT_SEG DW ? ;用于保存中断向量段基址的变量 19 INT_OFF DW ? ;用于保存中断向量偏移量的变量 20 INTSOR DB ? ;定义保存中断屏蔽字的变量 21 MES DB 'PRESS ANY KEY TO DOS!' 22 DB 0AH,0DH,'$' 23 DATA ENDS 24 ;----------------------------------------------------------- 25 STACK SEGMENT 26 STA DB 100 DUP (?) 27 TOP EQU LENGTH STA 28 STACK ENDS 29 ;----------------------------------------------------------- 30 CODE SEGMENT 31 ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA 32 ;------------------------------------------------------------ 33 START: MOV AX, DATA 34 MOV DS, AX 35 MOV ES, AX 36 MOV AX, STACK 37 MOV SS, AX 38 MOV SP, TOP 39 40 PUSH DS 41 PUSH ES 42 43 ;保存原有中断向量 44 MOV AL, INT_NUM ;INT_NUM 为指定中断号 45 MOV AH, 35H 46 INT 21H 47 MOV INT_SEG, ES ;保存向量段基址 48 MOV INT_OFF, BX ;保存向量偏移量 49 CLI ;修改向量前关中断 50 51 ; 52 MOV AX, SEG INT_PR ;INT_TIME是中断服务程序 53 MOV DS, AX ;DS指向中断程序段基址 54 MOV DX, OFFSET INT_PR ;DX指向中断程序偏移量 55 MOV AL, INT_NUM 56 MOV AH, 25H 57 INT 21H 58 59 ;保护原中断屏蔽字 60 IN AL, 21H 61 MOV INTSOR, AL ;保护原中断屏蔽字 62 AND AL, 0F7H ;开放IRQ3的中断请求 63 OUT 21H, AL 64 65 POP ES 66 POP DS 67 68 ;显示 69 MOV DX, OFFSET MES 70 MOV AH, 09H 71 INT 21H 72 73 MOV DX, IO_ADDRESS 74 ADD DX, 3 75 MOV AL, 80H 76 OUT DX, AL ;8255初始化 77 78 MOV AL, 0FFH 79 MOV DX, IO_ADDRESS 80 OUT DX, AL 81 82 CALL CLEAR ;LCD 清除 83 LEA BX, NUM_BUFF 84 CALL LCD_DISP 85 86 ;计数器0/方式3/10ms 87 ;初始化8253,触发中断的脉冲处于低电平 88 MOV DX, CON_8253 89 MOV AL, 36H ;8253写入控制字 90 OUT DX, AL 91 MOV DX, CNT0 92 ; MOV AL, 10H ;CNT0写入初始值低字节 93 MOV AL, 20H ;CNT0写入初始值低字节 94 OUT DX, AL 95 ; MOV AL, 27H ;CNT0写入初始值高字节 96 MOV AL, 4EH ;CNT0写入初始值高字节 97 98 OUT DX, AL 99 100 STI ;开中断 101 102 MAIN: LEA BX, NUM_BUFF ;显示第2行信息 103 CALL LCD_DISP 104 MOV AH, 01H ;键盘 105 INT 16H 106 JZ MAIN 107 CLI ;修改向量前关中断 108 ;----------------------------------------------------------- 109 ;重新赋值中断向量 110 MOV AX, INT_SEG 111 MOV DS, AX ;DS指向向量段基址 112 MOV DX, INT_OFF ;DX指向向量偏移址 113 MOV AL, INT_NUM ; 114 MOV AH, 25H; 115 INT 21H 116 117 ;恢复原中断屏蔽字 118 MOV AL, INTSOR 119 OUT 21H,AL 120 ;STI 121 MOV AH, 4CH ;返回DOS 122 INT 21H 123 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 124 CLEAR PROC 125 ;00001100,开显示 126 MOV AL, 0CH 127 MOV DX, IO_ADDRESS 128 OUT DX, AL ;设置CLEAR命令 129 CALL CMD_SETUP ;启动LCD执行命令 130 RET 131 CLEAR ENDP 132 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 133 LCD_DISP PROC 134 LEA BX, NUM_BUFF 135 MOV BYTE PTR NUM_ADR,90H ;10010000 136 MOV CL,5 137 ;循环5次,输出5个字符 138 CONTINUE: PUSH CX 139 MOV AL, NUM_ADR 140 MOV DX, IO_ADDRESS 141 OUT DX, AL 142 CALL CMD_SETUP ;设定DDRAM地址命令 143 144 MOV AL,[BX] 145 MOV DX,IO_ADDRESS 146 OUT DX,AL 147 CALL DATA_SETUP ;输出 148 CALL DELAY ;延迟 149 150 INC BX 151 INC BYTE PTR NUM_ADR ;修改LCD显示端口地址 152 POP CX 153 DEC CL 154 JNZ CONTINUE 155 RET 156 LCD_DISP ENDP 157 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 158 CMD_SETUP PROC 159 MOV DX, IO_ADDRESS ;指向8255端口控制端口 160 ADD DX, 2 161 NOP 162 MOV AL, 00000000B ;PC1置0,PC0置0 (LCD I端=0,W端=0) 163 OUT DX, AL 164 CALL DELAY 165 NOP 166 MOV AL, 00000100B ;PC2置1 (LCD E端=1) 167 OUT DX, AL 168 NOP 169 CALL DELAY 170 MOV AL, 00000000B ;PC2置0,(LCD E端置0) 171 OUT DX, AL 172 CALL DELAY 173 174 RET 175 CMD_SETUP ENDP 176 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 177 DATA_SETUP PROC 178 MOV DX, IO_ADDRESS ;指向8255控制端口 179 ADD DX, 2 180 MOV AL, 00000001B ;PC1置0,PC0=1 (LCD I端=1) 181 OUT DX, AL 182 NOP 183 CALL DELAY 184 MOV AL, 00000101B ;PC2置1 (LCD E端=1) 185 OUT DX, AL 186 NOP 187 CALL DELAY 188 MOV AL, 00000001B ;PC2置0,(LCD E端=0) 189 OUT DX, AL 190 NOP 191 CALL DELAY 192 RET 193 DATA_SETUP ENDP 194 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 195 DELAY PROC 196 PUSH CX 197 PUSH DX 198 MOV CX, 0FFFH 199 X1: LOOP X1 200 POP DX 201 POP CX 202 RET 203 DELAY ENDP 204 ;----------------------------------------------------------- 205 INT_PR PROC FAR 206 PUSH SI 207 PUSH DI 208 PUSH CX 209 PUSH AX 210 STI 211 ;------------------------------------------------------------ 212 MOV BYTE PTR FOUR, 30H ;在从10.00到00.00时对最高位的初始化 213 INC BYTE PTR FIR 214 CMP BYTE PTR FIR, 3AH 215 JZ SEC_HAN ;能够进位,转入对第二位处理的程序 216 JMP BACK 217 218 SEC_HAN: MOV BYTE PTR FIR, 30H ;处理第二位,先将第一位的数值清零 219 INC BYTE PTR SEC 220 CMP BYTE PTR SEC, 3AH 221 JZ THIR_HAN 222 JMP BACK 223 224 THIR_HAN: MOV BYTE PTR SEC, 30H 225 INC BYTE PTR THIR 226 CMP BYTE PTR THIR, 3AH 227 JZ FOUR_HAN 228 JMP BACK 229 230 FOUR_HAN: MOV BYTE PTR THIR, 30H 231 INC FOUR 232 233 BACK: MOV SI, OFFSET FOUR 234 MOV DI, OFFSET NUM_BUFF 235 MOV CX, 2 236 CLD 237 REP MOVSB 238 MOV AL, 2EH 239 MOV [DI], AL 240 INC DI 241 MOV CX, 2 242 REP MOVSB 243 ;------------------------------------------------------------ 244 CLI 245 POP AX 246 POP CX 247 POP DI 248 POP SI 249 MOV AL, 20H 250 OUT 20H, AL 251 252 STI 253 IRET ;不够进位,跳出中断,使触发中断的脉冲处于低电平 254 INT_PR ENDP 255 ;----------------------------------------------------------- 256 CODE ENDS 257 END START