嵌入式系统原理与设计 课件 第九讲 外设_第1页
嵌入式系统原理与设计 课件 第九讲 外设_第2页
嵌入式系统原理与设计 课件 第九讲 外设_第3页
嵌入式系统原理与设计 课件 第九讲 外设_第4页
嵌入式系统原理与设计 课件 第九讲 外设_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1单片机与嵌入式系统第九讲本次课主要内容第二章单片机原理(七)2常见单片机外设应用初步!单片机原理(七)1.本次课的目标2.七段数码管及其应用3.按键及其应用4.实验配套开发板的基本使用5.小结31.本次课的目标熟悉常见的单片机外设,能熟练对数码管、矩阵键盘进行编程应用。熟悉实验板,完成基本应用程序开发。42.七段数码管及其应用2.1七段数码管2.2七段数码管静态显示方式2.3七段数码管静态显示硬件连接图2.4七段数码管动态显示方式2.5七段数码管动态显示硬件连接图52.1七段数码管简介有共阴极和共阳极两种6按照:dp,g,f,e,d,c,b,a的顺序,对于共阴极,某位等于1时候亮,例如:显示1,值为:00000110B(06H)问题:对于共阴极七段数码管,如果要显示A,

dp,g,f,e,d,c,b,a的值应为多少?答案:77H问题:对于共阳极七段数码管,如果要显示A,

dp,g,f,e,d,c,b,a的值应为多少?答案:88H7按照:dp,g,f,e,d,c,b,a的顺序问题:共阴极和共阳极显示同一字符的编码,有什么联系?答案:互为逐位取反的关系。8按照:dp,g,f,e,d,c,b,a的顺序9显示字符012345678共阴极段选码3F065B4F666D7D077F共阳极段选码C0F9A4B0999282F880显示字符9ABCDEF-熄灭共阴极段选码6F777C395E79714000共阳极段选码908883C6A1868EBFFF在此表基础上,定义数组unsignedcharDisp1[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表在此表基础上,定义数组unsignedcharDisp2[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极译码表Disp1和Disp2有什么关系?互为逐位取反如何将要显示的字符转换为控制数码管的编码?(译码方式)

(1)软件译码:利用查表法,将段码作成一个表,以字符值为索引,可查出不同字符的相应段码。

(2)硬件译码:用专用译码器电路,将待显示的字符转换为段码。10(1)软件译码:利用查表法,将段码作成一个表,以字符值为索引,可查出不同字符的相应段码。unsignedcharDisp1[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极译码表unsignedcharDisp2[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表11使用软件译码的方式,由单片机直接驱动数码管,对于共阴极数码管,应如何连接?数码管公共端如何处理?共阴极公共端应接地。码段控制如何连接?直接连接到单片机并行口,为提高驱动能力,可添加上拉电阻。12硬件连接图:13实验:要使数码管轮流显示0~F,如何设计程序?14演示:Project1根据下表,定义数组变量15显示字符012345678共阴极段选码3F065B4F666D7D077F显示字符9ABCDEF-熄灭共阴极段选码6F777C395E79714000unsignedcharDisp[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表问题:

若P0=Disp[7];(

按dp,g,f,e,d,c,b,a顺序

)则共阴极数码管会显示什么内容

?16unsignedcharDisp[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表显示数字“7”轮流显示0~F,主程序如何编写?unsignedchari=0;while(1) { P0=Disp[i]; DdelayX1ms(500);

i=(i+1)%16; }17#include<AT89X51.H>unsignedcharDisp[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表voidDdelayX1ms(unsignedintx);voidmain(){ unsignedchari=0;

P0=0x00;//初始熄灭所有段位 while(1) { P0=Disp[i]; DdelayX1ms(500);

i=(i+1)%16; }}18演示:Project1voidDdelayX1ms(unsignedintcount)//延时多少ms{unsignedint

i,j;for(i=0;i<count;i++) for(j=0;j<120;j++) ;}19在刚刚实验基础上添加一个共阳极的数码管,两只数码管同步循环显示0~F。应如何处理?共阳极数码管公共端如何处理?接VCC使用同一译码表,如何处理?逐位取反20电路图21演示:Project2voidmain(){ unsignedchari=0;

while(1) { P0=Disp[i];

P3=~Disp[i]; DdelayX1ms(500);

i=(i+1)%16; }}22演示:Project2思考:使用软件译码的方式驱动数码管的特点控制稍复杂占用较多的管脚资源23(2)硬件译码:Binary-CodedDecimal‎(BCD码)BCD译码器件驱动数码管451174LS472425LT(Lamptest)显示测试:所有段均亮BI(blanking)显示空白4511芯片简介LE(latchenable)锁存使能使用4511芯片驱动哪种类型的数码管?为什么?从真值表可以看出,为1时点亮对应的码段共阴极数码管26使用4511芯片驱动数码管,硬件如何连接LT(Lamptest)显示测试如何连接?接VCCBI(blanking)显示空白如何连接?接VCCLE(latchenable)锁存使能如何连接?接GND27使用4511芯片驱动数码管,硬件如何连接ABCD如何连接?连接产生十进制BCD编码的并行口a~g如何连接?直接连接七段数码管共阴极数码管公共端如何连接?共阴极数码管公共端接地2829要使数码管轮流显示0~9,如何设计程序?30演示:Project10#include<AT89X51.H>voidDdelayX1ms(unsignedintx);voidmain(){ unsignedchari=0; while(1) { P0=i; DdelayX1ms(500);

i=(i+1)%10; }}voidDdelayX1ms(unsignedintcount){ unsignedint

i,j; for(i=0;i<count;i++) for(j=0;j<120;j++);}313274LS47芯片简介LT(Lamptest)显示测试BI(blanking)显示空白RBI(RippleBlankinput)RBO(RippleBlankoutput)使用74LS47芯片驱动哪种类型的数码管?为什么?从真值表可以看出,为0时点亮对应的码段共阳极数码管3334演示:Project11#include<AT89X51.H>voidDdelayX1ms(unsignedintx);voidmain(){ unsignedchari=0; while(1) { P0=i; DdelayX1ms(500);

i=(i+1)%10; }}voidDdelayX1ms(unsignedintcount){ unsignedint

i,j; for(i=0;i<count;i++) for(j=0;j<120;j++) ;}35程序与4511译码一样!思考:使用4511和74LS47对数码管译码驱动时,有什么区别和联系?36区别:所驱动的数码管类型不同。74LS47具有RippleOutput功能。

