1.3参考程序
/*----------------------------------------------- 名称:多位数码管动态扫描显示变化数据 数码管消隐
内容:多位数码管分别显示不同数字,这种扫描显示方式成为动态扫描,并不停变化赋值 当高位值为0是不显示该位,即消隐,如数字 0010,实际显示为10,前2位0不显示
------------------------------------------------*/ #include
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量 void Delay(unsigned int t); //函数声明
void Display(unsigned char FirstBit,unsigned char Num); /*------------------------------------------------ 主函数
------------------------------------------------*/ main() {
unsigned int num; unsigned int j; while(1) { j++;
if(j==10) //检测当前数值显示了一小段时间后,需要显示的数值加1,实现数据显示的变化 { j=0; num++;
if(num==10000)//用于显示0~9999 num=0; }
if(num<1000) //如果小于1000则千位不显示
6
TempData[0]=0; else
TempData[0]=dofly_DuanMa[num/1000];//分解显示信息,如要显示68,则68/10=6 68=8
if(num<100) //如果小于100则千位和百位都不显示 TempData[1]=0; else
TempData[1]=dofly_DuanMa[(num00)/100];
if(num<10) //如果小于10,则千位、百位和十位都不显示 TempData[2]=0; else
TempData[2]=dofly_DuanMa[((num00)0)/10]; TempData[3]=dofly_DuanMa[((num00)0)]; Display(2,4); } }
/*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535
------------------------------------------------*/ void Delay(unsigned int t) {
while(--t); }
/*------------------------------------------------ 显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2 ------------------------------------------------*/ void Display(unsigned char FirstBit,unsigned char Num) {
unsigned char i;
for(i=0;i DataPort=0; //清空数据,防止有交替重影 LATCH1=1; //段锁存 LATCH1=0; DataPort=dofly_WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; 7 DataPort=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0; Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影 } } 按键从右至左输入 2.1项目简介 按键作为一种简单实用的输入设备已经应用于各种单片机应用系统中,可谓是无处不在。但在不同的实用场合下所使用的按键也不尽相同。这里就对几种经常用到的按键及其使用方法进行介绍。 1、传统按键:传统按键是现在在各种电子设备中应用最为广泛的按键,可能它们的形状各有不同,但其控制方法却大同小异,利用按键是否按下的IO电平状态变化来对其进行识别。 2、直接按键:最简单的键盘就是把电平信号直接接到IO上。在程序里面读取IO电平状态,如果读到相应的电平,则说明此IO上所接的按键被按下。这种方法原理与控制方法都非常简单,但造成了IO 资源的浪费。这种按键方式的示意图如下: 8 3、扫描按键矩阵:这种按键输入方式很巧妙地利用了IO资源,使得8个IO可以实现16键键盘。它的示意图如下: 这种按键输入方式比上面的直接按键方式从原理与控制上都比上面的直接按键要复杂。它通过IO的扫描来获取键值,其实扫描过程非常简单,过程如下:KEY1~KEY4对应于IO0~IO3,KEY5~KEY8对应于IO4~IO7。 1.将IO0~IO3置高,将IO4置低,IO5、IO6、IO7置高,读取IO0~IO3。第一列的某个按钮按下后,使相应的两个触点接通,相应行上的IO可以读到低电平。2.将IO0~IO3置高,将IO5置低,IO4、IO6、IO7置高,读取IO0~IO3。第一列的某个按钮按下后,使相应的两个触点接通,相应行上的IO可以读到低电平。3.将IO0~IO3置高,将IO6置低,IO4、IO5、IO7置高,读取IO0~IO3。第一列的某个按钮按下后,使相应的两个触点接通,相应行上的IO可以读到低电平。4.将IO0~IO3置高,将IO7置低,IO4、IO5、IO6置高,读取IO0~IO3。第一列的某个按钮按下后,使相应的两个触点接通,相应行上的IO可以读到低电平。循环此过程可以不断读取按键键值。 在实际的应用中,这个扫描过程通常是放在定时器的中断服务程序中去完成的,通过全局变量将键值返回到其它函数中去。当然,作为学习其扫描过程,也可以将扫描放在主函数中直接来完成。 在上面介绍的按键输入方式中,读者可以看到,IO都是以低电平作为检测电平,那这是为什么呢?这是因为单片机IO读取电平状态的时候,读取低电平比高电平要稳定。也下是因为这一原因外部中断以低电平或下降沿来作为其中断触发条件,以保证中断的可靠性。 识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 9 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。 本项目要求单个独立按键依次输入控制,按键从右至左输入,如计算器输入数据形式相同从右至左。 2.2电路原理图 键盘连接成4×4的矩阵形式,占用单片机P1口的8根线,行信号是P1.0-1.3,列信号是P1.4-1.7。 2.3参考程序 /*----------------------------------------------- 名称:单个独立按键依次输入控制 内容:如计算器输入数据形式相同 从右至左 ------------------------------------------------*/ #include 10 百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库单片机课程设计报告 - 图文(2)在线全文阅读。
相关推荐: