山东大学单片机硬件实验–4.7 7279 键盘/动态LED 显示实验

一、实验题目:

4.7 7279键盘扫描及动态LED显示实验

二、实验要求:

       利用7279进行键盘扫描及动态LED数码管的显示控制。

三、实验源程序


#define rl 0xa1  //定义rl为左移指令
#define dcode1 0xc8 //定义 dcode1为译码方式1指令
#define read 0x15 //定义read为读键盘指令
void delay48ms();
void delay8ms();
void write7279(uchar,uchar);   
uchar read7279(uchar);
void sendbyte(uchar); 
uchar  receivebyte();//函数声明
uchar keyma[]={ 0x1b,0x13,0x0b,0x03,0x1a,0x12,0x0a,0x02,0x19,
				0x11,0x09,0x01,0x18,0x10,0x08,0x00};//定义数组存放按键的键码
sbit cs=P1^0;
sbit clk=P1^1;
sbit dio=P1^2;
sbit key=P1^3;//定义控制端口
/********************************************************
                         主程序
********************************************************/
void main()
{ uchar anjian ,i,num;
	sendbyte(0xa4);//7279复位
	while(1)
	{
		if(key==0)//如果有按键按下
		{ 
			sendbyte(0x15);//读键盘键值
			anjian =receivebyte();//将接受到的按键键码赋给anjian变量
			for (i=0;i<16;i++)//通过循环找到按键的具体位置
			{
				if(anjian==keyma[i]);
				{
					num=i;
					break;
				}
			}
			sendbyte(0xa1);//使数码管左移一位
			write7279(0xc8,num);//采用方式1译码,将要显示的数显示在数码管上
			while(key==0);//直到按键停止,再返回重新检测按键
		}
	}
}
/********************************************************
                        7279写函数
********************************************************/
void write7279(uchar cmd,uchar dta)
{  
	sendbyte(cmd);//使7279工作在下载数据并按方式1译码,同时选中数码管1
  	sendbyte(dta);//向7279写入按键所要显示的数字
}
/********************************************************
                        7279读函数
********************************************************/
uchar read7279(uchar command)
{
	sendbyte(command);//向7279发送读键盘数据指令
	return(receivebyte());//将读到的按键键码返会
}
/********************************************************
					  发送字节数据函数
********************************************************/
void sendbyte (uchar outbyte)
{
	uchar i;
	cs=0;//选通7279
	delay48ms();//延时
	for(i=0;i<8;i++)//分8次移入数据
	{ 
		if(outbyte & 0x80)//取最高位
		dio=1;
		else  dio=0;
		clk=1;//时钟上升沿读入数据
		delay8ms();//短延时,使时钟为低电平
		clk=0;
		delay8ms();//短延时
		outbyte=outbyte*2;//数据左移一位方便发送次高位
	}
	dio=0;//防止从p1口读入数据
}
/********************************************************
					  接受按键数据
********************************************************/
uchar receivebyte()
{
	uchar i;
	uchar inbyte=0;
	dio=1;//从p1.2读入数据
	delay48ms();//延时
	for(i=0;i<8;i++)//分8次读入数据,高位在前
	{
		cs=0;
		clk=1;//时钟有效
		delay8ms();//延迟
		inbyte=inbyte*2;//数据左移
		if(dio)
		{inbyte=inbyte|0x01;}
		delay8ms();
	}
	dio=0;
	return(inbyte);
}
/********************************************************
                       长延时
********************************************************/
void delay48ms()
{
	uchar i;
	for(i=0;i<0x30;i++);
}
/********************************************************
                       短延时
********************************************************/
void delay8ms()
{ 
	uchar i;
	for(i=0; i<8;i++);
}

© 版权声明
THE END
喜欢就支持以下吧
点赞3赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容