数码管动态显示的三种实验.docx

上传人:b****6 文档编号:7095566 上传时间:2023-01-17 格式:DOCX 页数:15 大小:17.76KB
下载 相关 举报
数码管动态显示的三种实验.docx_第1页
第1页 / 共15页
数码管动态显示的三种实验.docx_第2页
第2页 / 共15页
数码管动态显示的三种实验.docx_第3页
第3页 / 共15页
数码管动态显示的三种实验.docx_第4页
第4页 / 共15页
数码管动态显示的三种实验.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数码管动态显示的三种实验.docx

《数码管动态显示的三种实验.docx》由会员分享,可在线阅读,更多相关《数码管动态显示的三种实验.docx(15页珍藏版)》请在冰豆网上搜索。

数码管动态显示的三种实验.docx

数码管动态显示的三种实验

/*******************************************************************************

*实验名:

动态显示数码管实验

*使用的IO:

数码管使用P0,P2.2,P2.3,P2.4键盘使用P1

*实验效果:

按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

*注意:

*******************************************************************************/

#include

//#include

#defineGPIO_DIGP0

#defineGPIO_KEYP1

sbitLSA=P2^2;

sbitLSB=P2^3;

sbitLSC=P2^4;

unsignedcharcodeDIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsignedcharKeyValue;

//用来存放读取到的键值

unsignedcharKeyState;//记录按键的状态,0没有,1有

unsignedcharDisplayData[8];

//用来存放要显示的8位数的值

unsignedcharNum;//用来存放中断的时候显示的第位数值

voidDelay50us();//延时50us

voidKeyDown();//检测按键函数

voidDigDisplay();//动态显示函数

voidTimerConfiguration();//定时器初始化设置

/*******************************************************************************

*函数名:

main

*函数功能:

主函数

*输入:

*输出:

*******************************************************************************/

voidmain(void)

{

TimerConfiguration();

KeyState=0;//初始化按键状态

while

(1)

{

KeyDown();

if(KeyState==1)

{

DisplayData[7]=DisplayData[6];

DisplayData[6]=DisplayData[5];

DisplayData[5]=DisplayData[4];

DisplayData[4]=DisplayData[3];

DisplayData[3]=DisplayData[2];

DisplayData[2]=DisplayData[1];

DisplayData[1]=DisplayData[0];

DisplayData[0]=DIG_CODE[KeyValue];

KeyState=0;

}

//DigDisplay();

}

}

/*******************************************************************************

*函数名:

TimerConfiguration

*函数功能:

定时器初始化

*输入:

*输出:

*******************************************************************************/

voidTimerConfiguration()

{

TMOD=0X02;//选择为定时器0模式,工作方式2,仅用TRX打开启动。

TH0=0X9C;//给定时器赋初值,定时100us

TL0=0X9C;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器

}

/*******************************************************************************

*函数名:

DigDisplay

*函数功能:

使用数码管显示

*输入:

*输出:

*******************************************************************************/

voidDigDisplay()

{

unsignedchari,j;

//for(i=0;i<8;i++)

//{

GPIO_DIG=0x00;//消隐

switch(i)//位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0;break;

case

(1):

LSA=1;LSB=0;LSC=0;break;

case

(2):

LSA=0;LSB=1;LSC=0;break;

case(3):

LSA=1;LSB=1;LSC=0;break;

case(4):

LSA=0;LSB=0;LSC=1;break;

case(5):

LSA=1;LSB=0;LSC=1;break;

case(6):

LSA=0;LSB=1;LSC=1;break;

case(7):

LSA=1;LSB=1;LSC=1;break;

}

GPIO_DIG=DisplayData[i];

i++;

if(i>7)

i=0;

//j=10;//扫描间隔时间设定

//while(j--)

//Delay50us();

//GPIO_DIG=0x00;//消隐

//}

}

/*******************************************************************************

*函数名:

KeyDown

*函数功能:

检测有按键按下并读取键值

*输入:

*输出:

*******************************************************************************/

voidKeyDown(void)

{

unsignedinta=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!

=0x0f)

{

Delay50us();

a++;

a=0;

if(GPIO_KEY!

=0x0f)

{

ET0=0;//关定时器中断

KeyState=1;//有按键按下

//测试列

GPIO_KEY=0X0F;

//Delay50us();

switch(GPIO_KEY)

{

case(0X07):

KeyValue=0;break;

case(0X0b):

KeyValue=1;break;

case(0X0d):

KeyValue=2;break;

case(0X0e):

KeyValue=3;break;

//default:

KeyValue=17;//检测出错回复17意思是把数码管全灭掉。

}

//测试行

GPIO_KEY=0XF0;

Delay50us();

switch(GPIO_KEY)

{

case(0X70):

KeyValue=KeyValue;break;

case(0Xb0):

KeyValue=KeyValue+4;break;

case(0Xd0):

KeyValue=KeyValue+8;break;

case(0Xe0):

KeyValue=KeyValue+12;break;

//default:

KeyValue=17;

}

ET0=1;//开定时器中断

while((a<5000)&&(GPIO_KEY!

=0xf0))//检测按键松手检测

{

Delay50us();

a++;

}

a=0;

}

}

}

/*******************************************************************************

*函数名:

Delay50us

*函数功能:

延时函数,延时50us

*输入:

*输出:

*******************************************************************************/

voidDelay50us(void)//延时50us误差0us

{

unsignedchara,b;

for(b=1;b>0;b--)

for(a=22;a>0;a--);

}

/*******************************************************************************

*函数名:

Delay50us

*函数功能:

延时函数,延时50us

*输入:

*输出:

*******************************************************************************/

voidTimer()interrupt1

{

DigDisplay();

}

/*******************************************************************************

*实验名:

动态显示数码管实验

*使用的IO:

数码管使用P0,P2.2,P2.3,P2.4

*实验效果:

数码管显示76543210。

*注意:

*******************************************************************************/

#include

#defineGPIO_DIGP0

sbitLSA=P2^2;

sbitLSB=P2^3;

sbitLSC=P2^4;

unsignedcharcodeDIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsignedcharDisplayData[8];

//用来存放要显示的8位数的值

voidDigDisplay();//动态显示函数

/*******************************************************************************

*函数名:

main

*函数功能:

主函数

*输入:

*输出:

*******************************************************************************/

voidmain(void)

{

unsignedchari;

for(i=0;i<8;i++)

{

DisplayData[i]=DIG_CODE[i];

}

while

(1)

{

DigDisplay();

}

}

/*******************************************************************************

*函数名:

DigDisplay

*函数功能:

使用数码管显示

*输入:

*输出:

*******************************************************************************/

voidDigDisplay()

{

unsignedchari;

unsignedintj;

for(i=0;i<8;i++)

{

switch(i)//位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0;break;//显示第0位

case

(1):

LSA=1;LSB=0;LSC=0;break;//显示第1位

case

(2):

LSA=0;LSB=1;LSC=0;break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0;break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1;break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1;break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1;break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1;break;//显示第7位

}

GPIO_DIG=DisplayData[i];//发送段码

j=10;//扫描间隔时间设定

while(j--);

GPIO_DIG=0x00;//消隐

}

}

/*******************************************************************************

*实验名:

动态显示数码管实验

*使用的IO:

数码管使用P0,P2.2,P2.3,P2.4键盘使用P1

*实验效果:

按矩阵键盘分别显示在数码管上面显示十六进制的0到F。

*注意:

*******************************************************************************/

#include

#defineGPIO_DIGP0

#defineGPIO_KEYP1

sbitLSA=P2^2;

sbitLSB=P2^3;

sbitLSC=P2^4;

unsignedcharcodeDIG_CODE[17]={

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码

unsignedcharKeyValue;

//用来存放读取到的键值

unsignedcharKeyState;//记录按键的状态,0没有,1有

unsignedcharDisplayData[8];

//用来存放要显示的8位数的值

voidDelay10ms();//延时10ms

voidKeyDown();//检测按键函数

voidDigDisplay();//动态显示函数

/*******************************************************************************

*函数名:

main

*函数功能:

主函数

*输入:

*输出:

*******************************************************************************/

voidmain(void)

{

KeyState=0;

while

(1)

{

KeyDown();

if(KeyState==1)

{

DisplayData[7]=DisplayData[6];

DisplayData[6]=DisplayData[5];

DisplayData[5]=DisplayData[4];

DisplayData[4]=DisplayData[3];

DisplayData[3]=DisplayData[2];

DisplayData[2]=DisplayData[1];

DisplayData[1]=DisplayData[0];

DisplayData[0]=DIG_CODE[KeyValue];

KeyState=0;

}

DigDisplay();

}

}

/*******************************************************************************

*函数名:

DigDisplay

*函数功能:

使用数码管显示

*输入:

*输出:

*******************************************************************************/

voidDigDisplay()

{

unsignedchari;

unsignedintj;

for(i=0;i<8;i++)

{

switch(i)//位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0;break;//显示第0位

case

(1):

LSA=1;LSB=0;LSC=0;break;//显示第1位

case

(2):

LSA=0;LSB=1;LSC=0;break;//显示第2位

case(3):

LSA=1;LSB=1;LSC=0;break;//显示第3位

case(4):

LSA=0;LSB=0;LSC=1;break;//显示第4位

case(5):

LSA=1;LSB=0;LSC=1;break;//显示第5位

case(6):

LSA=0;LSB=1;LSC=1;break;//显示第6位

case(7):

LSA=1;LSB=1;LSC=1;break;//显示第7位

}

GPIO_DIG=DisplayData[i];//发送段码

j=10;//扫描间隔时间设定

while(j--);

GPIO_DIG=0x00;//消隐

}

}

/*******************************************************************************

*函数名:

KeyDown

*函数功能:

检测有按键按下并读取键值

*输入:

*输出:

*******************************************************************************/

voidKeyDown(void)

{

unsignedinta=0;

GPIO_KEY=0x0f;

if(GPIO_KEY!

=0x0f)

{

Delay10ms();

a++;

a=0;

if(GPIO_KEY!

=0x0f)

{

KeyState=1;//有按键按下

//测试列

GPIO_KEY=0X0F;

//Delay10ms();

switch(GPIO_KEY)

{

case(0X07):

KeyValue=0;break;

case(0X0b):

KeyValue=1;break;

case(0X0d):

KeyValue=2;break;

case(0X0e):

KeyValue=3;break;

//default:

KeyValue=17;//检测出错回复17意思是把数码管全灭掉。

}

//测试行

GPIO_KEY=0XF0;

Delay10ms();

switch(GPIO_KEY)

{

case(0X70):

KeyValue=KeyValue;break;

case(0Xb0):

KeyValue=KeyValue+4;break;

case(0Xd0):

KeyValue=KeyValue+8;break;

case(0Xe0):

KeyValue=KeyValue+12;break;

//default:

KeyValue=17;

}

while((a<500)&&(GPIO_KEY!

=0xf0))//按键松手检测

{

Delay10ms();

a++;

}

a=0;

}

}

}

/*******************************************************************************

*函数名:

Delay10ms

*函数功能:

延时函数,延时10ms

*输入:

*输出:

*******************************************************************************/

voidDelay10ms(void)//误差0us

{

unsignedchara,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1