⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 KeilC开发,51通过8255对外部4*4键盘进行控制.按键分别为0-9以及上下左右,加上确认取消.
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#include <8255A.h>
#include <intrins.h>
#include <keyboard.h>
#define ADDR_LED XBYTE[0X4000]
/*////////////////////////////*/
/*/			常量定义         /*/
/*////////////////////////////*/

/* 定时器初值 */
#define V_T1   0xfd   /*SCOM  9600 baud,  ! notice: crystal 11.0592MHz */
#define V_TH0   0xee  /*   ~ 5ms ,  ! notice: crystal 11.0592MHz */
#define V_TL0   0x00

/* 1s软件定时器溢出值,200个5ms */
#define V_T1s	200

/* 数码管段驱动寄存器地址 */
#define ADDR_8SEG	XBYTE[0x2000]

/* 数码管位驱动和指示灯驱动寄存器地址 */
#define ADDR_SEL	XBYTE[0x4000]

/* 按键 */
sbit KEY1=	P1^0;	/*P1^0等同p1.0管脚*/
sbit KEY2=	P1^1;
sbit KEY3=	P1^2;
sbit KEY4=	P1^3;


/*////////////////////////////*/
/*/			变量定义         /*/
/*////////////////////////////*/

/* 1s软件定时器计数 */
unsigned char clock1s,k=0,key;
/* 1s软件定时器溢出标志,位变量 */
bit clock1s_flag;

/* 数码管位驱动和指示灯驱动信号输出缓存,定义了一个可位寻址的变量 */
unsigned char bdata output_sel;
	sbit led_1 = output_sel^5;
	sbit led_2 = output_sel^6;
	sbit led_3 = output_sel^7;
	sbit led_4 = output_sel^4;

/* 数码管扫描驱动指针,(为测试外部存储器(U3 6264),特使用xdata类型) */
unsigned char data digi_scaner;

/* 测试用计数器,(为测试外部存储器(U3 6264),特使用xdata类型) */
unsigned int data test_counter;
/* 扫描字符,(为测试外部存储器(U3 6264),特使用xdata类型) */
unsigned char data digi[4];

//
char n=0,key_flag=0;

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

void Delay()
{
	Uchar i=0;
	for(i=0;i<=100;i++);
}

unsigned char CHARTOSEG7(unsigned char DATA)
{
	unsigned char AA;
	switch (DATA)
	{
		case  'H': AA=0x89;break; /* 'H'*/
	    case  'E': AA=0x86;break; /* 'E'*/
    	case  'L': AA=0xc7;break; /* 'L'*/
    	case  'O': AA=0xc0;break; /*字符'O'*/
    	case  'U': AA=0x41;break; /* 'U.'*/
    	case  'J': AA=0xf1;break; /* 'W'的后半部*/
    	case  'o': AA=0xa3;break; /* 'o'*/
    	case  'r': AA=0xaf;break; /* 'r'*/
    	case  'l': AA=0xf9;break; /* 'l'*/
    	case  'd': AA=0xa1;break; /* 'd'*/
    	case  0: AA=0xc0;break; /* ‘0’*/
    	case  1: AA=0xf9;break; /* ‘1’*/
    	case  2: AA=0xa4;break; /* ‘2’*/
    	case  3: AA=0xb0;break; /* ‘3’*/
    	case  4: AA=0x99;break; /* ‘4’*/
    	case  5: AA=0x92;break; /* ‘5’*/
    	case  6: AA=0x82;break; /* ‘6’*/
    	case  7: AA=0xf8;break; /* ‘7’*/
    	case  8: AA=0x80;break; /* ‘8’*/
    	case  9: AA=0x90;break; /* ‘9’*/
    	case 10: AA=0x88;break; /* ‘A’*/
    	case 11: AA=0x83;break; /* ‘B’*/
    	case 12: AA=0xc6;break; /* ‘C’*/
    	case 13: AA=0xa1;break; /* ‘D’*/
    	case 14: AA=0x86;break; /* ‘E’*/
    	case 15: AA=0x8e;break; /* ‘F’*/
    	case '-':AA=0xdf;break; /* 破折号*/
    	case '_':AA=0xf7;break; /* 下划线*/
    	case ' ':AA=0xff;break; /* 消隐  */
    	default: AA=0xff;
	}
	return(AA);
}