联系:软件编程相似。思考:使用BCD译码器的方式驱动数码管的特点控制简单节省管脚资源372.2七段数码管静态显示方式显示某个字符时,七段数码管相应的段恒定地导通或截止。若为共阴极,各位的公共端接地;若为共阳极,则公共端接+5V电源。382.3七段数码管静态显示硬件连接图39数码管静态显示电路中,一个数码管需要多少IO?占用4个或8个IO按此方式,如果需要两个数码管显示怎么办?占用8个或16个IO按此方式,如果需要八个数码管显示怎么办?单片机IO不够用???40解决之道:数码管的动态显示(所有数码管共用信号线,但控制线独立)2.4七段数码管动态显示方式在多位LED显示时将所有位的段选线并联在一起,由一个8位I/O口控制。每个数码管共阴(或共阳)极公共端分别由相应的独立的I/O线控制,实现各位的分时选通。412.5七段数码管动态显示硬件连接图42I/O口1和I/O口2轮流送入段选码、位选码。unsignedcharDisp[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表思考:如果上述数码管均为共阴极,IO1输出0x6D,IO2输出0xFC,则上述数码管会显示什么?最后两个数码管会显示字符‘5’,其他数码管不亮。43思考:如果上述数码管均为共阴极,如果要最后一个数码管显示‘0’,应怎么办?IO1输出0x3F,IO2输出0xFE。44unsignedcharDisp[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表思考:如果上述数码管均为共阴极,如果要倒数第二个数码管显示‘1’,怎么办?IO1输出0x06,IO2输出0xFD。45unsignedcharDisp[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表unsignedcharDisp[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极译码表思考:如果上述数码管均为共阴极,如果需要最后一个显示‘0’,倒数第二个显示‘1’,应怎么处理?IO1先输出0x3F,此时IO2输出0xFE,然后IO1输出0x06,IO2输出0xFD,再依次循环,利用LED闪烁的余辉效应进行显示。4647如何利用三极管提高驱动能力?48实验:八只共阳极数码管滚动显示单个递增字符。4950演示:Project3主程序voidmain(){ unsignedchari=0,k=0x80;//k用于控制选择哪一个LED亮 while(1) { for(i=0;i<8;i++) { k=_crol_(k,1);//循环移位

P0=Disp[i];

P2=k; DdelayX1ms(500); } }}

51

演示:Project3非常重要!i=0时:k=00000001P0=Disp[0]哪个数码管亮?显示什么内容?i=1时:k=00000010P0=Disp[1]哪个数码管亮?显示什么内容?最左边一个数码管显示‘0’左边第二个数码管显示‘1’i=3~7时,对应情况如何?_crol_(k,1);//循环左移如何实现8个数码管同时显示?人眼的视觉暂留时间为100ms段选码、位选码每送入一次后延时以保持延时一段时间,造成视觉暂留效果。实际中也可以通过调试选择合适的延时时间。这称为软件扫描显示。52实验:八只共阳极数码管同时显示在上一实验硬件基础上,如何使各位数码管同时显示不同的数据?按照上述讨论的软件扫描方式修改程序。53演示:Project5主程序voidmain(){ unsignedchari=0,k=0x80; while(1) { for(i=0;i<8;i++) { k=_crol_(k,1); P0=Disp[i]; P2=k;

DdelayX1ms(5); } }}54演示:Project5如果DelayX1ms(5)改为DelayX1ms(100)将会出现什么情况?数码管将会出现轮流显示改为DelayX1ms(20)将会出现什么情况?数码管将会出现闪烁改为DelayX1ms(10)将会出现什么情况?数码管继续闪烁改为DelayX1ms(5)将会出现什么情况?数码管稳定显示55为什么会出现这种情况?刷新速度太慢,不足以弥补人眼的暂留效应实验:在上一实验硬件基础上,如何使各位数码管同时显示递增的计数值?56在上一实验硬件基础上,每次给P0赋值是关键!分析:8位最大显示99999999,计数值应该选什么类型的?Unsignedchar多少位?显示范围?8位,0~255Unsignedint多少位?显示范围?16位,0~65535unsignedlong多少位?显示范围?32位,0~429496729557演示:Project6只需要将显示值递增即可,但需要把各位拆分给对应的数码管。如何拆分???58非常重要!如何拆分?

Main_Count=(Main_Count+1)%(100000000);

Seg[7]=Main_Count%10;

Seg[6]=(Main_Count%100)/10;

Seg[5]=(Main_Count%1000)/100;

Seg[4]=(Main_Count%10000)/1000;

Seg[3]=(Main_Count%100000)/10000;

Seg[2]=(Main_Count%1000000)/100000;

Seg[1]=(Main_Count%10000000)/1000000;

Seg[0]=(Main_Count%100000000)/10000000; 59若Main_Counter=12345,则经过这个程序后,Seg各位值为多少?Seg[7]=5;Seg[6]=4;Seg[5]=3;Seg[4]=2;Seg[3]=1;其他为0。非常重要!回忆计数器的功能,这里我们用计数器产生累加的时间间隔。

TMOD=0x00;//计数器工作模式0,多少位?

13位计数 TH0=(8192-5000)/32;TL0=(8192-5000)%32;//对于12MHz晶振,多长时间产生一次中断

5ms

IE=0x82; //什么含义

打开总中断,计数器0中断 TR0=1;//什么含义

开始计数

60EAESET1EX1ET0EX0

IE(A8H)AFHAEHADHACHABHAAHA9HA8H主函数voidmain(){ unsignedchari=0,k=0x80;

TMOD=0x00; TH0=(8192-5000)/32; TL0=(8192-5000)%32; IE=0x82; TR0=1; while(1) {

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

k=_crol_(k,1); P0=Disp[Seg[i]]; P2=k; DdelayX1ms(2); } } }61这段完成什么功能?数码管动态刷新中断函数voidTimer_Interrupt()interrupt1{

TH0=(8192-5000)/32; TL0=(8192-5000)%32;

Main_Count=(Main_Count+1)%(100000000);

Seg[7]=Main_Count%10;

Seg[6]=(Main_Count%100)/10;

Seg[5]=(Main_Count%1000)/100;

Seg[4]=(Main_Count%10000)/1000;

Seg[3]=(Main_Count%100000)/10000;

Seg[2]=(Main_Count%1000000)/100000;

Seg[1]=(Main_Count%10000000)/1000000;

Seg[0]=(Main_Count%100000000)/10000000; }62演示:Project6该中断完成什么功能?定时器初始化、计数累加、数码管显示内容分割实验:在上一实验硬件基础上,如何使各位数码管同时小时、分钟、秒以及上下午?分析:在上一实验基础上要注意以下修改的地方:计数间隔,改为1s计数方式更改,按秒、分、小时进行63A、P的显示:unsignedcharDisp[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff};64按照:dp,g,f,e,d,c,b,a的顺利,对于共阳极,某位等于0时候亮,显示P,值为:10001100B(8CH)时间计数方式

