8255实现秒表

来源:互联网 发布:域名赎回期是多久 编辑:程序博客网 时间:2024/05/20 02:27

我们做的是秒表

下面是我们的代码:

LWLC.ASM

<span style="font-size:18px">DATA SEGMENT;8255各个端口地址IO8255AEQU1460HIO8255BEQU1461HIO8255CEQU1462HIO8255KEQU1463H;8254各个端口地址IO82540EQU1440HIO82541EQU1441HIO82542EQU1442HIO8254KEQU1443HLEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH       ;段码0---9COUNT DW ?  ;交替显示次数COUNTINDW?;延迟函数内循环循环次数NUMADB?;十位数NUMBDB?;个位数DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:;初始化DSMOVAX,DATAMOVDS,AX;初始化8255;8255写入控制字98H---->10011000B;PB,PC0--PC3口均输出,A口,PC4----PC7为输入MOVAL,98H;10011000BMOVDX,IO8255KOUT DX,ALMOVNUMA,00HMOVNUMB,00HDISPLY:        MOV COUNT, 500                   MOV BX, OFFSET LED   MOVBP,COUNT   ;交替显示十位(A)和个位(B) SHOW:  ;显示十位数      MOV AL, NUMA   XLAT                         ;查表MOV DX, IO8255B                          OUT DX, AL                ;将该数的LED数码管字形代码送到B口      MOV DX, IO8255C             ;接通8段代码管的第一位,在LED上显示十位数   MOV AL, 11111011B   OUT DX, AL   CALL DELAY   CALL DECIDE   ;显示个位数       MOV AL, NUMB         XLAT   MOV DX, IO8255B               OUT DX, AL       MOV DX, IO8255C   MOV AL, 11111101B    OUT DX, AL   CALL DELAY   CALL DECIDE            DEC  COUNT   JZ  SHOW       JMP  CHANGEB             ;该数字显示完,对其+1       ;B+1操作的代码段为:CHANGEB:                      INCNUMB;个位自加   CMP NUMB, 09H          ;个位与9比较   JG  CHANGEB;如果个位大于9,那么进入改变十位(CHANGEA)代码段      JMP DISPLY;否则,显示数字;A+1操作的代码段为:CHANGEA:   MOV NUMB,00H;个位置0   INC NUMA;十位自加   CMP NUMA,09H;十位与9比较   JG  RESET       JMP DISPLY;否则,显示数字;A,B置数为0RESET:MOVNUMA,00HJMPDISPLY;软延时函数为:DELAY PROC NEAR       MOV CX, 5000   ;上次过程次数缓存DELAY0:   MOV COUNTIN, 5DELAY1:       DEC COUNTIN       JNZ DELAY1   LOOP DELAY0   RET   DELAY ENDP;Press any  key to exit   DECIDE PROC      MOV AH, 0BH     ;11号功能判断是否有键按下  INT 21H  CMP AL, 0FFH  JE  EXIT  RETEXIT:  MOVAH,4CHINT 21HDECIDE ENDPCODE ENDSEND START</span>

<span style="font-size:18px">DATA SEGMENT;8255各个端口地址IO8255AEQU1460HIO8255BEQU1461HIO8255CEQU1462HIO8255KEQU1463H;8254各个端口地址IO82540EQU1440HIO82541EQU1441HIO82542EQU1442HIO8254KEQU1443HLEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH       ;段码0---9COUNT DW ?  ;交替显示次数COUNTINDW?;延迟函数内循环循环次数NUMADB?;十位数NUMBDB?;个位数DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:;初始化DSMOVAX,DATAMOVDS,AX;初始化8255;8255写入控制字98H---->10011000B;PB,PC0--PC3口均输出,A口,PC4----PC7为输入MOVAL,98H;10011000BMOVDX,IO8255KOUT DX,ALMOVNUMA,00HMOVNUMB,00HDISPLY:        MOV COUNT, 500                   MOV BX, OFFSET LED   MOVBP,COUNT   ;交替显示十位(A)和个位(B) SHOW:  ;显示十位数      MOV AL, NUMA   XLAT                         ;查表MOV DX, IO8255B                          OUT DX, AL                ;将该数的LED数码管字形代码送到B口      MOV DX, IO8255C             ;接通8段代码管的第一位,在LED上显示十位数   MOV AL, 11111011B   OUT DX, AL   CALL DELAY   CALL DECIDE   ;显示个位数       MOV AL, NUMB         XLAT   MOV DX, IO8255B               OUT DX, AL       MOV DX, IO8255C   MOV AL, 11111101B    OUT DX, AL   CALL DELAY   CALL DECIDE            DEC  COUNT   JZ  SHOW       JMP  CHANGEB             ;该数字显示完,对其+1       ;B+1操作的代码段为:CHANGEB:                      INCNUMB;个位自加   CMP NUMB, 09H          ;个位与9比较   JG  CHANGEB;如果个位大于9,那么进入改变十位(CHANGEA)代码段      JMP DISPLY;否则,显示数字;A+1操作的代码段为:CHANGEA:   MOV NUMB,00H;个位置0   INC NUMA;十位自加   CMP NUMA,09H;十位与9比较   JG  RESET       JMP DISPLY;否则,显示数字;A,B置数为0RESET:MOVNUMA,00HJMPDISPLY;软延时函数为:DELAY PROC NEAR       MOV CX, 5000   ;上次过程次数缓存DELAY0:   MOV COUNTIN, 5DELAY1:       DEC COUNTIN       JNZ DELAY1   LOOP DELAY0   RET   DELAY ENDP;Press any  key to exit   DECIDE PROC      MOV AH, 0BH     ;11号功能判断是否有键按下  INT 21H  CMP AL, 0FFH  JE  EXIT  RETEXIT:  MOVAH,4CHINT 21HDECIDE ENDPCODE ENDSEND START</span>


电路图:

,之所以命名为LWLC.ASM,是因为这是我的小伙伴们自己亲自完成的,很有纪念,于是用我们的首字母来命名。细心阅读代码和电路图的同学,肯定注意到,电路图上连接的某些元件并没有用上,是的,你没有看错,当然,我也没错。只是我的代码并没写完全(故意的),你只要在自己的理解上进行添加就行,当然,就这样用的话,也不会出问题,只要注意下端口地址就行了。

提示:端口地址需要根据实际情况修改,不过还好(使用了宏),8254定时功能另加(这里只是使用了简单的模拟延时函数,不准确),开关功能需另加。

资料:

DOS和BIOS功能调用

可编程并行接口芯片8255A及其应用

可编程定时/计数器8254及其应用

Tdpit实验室做汇编实验时用到的软件

ISIS7 Professional一个模拟硬件环境的软件

其他一些书籍,就有劳各位自己查找

原创粉丝点击