预测分析程序实验报告

题目:预测分析法

一、实验目的

1、通过实验要学会用消除左递归和消除回溯的方法来使文法满足进行确定自顶向下分析的条件;

2、学会用C/C++高级程序设计语言编写一个LL(1)分析法程序

二、实验内容及要求

LL(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。对于任何(X,a),总控程序每次都执行下述三种可能的动作之一:

(1)若X = a =‘#’,则宣布分析成功,停止分析过程。

(2)若X = a‘#’,则把X从STACK栈顶弹出,让a指向下一个输入符号。

(3)若X是一个非终结符,则查看预测分析表M。若M[A,a]中存放着关于X的一个产生式,那么,首先把X弹出STACK栈顶,然后,把产生式的右部符号串按反序一一弹出STACK栈(若右部符号为ε,则不推什么东西进STACK栈)。若M[A,a]中存放着“出错标志”,则调用出错诊断程序ERROR。

1、给定文法

S -> a | b | (T)

              T -> SH | d  

H -> ,SH | ε

2、该文法对应的预测分析表

3、编写预测分析程序对句子进行分析

三、试验程序设计说明

1、相关函数说明

分析栈可以采取许多的存储方法来设计,在这里采用的顺序栈。根据预测分析原理,LL(1)分析程序的实现关键在于分析栈和分析表是采用何种数据结构来实现。分析表是一个矩阵,当我们要调用分析表来分析时,就根据栈顶的非终结符和当前输入的终结符来决定执行哪种过程。具体设计思想如下:

printStack()输出分析栈内内容;printinputString()输出用户输入的字符串;Pop()弹出栈顶元素;Push()向栈内添加一个元素;Search()查找非终结符集合VT中是否存在输入的非终结符;yuCeFenXi()进行输入串的预测分析的主功能函数;M(char A, char a)查看预测分析表M[A,a]中是否存在相应产生式。

2、程序流程图

四、实验结果

语法分析的任务就是识别词法分析程序输出的单词序列是否为给定方法的正确句子。现在我们若从键盘上输入的是有正确的句子,例如:(a,a)#, 显示“success”。运行结果如下:

五、实验小结

本次实验完成了语法分析-预测分析法的实现过程,通过本次实验巩固了以前所学过的知识,对语法分析有了更深入的了解,掌握了预测分析法的原理及其实现过程。

附:#include"stdio.h"

#include"string.h"  

char inputString[10];

char stack[10];     

int  base=0,top=1;     

char VT[6]={'a','b','(',')',',','d'};   /*用来存放6个终结符*/

char chanShengShi[10];          /*用来存放预测分析表M[A,a]中的一条产生式*/

int firstCharIntex=0;    /*firstCharIntex用来存放用户输入串的第一个元素的下标*/

int M(char A, char a);   

void init() 

{

    int i;

    for(i=0;i<10;i++)

    {

        inputString[i]=NULL;    /*初始化数组*/

        stack[i]=NULL;          /*初始化栈  */

        chanShengShi[i]=NULL;   /*初始化数组*/

    }

    printf("\t\t1>文法G[S]:");   /*输出文法做为提示*/

    printf("\n\t\t\tS -> a | b | (T)\n");

    printf("\t\t\tT -> SH | d    \n");

    printf("\t\t\tH -> ,SH | ε \n");

    printf("\t\t2>该文法对应的预测分析表:\n");  

    printf("\t\t  |   a   |   b   |   (   |  )   |   ,    |  #  |\n");

    printf("\t\tS | S->a  | S->b  | S->(T)|      |        |     |\n");

    printf("\t\tT | T->SH | T->SH | T->SH |      |        |     |\n");

    printf("\t\tH |       |       |       | H->ε| H->,SH |     |\n");

void printStack() /*输出栈内内容*/

{

    for(int i=1;i<top;i++)

        printf("%c",stack[i]);

}  

void printinputString()  /*输出用户输入的字符串*/

{

    int temp=firstCharIntex;

    printf("\t\t");  /*该句控制输出格式*/

    do{

        printf("%c",inputString[temp]);

        temp++;

    }while(inputString[temp-1]!='#');

    printf(" \n");

}

char Pop()    /*弹出栈顶元素,用topChar返回*/

{

    char topChar;

    topChar=stack[--top];

    return

        topChar;

}

void Push(char ch) 

{

    if( top>9 )

        printf(" error : stack overflow \n");     

    else

    {

        stack[top]=ch;  /*给栈顶空间赋值*/

        top++;

    } 

}

int search(char temp) 

{

    int i,flag=0;     

    for(i=0;i<6;i++)

    {

        if( temp==VT[i] ) /*终结符集合中存在temp*/

        {

            flag=1;   

            break;

        }   

    }

    if(flag==1)

        return 1;  /*flag==1说明已找到等于temp的元素*/

    else

        return 0;  

}

int yuCeFenXi()

{

    char X;     /*X变量存储每次弹出的栈顶元素*/

    char a;     /*a变量存储用户输入串的第一个元素*/

    int i;

    int counter=1;  /*该变量记录语法分析的步骤数*/ 

    init();         /*初始化数组*/

    printf("\t\t请输入待分析字符串以#结束: "); 

    scanf("%s",inputString);

    printf("\t\t3>对输入串 (a,a)# 的分析过程\n");

    Push('#'); 

    Push('S'); 

    printf("\t\t 步 骤\t\t分析栈\t\t输入串\n");  /*输出结果提示语句*/

    while(1)                       /*while循环为语法分析主功能语句块*/

    {

        printf("\t\t%4d",counter);      /*输出分析步骤数*/

        printf("\t\t");         /*输出格式控制语句*/

        printStack();

        X=Pop();     

        printinputString();       

        if( search(X)==0 )         

        {

            if(X == '#')              

            {

                printf("\t\t\tsuccess ... \n"); 

                return 1;

            }

            else 

            {

                a = inputString[firstCharIntex];

                if( M(X,a)==1 )         

                {

                    for(i=0;i<10;i++)    

                    {

                        if( chanShengShi[i]=='$' )    

                            break; 

                    }

                    i-- ;           

                    while(i>=0)

                    {

                        Push(chanShengShi[i]); 

                      i-- ;   

                    }

                }

                else

                {

                    printf("\t\t\terror(1) !!\n");                     

return 0;

                }       

            }       

        }

        else /*说明X为终结符*/

        {

if( X==inputString[firstCharIntex] )               

 firstCharIntex++;

            else

            {

                printf("\t\t\terror(2) !! \n");

                return 0;   

            }           

        }   

        counter++;   

    }

}           

int M(char A, char a)

{                       

    if( A=='S'&& a=='a' )

    {

        strcpy(&chanShengShi[0],"a$"); 

        return 1;

    }

    if( A=='S'&& a=='b' )

    {

        strcpy(&chanShengShi[0],"b$");

        return 1;

    }

    if( A=='S'&& a=='(' )

    {

        strcpy(&chanShengShi[0],"(T)$"); 

        return 1;

    }

    if( A=='T'&& a=='a' )

    {

        strcpy(&chanShengShi[0],"SH$");

        return 1;

    }

    if( A=='T'&& a=='b' )

    {

        strcpy(&chanShengShi[0],"SH$");  

        return 1;

    }

    if( A=='('&& a=='b' )

    {

        strcpy(&chanShengShi[0],"SH$");   

        return 1;

    }

    if( A=='H'&& a==')' )

    {

        strcpy(&chanShengShi[0],"$"); 

        return 1;

    }

    if( A=='H'&& a==',' )

    {

        strcpy(&chanShengShi[0],",SH$"); 

        return 1;

    }

    else

        return 0; /

}  

void main()

{

    yuCeFenXi();

    getchar();

}

 

第二篇:微机原理实验报告与程序

微机实验期末考试实验报告

一.实验要求

【设计目的】

l  进一步掌握本学期以来所做实验用到的各种元件的使用方法与编程

l  8255、8253、74LS244、74LS273、AD0809使用

l  加强综合问题解决能力

【设计要求】

a)        实现时钟功能,可以在两个七段数码管上显示秒钟时间或者分钟时间,用一个开关控制两者的切换。

b)        实现闹钟功能,时间到播放一段音乐;在显示屏上显示D/A和A/D转换的结果,要求在显示屏上显示正弦波、锯齿波等图案;在发光二极管上播放走马灯图案,在双色点阵发光二极管上滚动显示自己的学号,要求根据A/D转换的结果控制滚动显示的速度以及音乐播放的速度,且用一个置位开关控制闹钟的开和关。

【设计已达到效果】

a)            实现时钟功能,可以在两个七段数码管上显示秒钟时间或者分钟时间,可以用一个开关切换;

b)            可以设定闹钟时间,用开关控制闹钟的开启与关闭;

c)            实现并行地播放音乐、跑马灯、滚动显示学号和名字,同时还可以显示时间,进行分秒切换,进行速度控制;

d)            在闹钟响起时,可以通过开关关闭闹钟,关闭闹钟后能重新设定闹钟与显示时间;

e)            通过AD0809控制滚动显示的速度以及音乐播放的速度;

f)             跑马灯速度节奏随音乐节奏而变;

g)            双色点阵LED可以红、黄显示切换;

h)            播放不同音乐。

二.实验现象

1)拥有时钟功能,常态下显示秒钟时间,打开开关K1则显示分钟时间。

2)开机时提示设置计时开始时间和闹铃时间。

3)在计时过程中,如果打开开关K2可以进入设置计时开始时间和闹铃时间的界面进行相关操作。

4)可以并行地播放音乐、跑马灯、滚动显示学号和名字和在屏幕上画正弦波,同时还可以显示时间,进行分秒切换,进行速度控制。

5)当闹铃响起的时候,可以用开关K3关闭闹钟,之后根据要求还可以又设置计时初始时间和闹铃时间。

6)可以通过AD0809控制音乐、跑马灯、滚动显示、画波形的速度。

7)通过开关K4可以对双色点阵的红黄颜色进行切换。

8)通过键盘按键可以控制播放4首不同的音乐。

9)跑马灯是随音乐的节奏动作的。

三.实验总结

通过此次期末的综合实验,系统地复习了一学期的学习内容,提高了编写较大型的汇编程序的能力,同时对8255、8253、74LS244、74LS273、AD0809使用更加熟悉了,也对基于这些芯片的编程和基本应用有了比较好的认识,也进一步掌握了本学期以来所做实验用到的各种元件的使用方法与编程。在本次试验中,也遇到了一些问题,但是通过查找资料和积极开动脑筋,最终比较完美地实现了实验的各项要求,培养了自己独立解决问题的能力,也在解决问题中对汇编语言的理解有了进一步的提升,同时也培养了自己对软硬件结合的工程实践的兴趣。

四.实验程序

io8255a        equ 280h

io8255b        equ 281h

io8255c        equ 283h

io8255d        equ 288h

io8255e        equ 28bh

io8255f        equ 28ah

ls244        equ 2a0h

data segment

changflag db 4

heng dw 0

zong dw 0

jihua db 20

sudu db 10

huacx dw 0

sec22 db 0

min22 db 0

huasi dw ?

huadx dw 368

changdp dw 0

changsi dw 0

jiwoshu db 02h

io0832a        equ 290h

io0809b        equ 299h 

num db 0

sin    db 80h,96h,0aeh,0c5h, 0d8h,0e9h,0f5h,0fdh

       db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h

        db 80h,66h,4eh,38h,25h,15h,09h,04h

       db 00h,04h,09h,15h,25h,38h,4eh,66h

        ;正弦波数据

proth     equ       2a0h

protlr    equ      2b0h

protly    equ      2b8h

jimyn db 10

changboji db 2

chongzuo db 20

pao db 0

pao1 db 8

jiji2 db 3

huanum db 8

daitibx dw 0

jixuehao  db   00h

jihao     db   00h

xuehao    db   00h,00h,7fh,41h,41h,41h,7fh,00h ;0

          db   00h,00h,7fh,49h,49h,49h,7fh,00h ;8

          db   00h,00h,7fh,49h,49h,49h,00h,00h ;3

          db   00h,00h,7fh,08h,08h,08h,78h,00h ;4

          db   00h,00h,79h,49h,49h,49h,4fh,00h ;2

          db   00h,00h,7fh,41h,41h,41h,7fh,00h ;0

          db   00h,00h,4fh,49h,49h,49h,79h,00h ;5

          db   00h,00h,7fh,40h,40h,40h,00h,00h ;7

          db   01h,42h,64h,58h,58h,64h,42h,00h

          db   0fh,49h,69h,5fh,48h,44h,42h,41h

TWOTIGERS_FRE    dw 495,589,589,589,495,    661,661,742,661,661,661,589,    786,786,786,786,661,786,661

dw 589,     495,589,589,589,495,     661,661,742,661,661,661,589

dw  786,786,786,786,661,661,786,      882,       1178,1178,1178,1178,990,882

dw  786,786,786,786,661,786,661,786,    882,882,882,882,882,786,990,882,     882

dw  990,990,990,990,882,882,      786,786,786,882,786,661,589,      589,589,589,661,589,882,990

dw  786,      990,      990,990,990,990,882,990

dw 786,786,786,882,786,661,589,      589,589,589,661,589,882,990,    786,-1 

TWOTIGERS_TIME   dw  200,200,400,200,200,    200,200,200,400,200,200,200,      400,300,100,200,200,200,200

dw  1000,        200,200,400,200,200,        200,200,200,400,200,200,200

dw  400,300,100,300,100,200,200,        800,        200,400,200,100,200,200

dw 200,200,200,200,200,200,200,200,        200,200,200,200,200,200,200,200,    800

dw  200,400,200,200,200,400,        200,400,200,200,200,200,200,        200,400,200,200,200,200,200

dw 1200,           400,        200,400,200,200,200,400

dw 200,400,200,200,200,200,200,     200,400,200,200,200,200,200,     800

MUS_FREG3 DW 524,588,660,524

          DW 524,588,660,524

          DW 660,698,784

          DW 660,698,784

          DW 784,880,784,698,660,524

          DW 784,880,784,698,660,524

          DW 588,490,524

          DW 588,490,524,-1        

MUS_TIME3 DW 50,50,100,100,100

          DW 100,100,50,50,100,100

          DW 100,100,100,50,50,100

          DW 100,100,100,100,100,50

          DW 50,100,100,100,100,100

MUS_FREG2 DW 660,784,660,588,660,784,660,588,660

          DW 660,784,660,588,524,588,660,784,588

          DW 524,524,440,392,392,440,524,588,664,524,-1

MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100

          DW 2 DUP(50,50,25,25),100

          DW 3 DUP(50,25,25),100

MUS_FREG1 DW 660,588,524,588,3 DUP (660)

          DW 3 DUP (588),660,784,784

          DW 660,588,524,524,4 DUP (660)

          DW 588,588,660,588,524,-1

MUS_TIME1 DW 6 DUP (25*8),50*8

          DW 2 DUP (25*8,25*8,50*8)

          DW 12 DUP (25*8),100*8

led      db   3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码

pcy1     db 10b

count    db  0

second   db   0

minute   db   0

qiu      db  10

shi      db  0

zhuanhuanco db 0

xun      db  30

second1 db 0

nse      db  9

;pao      db  00

nmi      db 0 

nflag    db 0

daiax1 dw 8000

daiax2 dw 80

daic   db 2

msflag   db 0

naozflag db 0

gnao     db 0

mess0 db  0ah,0dh,'PLEASE RENEW THE TIME!',0ah,0dh,'FIRST THE MINUTE,THEN THE SECOND!',0ah,0dh,'MINUTE:  ',0ah,0dh, '$'

mess01 db 'SECOND:  ',0ah,0dh,'$'

mess db  0ah,0dh,'Please set the clock time!',0ah,0dh,'Fisrt enter the minute,then the second!',0ah,0dh,'minute:  ',0ah,0dh, '$'

mess1 db 'second:  ',0ah,0dh,'$'

mess2 db 'Has the setting been finished?  (y or n)',0ah,0dh,'$'

mess3 db 0ah,0dh, 'Success!',0ah,0dh,'$'

data ends

code segment

assume cs:code ,ds:data

start:mov ax,data

      mov ds,ax

call u7

  mov ax,0012h          ;设屏幕显示方式为VGA 640X480模示

    int 10h

     mov huasi,offset sin

mov ax,cs

      mov ds,ax

     ; mov ax,data

      ;mov ds,ax

  

      mov dx,offset int0

      mov ax,250bh;251ch

      int 21h

      in al,21h

      and al,0f7h;0feh

      out 21h,al

      sti

      mov ax,data

      mov ds,ax

    call chushi8253

; mov huasi,offset sin

   ;start1:

     ;dec jimyn

;je callshi

 ;jmp jixuz   

;callshi:;mov jimyn,10

start1:;call chang

;call chang

push cx

push ax

push bx

push dx

push si

call huashi

  pop si

  pop dx

  pop bx

  pop ax

  pop cx

 jmp start1

u10:

mov naozflag,0

call chang

jmp start1

u7 proc near

push si

push di

push ax

push bx

push cx

push dx

mov nflag,0

mov dx,offset mess0

mov ah,09h

int 21h

mov ah,01

int 21h

sub al,30h

mov bl,10

mul bl

mov min22,al

mov ah,01

int 21h

sub al,30h

add min22,al

mov dl,0ah

mov ah,02

int 21h

mov dl,0dh

int 21h

mov dx,offset mess01

mov ah,09h

int 21h

mov ah,01

int 21h

sub al,30h

mov bl,10

mul bl

mov sec22,al

mov ah,01

int 21h

sub al,30h

add sec22,al

mov dl,0ah

mov ah,02

int 21h

mov dl,0dh

int 21h

mov dx,offset mess

mov ah,09h

int 21h

mov ah,01

int 21h

sub al,30h

mov bl,10

mul bl

mov nmi,al

mov ah,01

int 21h

sub al,30h

add nmi,al

mov dl,0ah

mov ah,02

int 21h

mov dl,0dh

int 21h

mov dx,offset mess1

mov ah,09h

int 21h

mov ah,01

int 21h

sub al,30h

mov bl,10

mul bl

mov nse,al

mov ah,01

int 21h

sub al,30h

add nse,al

mov dl,0ah

mov ah,02

int 21h

mov dl,0dh

int 21h

mov dx,offset mess2

mov ah,09h

int 21h

mov ah,01

int 21h

cmp al,'n'

je u77

mov dx,offset mess3

mov ah,09h

int 21h

u8:

cmp nflag,1

je u8

push ax

mov al,min22

mov minute,al

mov al,sec22

mov second,al

pop ax

jmp start100

u77:

mov dl,0ah

mov ah,02

int 21h

mov dl,0dh

int 21h

jmp u7

start100:

pop dx

pop bx

pop cx

pop ax

pop di

pop si

ret

u7 endp

int0:

push ax

push bx

push cx

push dx

push ds

push si

push di

mov ax,data

mov ds,ax

 shushu:inc count

cmp count,1

jne exit

mov count,0

inc second

cmp second,60

jne exitn

inc minute

mov second,0

exitn:

mov cl,minute

cmp cl,nmi

jne exit

mov ch,second

cmp ch,nse

jne exit

mov naozflag,1

exit:

mov dx,28ah

in al,dx

test al,010h

jnz uu7

mov nflag,0

test al,20h

jnz uu8

mov msflag,0

test al,40h

jnz uu9

mov gnao,0

test al,80h

jnz uu16

mov zhuanhuanco,0

exit1:

pop di

pop si

pop ds

pop dx

pop cx

pop bx

pop ax

mov al,20h

out 20h,al

iret

uu7:mov nflag,1

   jmp exit1 

uu8:mov msflag,1

    jmp exit1

uu9:mov gnao,1

     jmp exit1

     uu16:mov zhuanhuanco,1

     jmp exit1

chang  proc near

push ax

push bx

push cx

push dx

push ds

push si

push di

 mov ax,data

 mov ds,ax

    

    mov dx,28bh

    mov al,88h

    out dx,al

 mov dx,283h          ;设置8253计时器0方式3, 先读写低字节, 再读写高字节

    mov al,00110110B

    out dx,al

     jmp sing1

sing1:

         cmp changflag,4

         je flag4

         cmp changflag,3

         je flag3

         cmp changflag,2

         je flag2

         cmp changflag,1

         je flag1

         flag3:lea si,  MUS_FREG3

         lea bp,ds:MUS_TIME3 

         jmp sing

         flag2:lea si,  MUS_FREG2

         lea bp,ds:MUS_TIME2 

         jmp sing

         flag1:lea si,  MUS_FREG1

         lea bp,ds:MUS_TIME1 

         jmp sing

         flag4:lea si,  TWOTIGERS_FRE

         lea bp,ds:TWOTIGERS_TIME

          sing:  

         jmp yyo

   start189:jmp start18

   yyo:cmp gnao,1

   je start189

      mov ax,4240H         ;计数初值 = 1000000 / 频率, 保存到AX

    mov dx,0FH

      ; mov di,[si]

    ;div di

    push bx

    mov bx,[si]

    div bx

    pop bx

    mov bx,ax

   

  

    mov dx,280h      

    mov ax,bx

    out dx,al            ;写计数初值低字节

   

    mov al,ah

    out dx,al            ;写计数初值高字节

   

     

    mov dx,28ah

    mov  pcy1,1110b           

    mov al,pcy1

    out dx,al            ;PA1PA0 = 11(开扬声器)

  call delay ;call huaju

    

      mov pcy1,0010b

    mov al,pcy1

    out dx,al            ;PA1PA0 = 00(关扬声器)

     add si,2

     add bp,2

     jmp daty1

     daty:jmp sing1

    daty1:; mov si,changsi

    cmp [si],-1

    je  daty

    jmp sing

    start18:

