吉林大学微机接口实验代码(九)

/*
 * Exp_9: 8254
 * author: liu abin
 * all right reserved
 **/
#include "conio.h"
typedef unsigned char u8;
typedef unsigned int u16;

u8 number[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; // 0~f; 16 for none
u8 table[] = {0x00,0x01,0x02,0x04,0x08,0x10,0x20};  // 1~6
u8 block[] = {16,16,16,16,16,16};
u16 M8255_SET = 0x0606;
u16 M8255_A = 0x0600;
u16 M8255_B = 0x0602;
u16 M8255_C = 0x0604;
void delay(u16 time);
u8 getCode(void);
void frametime(void);
void display(u8 port, u8 num);
void converCode(void);
void addNum(u8 num);

u8 cmd_8255 = 0x89; //10001001

u8 code = 0;
u8 colmask[] = {0x0f,0x0e,0x0d,0x0b,0x07,0x0f,0x0f};  // 1...4 cols  5.6for display
u8 colindex = 0;
u8 pivot  = 6;
u8 direct = -1;

void main() {
	outportb(M8255_SET,cmd_8255);
	while(1) {
		while(getCode() == 0) {
			//displayBlock();	
		}
		converCode();
		addNum(code);
		while(getCode() == 1)
		;  // 
		//outportb(M8255_B,code);
	}
}

void delay(u16 time) {
	int i = 0,j=0;
	for(;i<time;i++) {
		for(;j<10000;j++)
			;
	}
}

u8 getCode() {
	u8 temp = 0x0f;
	u8 i = 1;
	code = 0x0f;
	colindex = 0;
	for(;i<=6;i++) {
		outportb(M8255_A,~table[i]);
		code = inportb(M8255_C);
		//display cccccccccccccccccccccccccccccccccccccccccccc
		outportb(M8255_B,number[block[i-1]]);
		frametime();
		if(code != 0x0f) {
			temp = code;
			colindex = i;
		}	
	}
	if(temp != 0x0f) {
		code = temp;
		code = (~code) & 0x0f;
		return 1;
	}
	return 0;  // no input
}

void frametime() {
	int j = 0;
	for(;j<1000;j++)
	;
}

void display(u8 port, u8 num) {
	outportb(M8255_B, number[num]);
	outportb(M8255_A, ~table[port]);
	frametime();
}

void converCode() {
	if(code == 0x01)
		code = 0;
	else if(code == 0x02)
		code = 4;
	else if(code == 0x04)
		code = 8;
	else
		code = 0x0c;
	code += colindex;
	code--;
}

void addNum(u8 num) {
	if(num == 0x0f) {
		display(0,15);
		__asm{
			MOV AX,4CH
			INT 21H
		}
	}	
	// block[0] = block[1];
	// block[1] = block[2];
	// block[2] = block[3];
	// block[3] = block[4];
	// block[4] = block[5];
	// block[5] = num;
	block[5] = block[4] = block[3] = block[2] = block[1] = block[0] = 16;
	block[pivot-1] = num;
	pivot += direct;
	if(pivot == 0) {
		pivot = 1;
		direct = 1;
	}
	else if(pivot == 7) {
		pivot = 6;
		direct = -1;
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我无法为您提供完整的微型计算机实验代码。但我可以给您提供一些关于数据传送的微型计算机实验1的基本知识。 数据传送指的是将数据从一个地方传送到另一个地方。在微型计算机中,数据传送分为两种类型:内部数据传送和外部数据传送。 内部数据传送是指数据在微处理器内部传送,例如从寄存器到寄存器或从寄存器到内存。外部数据传送是指数据在微处理器和外部设备(如输入/输出设备、存储器等)之间传送。 在微型计算机实验1中,您需要了解以下内容: 1. 内部数据传送的指令和操作码 2. 外部数据传送的指令和操作码 3. 内存地址的编码方法 4. 数据传送的实现方法 在数据传送实验中,您需要编写程序来实现将数据从一个位置传送到另一个位置。此外,您还需要使用微型计算机实验箱中的设备(如键盘、显示器等)来进行输入和输出。 下面是一个简单的数据传送实验示例代码: ``` ORG 100H ;程序起始地址 MOV AX, 1234H ;将数据1234H存放到AX寄存器中 MOV BX, AX ;将AX寄存器中的数据传送到BX寄存器中 MOV CX, 5678H ;将数据5678H存放到CX寄存器中 MOV [1000H], CX ;将CX寄存器中的数据传送到内存地址1000H中 MOV DX, [2000H] ;将内存地址2000H中的数据传送到DX寄存器中 HLT ;程序结束 ``` 在上面的示例代码中,我们使用了MOV指令来实现数据传送。MOV指令用于将数据从一个位置传送到另一个位置。在这个例子中,我们将数据存放到寄存器和内存中,并将数据从内存中传送到寄存器中。 在编写完代码后,您需要使用微型计算机实验箱来进行编译和运行。在运行程序时,您需要在键盘上输入数据,并在显示器上查看输出结果。 希望这些信息对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值