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

📄 demo.c

📁 测试stc89C58单片机 测试stc89C58单片机 测试stc89C58单片机DEMO 程序
💻 C
字号:
/*8279键盘和LED显示程序*/
/*此程序响应8279的键盘中断,并根据按键来更新LED显示*/

#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int

sfr AUXR = 0x8e;
#define COM XBYTE [0x0001]         //8279的命令状态口
#define DAT XBYTE [0X0000]         //8279的数据口
#define RAM XBYTE [0X8001]         //8279的RAM地址

/*共阴的七段数码管译码0   1     2    3    4    5    6    7    8   9     a   b    c    d    e   f*/
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                    0x39,0x5e,0x79,0x71};

///////////////////////////////////////////////////////////////////////////////
//按键响应函数
//key0~key7 显示0~7
//skey0~skey7 显示8~f

void key0(void)
{
	//在LED0上显示数字0
	COM=0x80;       //参见8279手册	 ,写显示RAM命令
 	DAT=table[0];   //参见8279手册	 ,把table[0]数据送给数据口DAT
}

void key1(void)
{
 	COM=0x81;
 	DAT=table[1];
}

void key2(void)
{
 	COM=0x82;
 	DAT=table[2];
}

void key3(void)
{
 	COM=0x83;
	DAT=table[3];
}

void key4(void)
{
 	COM=0x84;
 	DAT=table[4];
}

void key5(void)
{
 	COM=0x85;
 	DAT=table[5];
}

void key6(void)
{
 	COM=0x86;
 	DAT=table[6];
}

void key7(void)
{
 	COM=0x87;
 	DAT=table[7];
}

void key8(void)
{
 	COM=0x80;
 	DAT=table[8];
}

void key9(void)
{
 	COM=0x80;
 	DAT=table[9];
}

void key10(void)
{
 	COM=0x80;
 	DAT=table[10];
}

void key11(void)
{
 	COM=0x80;
 	DAT=table[11];
}

void key12(void)
{
 	COM=0x80;
 	DAT=table[12];
}

void key13(void)
{
 	COM=0x80;
 	DAT=table[13];
}

void key14(void)
{
 	COM=0x80;
 	DAT=table[14];
}

void key15(void)
{
 	COM=0x80;
 	DAT=table[15];
}
/*带shift功能按键*/
void skey0(void)
{
 	COM=0x80;
 	DAT=table[8];
}

void skey1(void)
{
 	COM=0x81;
 	DAT=table[9];
}

void skey2(void)
{
 	COM=0x82;
	DAT=table[10];
}

void skey3(void)
{
 	COM=0x83;
 	DAT=table[11];
}

void skey4(void)
{
 	COM=0x84;
 	DAT=table[12];
}

void skey5(void)
{
 	COM=0x85;
 	DAT=table[13];
}

void skey6(void)
{
 	COM=0x86;
 	DAT=table[14];
}

void skey7(void)
{
 	COM=0x87;
 	DAT=table[15];
}

void skey8(void)
{
 	COM=0x87;
 	DAT=table[16];
}

void skey9(void)
{
 	COM=0x81;
 	DAT=table[1];
}

void skey10(void)
{
 	COM=0x81;
 	DAT=table[11];
}

void skey11(void)
{
 	COM=0x81;
 	DAT=table[12];
}

void skey12(void)
{
 	COM=0x81;
 	DAT=table[13];
}

void skey13(void)
{
 	COM=0x81;
	DAT=table[14];
}

void skey14(void)
{
 	COM=0x81;
 	DAT=table[15];
}

void skey15(void)
{
 	COM=0x81;
 	DAT=table[0];
}
///////////////////////////////////////////////////////////////////////////////

//读取键盘数据,返回当前被按下的键号
uchar keyin(void)
{
 	uchar i;
 	COM=0x40; //读FIFO/传感器RAM的命令
	i=DAT;	  //?? DAT原来存的是什么数据???
	i=i&0x7f; //取键盘数据低7位
 	return(i);
}

sbit clflag=ACC^7;
bit int_flag=0; /*中断标志位*/
uchar key_value;/*中断返回键值*/

void main(void)
{
 
 	uchar i,j,k;
	
	//////////////////////////////////////////////////////////////////////////////
	//初始化单片机
	AUXR = 0x02;/*STC单片机关内部RAM和开ALE*/
 	for(i=0;i<5;i++)
 	{
		for(j=0;j<100;j++)
  		{
			for(k=0;k<100;k++);	 		  //延时40ms
		}
	}
									 
	//////////////////////////////////////////////////////////////////////////////
	//初始化8279
 	COM=0xd1;//1101 0001b 清除所有显示
 	do{ACC=COM;}
	while(clflag==1);   //清除起来比较慢,所以一条指令执行的时间不足以完成所有清除,故需等待
 	COM=0x01;COM=0x02;  //??? COM=0x02???
 	IE=0x81;TCON=0x01;  //CPU开中断,外部中断0 开中断;定时器控制 IT0=1 下降延触发方式
 	//////////////////////////////////////////////////////////////////////////////

    //大循环
 	while(1)
 	{  
		while(int_flag==0)  /*等待中断*/
		{
		    //此处可填入后台程序
		}
		
		int_flag=0;

        //根据键值调用键盘响应函数
		switch(key_value)
		{
			case 0x40:key0();break;
			case 0x41:key1();break;
	 		case 0x42:key2();break;
	 		case 0x43:key3();break;
	 		case 0x48:key4();break;
			case 0x49:key5();break;
	 		case 0x4a:key6();break;
		 	case 0x4b:key7();break;
	 		case 0x50:key8();break;
	 		case 0x51:key9();break;
	 		case 0x52:key10();break;
			case 0x53:key11();break;
			case 0x58:key12();break;
	 		case 0x59:key13();break;
	 		case 0x5a:key14();break;
	 		case 0x5b:key15();break;
     
	 		case 0x00:skey0();break;
	 		case 0x01:skey1();break;
	 		case 0x02:skey2();break;
	 		case 0x03:skey3();break;
	 		case 0x08:skey4();break;
	 		case 0x09:skey5();break;
	 		case 0x0a:skey6();break;
	 		case 0x0b:skey7();break;
	 		case 0x10:skey8();break;
	 		case 0x11:skey9();break;
	 		case 0x12:skey10();break;
	 		case 0x13:skey11();break;
	 		case 0x18:skey12();break;
	 		case 0x19:skey13();break;
	 		case 0x1a:skey14();break;
	 		case 0x1b:skey15();break;
	 		default:break;
		}
 	}
}

//INT0的中断服务函数
//INT0由8279在键盘按下时发出
//注意关键字interrupt
/*返回值-函数名-interrupt 对应中断源的编号 当前工作寄存器由PSW中的两位设置,
                                             也可以使用using指定,指定使用,第n组寄存器,n=0~3*/
  void int_int0() interrupt 0 using 0
{
  	//设置标志,告诉主循环中断发生了
  	int_flag=1;
  	//读取键值
	key_value=keyin();
}

⌨️ 快捷键说明

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