if(++Sec_Count==200) { Second=Second+1; if(Second>=60) { Second=0; Minute=Minute+1; if(Minute>=60) { Minute=0; Hour=Hour+1; if(Hour>=12) { Hour=0; AM=!AM; } } }65什么含义?产生1s定时什么含义?计满一分钟什么含义?计满一小时什么含义?计满12小时时间显示计数方式

Seg[7]=Second%10;

Seg[6]=(Second%100)/10;

Seg[5]=(Minute%10);

Seg[4]=(Minute%100)/10;

Seg[3]=(Hour%10);

Seg[2]=(Hour%100)/10;

Seg[1]=17;//什么含义? if(AM==1)

Seg[0]=10;//什么含义? else

Seg[0]=16;//什么含义?66什么含义?显示内容分割什么含义?第二个数码管显示空白第一个数码管显示A第一个数码管显示PDisp[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff};主函数voidmain(){ unsignedchari=0,k=0x80; TMOD=0x00; TH0=(8192-5000)/32; TL0=(8192-5000)%32; IE=0x82; TR0=1; P2=0x00;

Seg[1]=17; if(AM==1)

Seg[0]=10; else

Seg[0]=16; while(1) { for(i=0;i<8;i++) { P2=0x00; k=_crol_(k,1); P0=Disp[Seg[i]]; P2=k; DdelayX1ms(3); } } }67演示:Project7实验:使用4511译码器实现四个数码管的同时显示68演示:Project16分析:4511具有锁存功能,可以通过控制LE管脚为不同的数码管写入不同的数据。69硬件连接图70下述语句有什么作用?P2=0xF7; P0=1;DdelayX1ms(50);最后一个数码管显示1。延时50msvoidmain(){ while(1) { P2=0xF7; P0=1; DdelayX1ms(50); P2=0xFB; P0=2; DdelayX1ms(50); P2=0xFD;P0=3;DdelayX1ms(50); P2=0xFE;P0=4;DdelayX1ms(50); }}71参照单片机扫描程序,可编写:如果去掉While(1)循环,将会有什么现象?voidmain(){ { P2=0xF7; P0=1; DdelayX1ms(50); P2=0xFB; P0=2; DdelayX1ms(50); P2=0xFD;P0=3;DdelayX1ms(50); P2=0xFE;P0=4;DdelayX1ms(50); } while(1);}72程序如下:会出现什么现象?和刚刚程序结果一样!voidmain(){ { P2=0xF7; P0=1; P2=0xFB; P0=2; P2=0xFD;P0=3; P2=0xFE;P0=4; } while(1);}73去掉DdelayX1ms(50);会出现什么现象?和刚刚程序结果一样!采用硬件译码,将会简化程序设计!3.键盘接口及其应用3.1概述3.2按键的消抖3.3独立式非编码键盘3.4矩阵键盘接口及工作原理743.1概述键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件译码器实现,并产生键编号或键值的称为编码键盘,如BCD码键盘、ASCII码键盘等;靠软件识别的称为非编码键盘。75键盘中的按键:都是一个常开开关电路。当按键K未被按下时,P1.0输入为高电平;当按键K闭合时,P1.0输入为低电平。763.2按键的消抖通常按键在闭合及断开的瞬间均伴有一连串的抖动。抖动时间一般为5~10ms。77键抖动会引起一次按键被误读多次,必须去除键抖动。可用硬件或软件两种方法消除。软件方法去抖动,即检测出键闭合后执行一个5~10ms延时程序,再一次检测,如果仍保持闭合,则确认为真正按下。当检测到按键释放后,也要给5~10ms的延时,待后沿抖动消失后,才能转入该键的处理程序。硬件方法去抖动又可分为:电容式硬件消抖和双稳态电路消抖。783.3独立式非编码键盘各按键相互独立地接通一条输入数据线。当一个键按下时,与之相连的输入数据线即清0(低电平),平时该线为1(高电平)。要判别是否有键按下,用单片机的位处理指令十分方便。优点是电路简单;缺点是占用I/O线多。79 if(P1!=0xF0) if(P1&0xF0!=0xF0)独立式非编码键盘与单片机的连接80独立式非编码键盘的查询方式01 #include<reg51.h>02 unsignedcharRead_Keyboard(); //读键值03 voidFunc1(); //自定义函数104 voidFunc2(); //自定义函数205 voidmain()06 {07 unsignedcharKeyboard_Status; //定义键值08 while(1)09 {10 Keyboard_Status=Read_Keyboard(); //读取按键值11 if(Keyboard_Status==0x01)12 {13 Func1();14 }15 elseif(Keyboard_Status==0x02)16 {17 Func2();18 }19 else20 {21 }22 }23 }24 unsignedcharRead_Keyboard()25 {26 unsignedcharKeys_Value; //定义键值变量27 P2=0xff; //P2口置高,准备读取按键状态28 Keys_Value=P2; //读取按键状态29 returnKeys_Value; //返回按键状态值30 }31 voidFunc1()32 {33 }34 voidFunc2()35 {36 }3.4矩阵键盘接口及工作原理为了减少键盘与单片机接口时所占用I/O线的数目,在键数较多时,通常都将键盘排列成行列矩阵形式。823.4.1阵列式按键键盘的行扫描方式3.4.2阵列式按键键盘的线反转方式3.4.3阵列式按键键盘的行列扫描方式833.4.1阵列式按键键盘的行扫描方式8485Step1:水平线置0,检测列。哪一列为低,则该列中有按键按下。00001011Step2:水平线依次置0,检测所有列。按键就位于使输出不全为1的那一行。01011不全为1的位于这一行位于这一列判断键盘中哪一个键被按下:通过将行线逐行置低电平后,检查列输入状态实现。方法:依次给行线送“0”,然后查所有列线状态,称行扫描。如果全为1,则所按下的键不在此行;如果不全为1,则所按下的键必在此行,而且是在与“0”列线相交交点上的那键。86按键扫描的工作过程:①判断键盘中是否有键按下;②进行行扫描,判断是哪一个键按下,若有键按下,则调用延时子程序去抖动;③读取按键的位置码;④将按键的位置码转换为键值(键的顺序号)0、1、2…、F。873.4.2阵列式按键键盘的线反转方式8832107654BA98FEDC8900001101位于这一列00001011位于这一行如何用语言描述这个过程?

9000001101位于这一列P1=0x0F;Temp=P1^0x0F;//异或运算switch(Temp){case1:KeyNo=0;break;case2:KeyNo=1;break;case4:KeyNo=2;break;case8:KeyNo=3;break;default:KeyNo=16;}如何用语言描述这个过程?

91位于这一列00001011键值为5P1=0xF0;Temp=P1>>4^0x0F;switch(Temp){case1:KeyNo+=0;break;case2:KeyNo+=4;break;case4:KeyNo+=8;break;case8:KeyNo+=12;}92步骤:将行线作为输出线,列线作为输入线;延时,用于去抖动处理;将列线作为输出线,行线作为输入线;得出键值。 unsignedcharTemp; P1=0x0F; DdelayX1ms(1); Temp=P1^0x0F; switch(Temp) { case1:KeyNo=0;break; case2:KeyNo=1;break; case4:KeyNo=2;break; case8:KeyNo=3;break; default:KeyNo=16; }93按键属于哪一列?首先置P1=0FH,即00001111,按键后,将变为0000XXXX,其中XXXX中有一个为0,另外三个为1.P1^0000XXXX取异或运算,计算结果将XXXX中唯一的0变为1。计算结果为1,2,4,8中的一个为1时,第一列中某个按键按下为2时,第二列中某个按键按下为4时,第三列中某个按键按下为8时,第四列中某个按键按下 P1=0xF0; DdelayX1ms(1); Temp=P1>>4^0x0F; switch(Temp) { case1:KeyNo+=0;break; case2:KeyNo+=4;break; case4:KeyNo+=8;break; case8:KeyNo+=12; }94按键是哪一行的?首先置P1=F0H即11110000,当某个按键按下后,将变为XXXX0000,XXXX中有一个为0,另外三个为1.P1>>4^00001111,则结果为1,2,4或8为1时,表示第一行,按键值就等于列的值为2时,表示第二行,按键值等于列值加4为4时,表示第三行,按键值等于列值加8为8时,表示第四行,按键值等于列值加12实验:数码管显示键盘矩阵按键9596演示:Project8分析1:判断属于哪一列?首先置P1=0FH,即00001111,按键后,将变为0000XXXX,其中XXXX中有一个为0,另外三个为1.P1^0000XXXX取异或运算,计算结果将XXXX中唯一的0变为1。计算结果为1,2,4,8中的一个为1时,第一列中某个按键按下为2时,第二列中某个按键按下为4时,第三列中某个按键按下为8时,第四列中某个按键按下97分析1:判断属于哪一行?首先置P1=F0H即11110000,当某个按键按下后,将变为XXXX0000,XXXX中有一个为0,另外三个为1.P1>>4^00001111,则结果为1,2,4或8为1时,表示第一行,按键值就等于列的值为2时,表示第二行,按键值等于列值加4为4时,表示第三行,按键值等于列值加8为8时,表示第四行,按键值等于列值加1298voidmain(){ P0=0x00; while(1) { P1=0xF0; if(P1!=0xF0)Keys_Scan(); if(Pre_KeyNo!=KeyNo) { P0=~Disp[KeyNo];

Pre_KeyNo=KeyNo; } DdelayX1ms(100); }}99什么含义?有按键按下,扫描键值什么含义?如果按键值发生变化,更新显示voidKeys_Scan(){ unsignedcharTemp; P1=0x0F; DdelayX1ms(1); Temp=P1^0x0F; switch(Temp) { case1:KeyNo=0;break; case2:KeyNo=1;break; case4:KeyNo=2;break; case8:KeyNo=3;break; default:KeyNo=16; } P1=0xF0; DdelayX1ms(1); Temp=P1>>4^0x0F; switch(Temp) { case1:KeyNo+=0;break; case2:KeyNo+=4;break; case4:KeyNo+=8;break; case8:KeyNo+=12; }}100演示:Project8什么含义?延时消除抖动!3.4.3阵列式按键键盘的行列扫描方式101102Step1:水平线依次单个为0,其余为1,检测列。当列不全为1时,确定所在行。01111011Step2:列依次单个置0其余置1,检测行。当行不全为1时,确定所在列。1011位于这一列位于这一行01114.实验配套开发板的基本使用4.1板卡基本部件4.2与计算机的连接4.3下载程序的软件4.4实验程序演示4.5实验基础一:点亮一个数码管4.6实验基础二:各数码管显示不同值4.7实验基础三:各数码管显示递增值1034.1板卡基本部件1044.2与计算机的连接105连系统板连PC机USB口工作指示灯将拨码开关3,4拨到‘ON’位置!下载线本身里面包含了一个单片机,完成USB与JTAG时序转换。需安装驱动。1064.3下载程序的软件使用PROGISP或AVR_fighterforUSBASP可将Keil编译得到的HEX文件下载到单片机内部。1074.4实验程序演示实验程序演示1084.5实验基础一:点亮一个数码管109四个数码管四个数码管八个三极管各自驱动一个数码的公共端注意:八个数码管各自的地址八个数码管信号线共用连接到P0.0~P0.7思考:如何点亮一个数码管?每个LED对应了一个地址,且具有锁存功能,因此,向该地址中直接写入数据即可。写入具体方法可采用C语言一节所讲的对绝对地址访问的三种方法之一。110#include<AT89X51.H>#include<intrins.h>#include<absacc.h>#defineLED1XBYTE[0xA000]//数码管地址#defineLED2XBYTE[0xA001]#defineLED3XBYTE[0xA002]#defineLED4XBYTE[0xA003]#defineLED5XBYTE[0xA004]#defineLED6XBYTE[0xA005]#defineLED7XBYTE[0xA006]#defineLED8XBYTE[0xA007]unsignedcharDisp[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voidmain(){ LED1=Disp[7];}111演示:Keil编译及下载整个过程Project12将主程序由:voidmain(){ LED1=Disp[7];}改为:voidmain(){ LED1=Disp[7]; LED2=Disp[6];}将会出现什么情况?为什么?112第二个数码管将显示6,第一个数码管不亮。因为:八个数码管共用总线。如何多个数码管同时显示不同值?采用动态扫描方法!4.6实验基础二:各数码管显示不同值各数码管共用总线,应按照动态扫描的方法进行。113演示:Project13显示效果voidmain(){ unsignedchari=0,k=0x8; while(1) { LED1=Disp[8]; DdelayX1ms(2); LED2=Disp[7]; DdelayX1ms(2); LED3=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论