第6章键盘显示的C51编程_第1页
第6章键盘显示的C51编程_第2页
第6章键盘显示的C51编程_第3页
第6章键盘显示的C51编程_第4页
第6章键盘显示的C51编程_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

第6章单片机键盘/显示的C51编程6.1

七段数码显示器接口6.2键盘接口6.3点阵LED显示器接口6.4液晶显示器的C51编程6.1七段数码显示器的C51编程6.1.1基础知识6.1.2静态显示的C51编程6.1.3动态显示的C51编程6.1.4串行口控制的LED显示的C51编程6.1.1基础知识1、结构与原理:2.显示器的驱动问题显示器中的每个段是一个发光二极管,要其正常发光必须提供足够的电流。不同的LED显示器具有不同的正常发光电流范围,因此在设计硬件电路时要为显示器提供驱动电路,以保证其正常工作。3.显示函数的编写问题(3步)(1)根据硬件电路的结构建立一个显示的代码表P68表6-1

按照一定的顺序在code区域中,将所有要显示的内容的显示代码按照一定的顺序建立一个表格,这个表格称为显示的代码表,如:unsignedcharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//显示的代码表(2)开辟显示缓冲区在片内RAM中开辟出一块特殊区域—显示缓冲器。显示缓冲区中存放要显示的内容所对应的代码在代码表中的相对位置。显示缓冲区的位数和硬件电路中显示器的位数相同,每个显示缓冲器对应着一位显示器。如6位显示器,显示缓冲区可如下:unsignedchardatadis_buf[6]; //显示缓冲区(3)查表并操作相应的显示器

根据显示缓冲区中的内容(相应的显示器要显示的内容所对应的显示代码在代码表中的相对位置),在代码表中得到相应的显示代码,送到相应的显示器上进行显示。6.1.2七段数码静态显示的C51编程所谓静态显示,就是当显示器显示某一个字符时,相应的发光二极管恒定地导通或截止。例如七段显示器的f、e、d、c、b、a导通,dp、g截止,则显示0。这种显示方式中,每一位显示器都需要一个8位输出口控制,所以占用硬件多,一般用于显示器位数较少的场合。【例6-1】利用单片机的并行口作为静态显示的输出口的示例

静态轮流显示“12”、“--”和“AB”的C51源程序如下:#include<reg51.h>#defineucharunsignedcharuchardatadis_buf[2];//显示缓冲区ucharcodeable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; //显示的代码表voiddl(){ unsignedinti;

for(i=0;i<40000;i++);}voiddisplay(void) //显示函数{uchar

segcode;

segcode=dis_buf[0];//P0口显示

segcode=table[segcode];P0=segcode;

segcode=dis_buf[1]; //P3口显示

segcode=table[segcode];P3=segcode;}voidmain(void) //主函数{while(1){dis_buf[0]=1;dis_buf[1]=2; //显示12display();dl();dis_buf[0]=16;dis_buf[1]=16;//显示--display();

dl();dis_buf[0]=10;dis_buf[1]=11;//显示ABdisplay();

dl();}}示例中的显示函数display()可以再简单一些,如下面程序段:voiddisplay(void){P0=table[dis_buf[0]]; //P0口显示P3=table[dis_buf[1]]; //P3口显示}【例6-2】利用Intel8255A作为静态显示的输出口的示例由上图可见,8255的的PA口、PB口、PC口及控制口的口地址分别为:0BCFFH、0BDFFH、0BEFFH、0BFFFH。静态轮流显示“123”、和“ABC”的C51源程序如下:#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineCOM8255XBYTE[0xbfff]#definePA8255XBYTE[0xbcff]#definePB8255XBYTE[0xbdff]#definePC8255XBYTE[0xbeff]uchardatadis_buf[3]; //显示缓冲区ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//显示的代码表voiddl_ms(){unsignedintd;

for(d=0;d<60000;d++);}voiddisplay(void){ PA8255=table[dis_buf[0]]; PB8255=table[dis_buf[1]]; PC8255=table[dis_buf[2]];}voidmain(void){COM8255=0x80; //8255A初始化while(1){ dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3; display();dl_ms(); dis_buf[0]=10;dis_buf[1]=11;dis_buf[2]=12; display();dl_ms();} }6.1.3七段数码动态显示的C51编程当位数较多时,用静态显示所需要的I/O口太多,通常采用动态显示方式。8段LED动态显示是将所有的显示器的a~dp段连接在一起,构成段口;将所有显示器的位com接在一个口上,构成位口,位的段选线并接在一个I/O口上,共阴极端或共阳极端分别有相应的I/O口线控制,分别称为段口和位口。【例6-3】利用MCS-51单片机的并行口作为动态显示的段口与位口的示例6位数码管动态显示“123456”的C51源程序如下(1)随机调用 #include<reg51.h>#defineucharunsignedcharuchardatadis_buf[6];//显示缓冲区ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//代码表voiddl_ms() //延时1ms函数{unsignedintj;

for(j=0;j<200;j++) ;}voiddisplay(void)//显示函数{uchar

segcode,bitcode,i;

bitcode=0xfe; //位码赋初值

for(i=0;i<6;i++){segcode=dis_buf[i];//显示缓冲器内容查表

P0=table[segcode];P3=bitcode;dl_ms();P3=0xff; //关闭显示

bitcode=bitcode<<1; //调整位码

bitcode=bitcode|0x01;}}voidmain(void){dis_buf[0]=1;dis_buf[1]=2;

dis_buf[2]=3;dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6;while(1){ display();}}(2)定时调用

定时调用是通过定时器/计数器的定时功能来定时一定的时间(如20ms),定时时间到来调用显示函数。voidmain(void)//定时调用{TMOD=0x01;TH0=-20000/256;TL0=-2000%256;EA=1;ET0=1;TR0=1;dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3;dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6;while(1);}voidtime0_int()interrupt1{ TH0=-20000/256; TL0=-2000%256; display();}【例6-4】利用Intel8255A作为动态显示的输出口的示例

6位数码管动态轮流显示“123456”、“ABCDEF”的C51源程序如下:(1)随机调用#include<absacc.h>#include<reg51.h>#defineucharunsignedchar#defineCOM8255XBYTE[0xbfff]#definePA8255XBYTE[0xbcff]#definePB8255XBYTE[0xbdff]#definePC8255XBYTE[0xbeff]uchardatadis_buf[6];//显示缓冲区ucharcodetable[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};voiddl_1ms();voiddisplay() //显示函数{datauchar

segcode,bitcode,i;

bitcode=0xfe; //位码初值

for(i=0;i<6;i++){segcode=dis_buf[i]; //查表PA8255=table[segcode];PC8255=bitcode;dl_1ms();PC8255=0xff;

bitcode=bitcode<<1; //位码调整

bitcode=bitcode|0x01;}}voidmain(void){unsignedinti1;COM8255=0x80;//8255初始化while(1){dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3;dis_buf[3]=4;dis_buf[4]=5;dis_buf[5]=6;display(); //调用显示for(i1=0;i1<300;i1++) //延时{display();}dis_buf[0]=10;dis_buf[1]=11;dis_buf[2]=12;dis_buf[3]=13;dis_buf[4]=14;dis_buf[5]=15;display(); //调用显示for(i1=0;i1<300;i1++) {display();}}}voiddl_1ms()//延时1ms{ dataunsignedintd;

for(d=0;d<200;d++);}(2)定时调用voidmain(void)//定时调用{unsignedinti1; COM8255=0x80;TMOD=0x01;TH0=-20000/256;TL0=-20000%256;EA=1;ET0=1;TR0=1;while(1) {dis_buf[0]=16;dis_buf[1]=9; dis_buf[2]=0;dis_buf[3]=0; dis_buf[4]=13;dis_buf[5]=16; for(i1=0;i1<500;i1++) {dl_1ms();}

dis_buf[0]=10;dis_buf[1]=11; dis_buf[2]=12;dis_buf[3]=13; dis_buf[4]=14;dis_buf[5]=15; for(i1=0;i1<500;i1++) {dl_1ms();}}}voidtime0_int()interrupt1{TH0=-20000/256; TL0=-20000%256;display();}6.1.4串行口控制的LED显示的C51编程串行口工作在方式0(同步移位寄存器方式)时,数据传送的波特率是固定的,为fosc/12。若MCS-51单片机晶振频率为6MHz,则波特率为500kb/s,即每传送一个二进制位需2μs时间。这种显示电路属于静态显示方式,比动态显示亮度更大些。【例6-5】串行口控制的LED显示示例4位显示器显示“1234”的C51源程序如下:#include<reg51.h>unsignedchardis_buf[4];//显示缓冲区unsignedcharcodetable[10]={0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x90};voiddisplay() //显示函数{unsignedchari;TI=0;

for(i=0;i<4;i++){ SBUF=table[dis_buf[i]];

while(TI==0); TI=0;}}voidmain(){SCON=0x00; //串口方式0工作

dis_buf[0]=1;dis_buf[1]=2;dis_buf[2]=3;dis_buf[3]=4;display(); //调用显示while(1);} 6.2键盘接口的C51编程6.2.1键盘的基础知识6.2.2独立式键盘接口的C51编程6.2.3矩阵键盘的C51编程6.2.1键盘的基础知识1.键输入原理:0、1电平2.键输入接口与软件应解决的问题(1)键开关状态的可靠输入(2)对按键进行编码以给出键值或直接给出键号①检测有无键按下;②有键按下后,在无硬件去抖动电路时,应用软件延时方法除去抖动影响;③有可靠的逻辑处理方法,如n键按下,即只处理一个键,其间任何按下又松开的键不产生影响,不管一次按键持续有多长时间,仅执行一次按键功能程序;④输出确定的键号以满足散转指令的要求。6.2.2独立式键盘接口的C51编程【例6-6】独立式按键示例P1口作为并行接口按键的输入口,用P3口接一LED显示器,编程显示按键的号码0~7。【例B6-1】

按键发音修改:在例题6-4图的基础上,在P10、P11、P12上增加3个按键K0、K1、K2,试设计一个秒表:K0:启动/停止键K1:暂停键K2:清零键6.2.3矩阵键盘的C51编程1.行列式键盘的硬件结构2.行列式键盘的软件管理对行列式键盘的软件管理分三步:

(1)判断整个键盘是否有键按下采用粗扫描的办法。让所有的行为0,读列的数值。如果读得的列值为全1,说明无键按下,否则说明有键按下。

(2)判断被按键的具体位置采用细扫描的办法。逐行输出0,读列的数值。如果读得的列值为全1,说明被按键不在该行上,再让下一行为0;否则说明被按键在该行上。

(3)计算被按键的键值,以确定要完成的功能。采用某种算法,将行和列的信息合并为一个信息,该信息称为该键的键值,并按一定的顺序形成一个键值表。在计算键值时应注意所有按键的键值应采用同一种算法并且计算出来的键值应该各不相同。【例6-7】4×4矩阵键盘示例

【例6-8】8×2矩阵键盘示例6.3点阵LED显示器的C51编程6.3.1点阵LED显示器基础知识6.3.2一个5×7点阵字符显示的C51编程6.3.3一个8×8点阵字符串显示的C51编程6.3.4两个8×8点阵字符串显示的C51编程

6.3.1点阵LED显示器基础知识LED点阵显示字母“A”和“B”

6.3.2一个5×7点阵字符显示的C51编程【例6-9】使用一个5×7共阳极LED点阵显示字符“B”显示5×7共阳极LED点阵的段码a~g是低电平有效,位选高电平有效,因此显示字符“B”的段码修改:在例6-9的基础上,在显示器上显示一个你想显示的一个图案或一个中文字。6.3.3一个8×8点阵字符串显示的C51编程【例6-10】一个8×8共阴极LED点阵显示“ILOVEYOU”一个8×8在某一个时刻只能显示一个字符,要想显示字符串,必须在显示完一个字符后接着显示下一个字符,因此需要建立一个字符串库。由于每个字符有8个段码值,该字符串有8个字符,所以该字符串库中有8×8共64个段码值。字符串ILOVEYOU的字模段码值

I00H,00H,42H,7EH,42H,42H,00H,00HL00H,42H,7EH,42H,02H,02H,02H,00HO00H,3CH,22H,42H,42H,22H,3CH,00HV00H,40H,70H,0CH,0CH,70H,40H,00HE00H,42H,7EH,4AH,4AH,5AH,22H,00HY00H,40H,62H,1EH,12H,60H,40H,00HO00H,3CH,22H,42H,42H,22H,3CH,00HU00H,7CH,46H,02H,02H,7CH,40H,00H补充:水平左移Proteus原理图为例6-10,显示字符μ水平左移。补充:垂直移动--上卷上卷的关键是字型的编码的变化。规律:相应的字型码循环右移一位。修改:1、箭头上卷2、箭头下卷6.3.4两个8×8点阵字符串显

温馨提示

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

评论

0/150

提交评论