pop di

pop si

pop ds

pop dx

pop cx

pop bx

pop ax

    ret

 chang endp  

 delay proc near          ;延时子程序

    push cx

    push ax

    push dx

    call huashi

    call jiesudu

         dec pao1

    jz man

  man2:  mov al,pao

    mov dx,2a8h

    out dx,al

    shl al,1

    mov pao,al

    jmp man1

    man:mov pao1,8

    mov pao,1

    jmp man2

    man1:  mov al,sudu

  mov ah,0

  x1: mov cx,[bp]

x2: dec cx

    jnz x2

    push si

   pop si

    dec ax

    jnz x1

    pop dx

    pop ax

    pop cx

    ret

delay endp

shimyn proc near

push ax

push bx

push cx

push dx

push si

mov ax,data

mov ds,ax

pop si

pop dx

pop cx

pop bx

pop ax

ret

shimyn endp

de8 proc near           ;延时子程序

 mov dx,io8255e

mov al,88h ;8255A口输出,C口输出

out dx,al

    push dx

    mov dx,io8255c         ;8253计数器为1方式3

    mov al,36h

    out dx,al

    mov dx,io8255a

    mov ax,10000          ;写入计数器初值10000

    out dx,al

    mov al,ah

    out dx,al

    mov dx,io8255c

    mov al,70h          ;设计数器2为工作方式0

    out dx,al

    mov dx,io8255b

    mov ax,100          ;写入计数器初值500

    out dx,al

    mov al,ah

    out dx,al

       mov dx,28ah

    in  al,dx           ;查询8255PA0是否为高电平

    test al,80h

             

    pop dx

    ret                 ;定时时间到,子程序返回

    de8 endp

      start11 proc near

    push ax

    push bx

   push cx

    push dx

    cmp huacx,639       ;一行是否满

    jne chu

    mov ax,0012h

    int 10h            ;清屏

    mov huacx,0

    mov cx,0              ;cx为横坐标

     chu:

    pop dx

 pop cx

   pop bx

   pop ax

   ret

    start11 endp

huabo proc near

push ax

push bx

push cx

push dx

push si

 mov ax,0012h          ;设屏幕显示方式为VGA 640X480模示

  int 10h

  mov ax,0600h

    int 10h            ;清屏

    and cx,0              ;cx为横坐标

   ; mov clear,2000h

ll:     mov si,offset sin            ;置正弦波数据的偏移地址为SI

    mov num,32 

                ;一组输出32个数据

lll:  mov al,[si]                  ;将数据输出到D/A转换器

    mov dx,io0832a

    out dx,al

 push ax

 mov dx,io0809b           ;启动A/D转换器通道1

    out dx,al

 mov dx,io0809b

    in  al,dx

drawt:  cmp nflag,1

je u700

cmp naozflag,1

je u1000

jmp ppo

u700:call u7

u1000:call chang

ppo:    mov bx,1000h;500            ;延时

delay1t:  

 dec bx

    jnz delay1t

    ;pop bx

       mov ah,0

    mov dx,368           ;dx为纵坐标

    sub dx,ax

    mov al,0ah            ;设置颜色

    mov ah,0ch            ;画点

    int 10h

   

    huat: inc cx                ;继续画点

       push dx

     pop dx

     pop ax

   yut: push cx

  mov cx,01h

   yanshit:call huashi

   loop yanshit

   pop cx

    inc si                       ;取下一个数据

    dec num

    jnz lllp                      ;若未取完32个数据则转lll

    jmp  ll

    lllp:

        jmp lll

    chuchu2:

    pop si

pop dx

pop cx

pop bx

pop ax

 ret

huabo endp

huashi proc near

push ax

push bx

push cx

push dx

push si

push ax

jixux:mov al,sudu

      mov jiji2,al

     pop ax

xianxuehao:

push ax

cmp jihao,79

jg chaog2

jmp cont4

chaog2:mov jihao,0

cont4:mov al,jihao

mov jixuehao,al

pop ax

mov ah,01h

push cx

mov cx,08h

zaixian:

mov bx,offset xuehao

                 cmp jixuehao,79

                jg  chaog

                 jmp cont2

                 chaog:mov jixuehao,0

                cont2:mov al,jixuehao

                 xlat

                  mov    dx,proth

      out    dx,al

     mov    al,ah

     cmp zhuanhuanco,1

     je yellow1

     jmp red1

     yellow1:mov dx,protly

     jmp jzhixing

     red1: mov    dx,protlr

     jzhixing: out    dx,al                       ;显示第一行红

      mov al,0

      out dx,al

       shl    ah,01

      inc jixuehao

     dela2: 

           push ax

      mov ah,06h

      mov dl,0ffh

      int 21h

      jne dushuju1

     kao1: pop ax

      loop zaixian

      pop cx

           call huaxue

            dec jiji2

je youlai

jmp xianxuehao

dushuju1:cmp al,'1'

je di1

cmp al,'2'

je di2

cmp al,'3'

je di3

cmp al,'4'

je di4

jmp kao1

di1:mov changflag,1

call chang

mov changflag,4

jmp kao1

di2:mov changflag,2

call chang

mov changflag,4

jmp kao1

di3:mov changflag,3

call chang

mov changflag,4

jmp kao1

di4:mov changflag,4

call chang

jmp kao1

youlai:

push ax

mov al,sudu

mov jiji2,al

pop ax

inc jihao

chuchu1:

cmp naozflag,1

je chango

cmp nflag,1

je shez

jmp chuchui

shez:mov huacx,0

mov ax,0600h

int 10h

mov ax,0012h

int 10h

call u7

mov ax,0012h

int 10h

jmp chuchui

chango:mov naozflag,0

call chang

chuchui:

call yizhoubo

pop si

pop dx

pop cx

pop bx

pop ax

ret

huashi endp

huaxue proc near

push ax

push bx

push cx

push dx

push si

 cmp msflag,1

je fenz1

push ax

mov al,second

mov second1,al

pop ax

jmp jjh1

fenz1:push ax

mov al,minute

mov second1,al

pop ax

jjh1:mov si,offset led

mov al,second1

mov ah,0

div qiu

mov shi,al

mov bl,ah

mov bh,0

mov dx,io8255f

sub pcy1,01b

mov al,pcy1

out dx,al

mov al,byte ptr [si+bx]

mov dx,io8255d               ;8255A的口输出

out dx,al

call jiesudu

mov al,0

mov dx,io8255d

out dx,al

mov bh,0

mov si,offset led

mov bl,shi

mov dx,io8255f

add pcy1,1

mov al,pcy1

out dx,al

mov al,byte ptr [si+bx]

mov dx,io8255d               ;8255A的口输出

out dx,al

call jiesudu

mov al,0

mov dx,io8255d

out dx,al

pop si

pop dx

pop cx

pop bx

pop ax

ret

huaxue endp

jiesudu proc near

push ax

push bx

push cx

push dx

push si

 mov dx,298h          ;启动A/D转换器通道1

    out dx,al

in al,dx

add al,2

mov sudu,al

pop si

pop dx

pop cx

pop bx

pop ax

ret

jiesudu endp

chushi8253 proc near

  mov dx,io8255e

mov al,88h ;8255A口输出,C口输出

out dx,al

    mov dx,283h     ;8253写控制字

    mov al,76h       ;使1通道为工作方式3

    out dx,al

    mov ax,daiax1   ;写入循环计数初值1000

    mov dx,281h

    out dx,al        ;先写入低字节

    mov al,ah

    out dx,al        ;后写入高字节

    mov dx,283h

    mov al,0b6h       ;8253通道2工作方式3

    out dx,al

    mov ax,daiax2      ;写入循环计数初值1000

    mov dx,282h

    out dx,al        ;先写低字节

    mov al,ah

    out dx,al        ;后写高字节

ret

chushi8253 endp

changbo  proc near

push ax

push bx

push cx

push dx

push ds

push si

push di

 mov ax,data

 mov ds,ax

   ;mov ax,0012h          ;设屏幕显示方式为VGA 640X480模示

  ;int 10h 

    mov dx,28bh

    mov al,88h

    out dx,al

 mov dx,283h          ;设置8253计时器0方式3, 先读写低字节, 再读写高字节

    mov al,00110110B

    out dx,al

         ;显示提示信息

 zhengx:    mov di,offset sin            ;置正弦波数据的偏移地址为SI

       mov num,32

jmp singy

sing1y:

         lea si,  TWOTIGERS_FRE

         lea bp,ds:TWOTIGERS_TIME

  

          singy:

          push si

    mov al,[di]                  ;将数据输出到D/A转换器

    mov dx,io0832a

    out dx,al

    push cx

    mov cx,5

wdelayy:  loop wdelayy                   ;延时

    pop cx

 push ax

 mov dx,io0809b           ;启动A/D转换器通道1

    out dx,al

 mov dx,io0809b

    in  al,dx

     mov bx,1000h;500            ;延时

delay1yy: 

 dec bx

    jnz delay1yy

       mov ah,0

    mov dx,368           ;dx为纵坐标

    sub dx,ax

    mov al,0ah            ;设置颜色

    mov ah,0ch            ;画点

    int 10h

   

   huay: inc cx                ;继续画点

   pop ax

   yuy: push cx

  mov cx,03h

   yanshiy:

      loop yanshiy

   pop cx

    inc di                      ;取下一个数据

    dec num

    jnz yyo1

    mov di,offset sin            ;置正弦波数据的偏移地址为SI

       mov num,32

   jmp yyo1

   start189y:jmp start18y

yyo1:pop si

push ax

push bx

push cx

push dx

   yyoy:cmp gnao,1

   je start189y

    mov ax,4240H         ;计数初值 = 1000000 / 频率, 保存到AX

    mov dx,0FH

    push bx

    mov bx,[si]

    div bx

    pop bx

    mov bx,ax

   

  

    mov dx,280h      

    mov ax,bx

    out dx,al            ;写计数初值低字节

   

    mov al,ah

    out dx,al            ;写计数初值高字节

   

     

    mov dx,28ah

    mov  pcy1,1110b           

    mov al,pcy1

    out dx,al            ;PA1PA0 = 11(开扬声器)

  call delay

  

      mov pcy1,0010b

    mov al,pcy1

    out dx,al            ;PA1PA0 = 00(关扬声器)

     add si,2

     add bp,2

     jmp daty1y

     datyy:pop dx

pop cx

pop bx

pop ax

jmp sing1y

    daty1y:

    cmp [si],-1

    je  datyy

    pop dx

pop cx

pop bx

pop ax

    jmp singy

    start18y:

pop di

pop si

pop ds

pop dx

pop cx

pop bx

pop ax

    ret

 changbo endp  

 yizhoubo proc near

  push ax

push bx

push cx

push dx

push ds

push si

push di

llwo:     mov si, offset sin            ;置正弦波数据的偏移地址为SI

lllwo:

push bx

mov bl, num

 mov al,[si+bx]  

 pop bx               ;将数据输出到D/A转换器

    mov dx,io0832a

    out dx,al

    push ax

 mov dx,io0809b           ;启动A/D转换器通道1

    out dx,al

drawtwo:  push bx

    mov bx,100;500            ;延时

delay1two:  

 dec bx

    jnz delay1two

    pop bx

       mov ah,0

 

  mov cx,huacx      

    mov dx,368           ;dx为纵坐标

    sub dx,ax

    mov al,0ah            ;设置颜色

    mov ah,0ch            ;画点

    int 10h

    inc huacx

 

   call start11

    huatwo:             ;继续画点

    pop ax

       inc num

    cmp num,32

    je chongxie

   cmp num,2

    je chud

  cmp num, 6

   je chud

     cmp num,10

  je chud

    cmp num,14

    je chud

 cmp num,18

    je chud

    cmp num,22

    je chud

    cmp num,26

    je chud

cmp num,30

    je chud

 cmp num,4

    je chud

   cmp num, 8

   je chud

     cmp num,12

  je chud

    cmp num,16

    je chud

 cmp num,20

   je chud

   cmp num,24

    je chud

cmp num,28

    je chud

    jmp lllwo

    chongxie:mov num,0

chud:pop di

pop si

pop ds

pop dx

pop cx

pop bx

pop ax

    ret

yizhoubo endp

code ends

end start

   

相关推荐