timer0() interrupt 1 using 0         
{

	EA=0;  /*关中断*/   /*EA: enable all*/

	/* 重新对计数器赋初值,并启动定时计数 */
	TH0=V_TH0;
    TL0=V_TL0;
    TR0=1;

	/* 1秒钟软定时器计数 */
	if (++clock1s>=V_T1s)
	{
		clock1s_flag = ~clock1s_flag; /*当1秒到时,溢出标志置1 */
		clock1s = 0;
	}


	output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/

	/* 检测到按键被按下(0)时,相应的指示灯亮(0) */
	if (KEY1==0) {led_1 = 0;k=1;}
		else if (k==1) {key=1;k=0;}
	if (KEY2==0) {led_2 = 0;k=2;}
		else if (k==2) {key=2;k=0;}
	if (KEY3==0) {led_3 = 0;k=3;}
		else if (k==3) {key=3;k=0;}
	if (KEY4==0) {led_4 = 0;k=4;}
		else if (k==4) {key=4;k=0;}

	/* 数码管扫描驱动指针值从1到4重复变换,每5ms间隔对一个数码管进行驱动,20ms一个轮回 */
	if (++digi_scaner>=5) digi_scaner = 1;
	switch (digi_scaner)
	{
		case 1: /* 驱动第一个数码管 */
				output_sel |= 0x01;
				ADDR_8SEG = CHARTOSEG7(digi[0]);			 /*输出到锁存器U5(在电路图中找)*/
				break;

		case 2: /* 驱动第二个数码管 */
				output_sel |= 0x02;
				ADDR_8SEG = CHARTOSEG7(digi[1]); /*输出到锁存器U5*/
				break;

		case 3: /* 驱动第三个数码管 */
				output_sel |= 0x04;
				ADDR_8SEG = CHARTOSEG7(digi[2]); /*输出到锁存器U5*/
				break;

		case 4: /* 驱动第四个数码管 */
				output_sel |= 0x08;
				ADDR_8SEG = CHARTOSEG7(digi[3]); /*输出到锁存器U5*/
				break;
	}


	ADDR_SEL = output_sel;     	/*输出到锁存器U6(在电路图中找)*/

	EA=1;  /*开中断*/
}


void SerialInit()
{
	/* 单片机系统初始化 */
    P1=0XFF;
    P3=0XFF;
    /** 中断工作寄存器初始化 **/
    IE=0X80;
    IP=0;
    IT0=0;
    IT1=0;
    /** 定时器工作寄存器初始化 **/
	TMOD=0X21;
	TH1=V_T1;
    TL1=V_T1;
    TH0=V_TH0;
    TL0=V_TL0; 
    /** 串行通信口工作初始化 **/
	SM0=0;		 /*SCOM MODE 1 (8BIT UART VARBR)*/
    SM1=1;
	SM2=0;
	REN=1;
	TI=1;
	/** 全局变量赋初值 **/
	clock1s=0;
	clock1s_flag=0;
	digi_scaner=1;

	/** 开定时器,定时器0中断允许 **/
    TR0=1;
    TR1=1;
	ET0=1;
	output_sel = 0xf0; /*初值,令数码管驱动位无效,指示灯全灭*/

}


void main()
{
	int temp;
	SerialInit();
	
	EA=0;
	Init8255A();
	printf("init\n");
	EA=1;

	EA=0;
	SelectForm0(0,0,0,1);
	
//	while(1)
	{
//		PortA=0xff-0x80;
//		temp=0;
//		while(temp==0)
		{
//			temp=getrow();
		}
//		while(temp!=0)
		{
//			temp=getrow();
		}
//		printf("%d\n",temp);
	}

	while (1)
	{
//		if (clock1s_flag) {clock1s_flag=1;printf("%x,%x\n",col,row);}
		/*if (key_flag)   
		{
			EA=0;
			putchar(col+0x30);
			putchar(0x20);
			putchar(row+0x30);
			putchar(13);putchar(10);
			key_flag=0;
			printf()
			EA=1;
		}*/
		EA=0;
		temp=GetKey();
		printf("%d\n",temp) ;
		EA=1;
		digi[0]=temp%10;
		digi[1]=temp/10;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -