一、实验题目:
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
暂无评论内容