51单片机C教程键盘专题学习笔记(原创)-图文
51单片机学习笔记
单片机C51学习笔记一, C51内存结构深度剖析二, reg51.头文件剖析三,浅淡变量类型及其作用域四, C51常用头文件五,浅谈中断六, C51编译器的限制七,小淡C51指针八,预处理命令一,C51内存结构深度剖析在编写应用程序时,定义一个变量,一个数组,或是说一个固定表格,到底存储在什么地方;当定义变量大小超过MCU的内存范围时怎么办;如何控制变量定义不超过存储范围;以及如何定义变量才能使得变量访问速度最快,写出的程序运行效率最高。
以下将一一解答。
1 六类关键字(六类存储类型)data idata xdata pdata code bdatacode:code memory (程序存储器也即只读存储器)用来保存常量或是程序。
code memory 采用16位地址线编码,可以是在片内,或是片外,大小被限制在64KB作用:定义常量,如八段数码表或是编程使用的常,在定义时加上code 或明确指明定义的常量保存到code memory(只读)使用方法:char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};此关键字的使用方法等同于constdata data memory (数据存储区)只能用于声明变量,不能用来声明函数,该区域位于片内,采用8位地址线编码,具有最快的存储速度,但是数量被限制在128byte或更少。
使用方法:unsigned char data fast_variable=0;idata idata memory(数据存储区)只能用于声明变量,不能用来声明函数. 该区域位于片内,采用8位地址线编码,内存大小被限制在256byte或更少。
该区域的低地址区与data memory地址一致;高地址区域是52系列在51系列基础上扩展的并与特殊功能寄存器具有相同地址编码的区域。
即:data memory是idata memory的一个子集。
c51笔记
•电源引脚–VCC(Pin40):正电源引脚。
正电源接4.0~5.0V电压,正常工作电压为+5V。
–GND(Pin20):接地引脚。
•时钟引脚–XTAL1(Pin19):用作片内振荡电路的输入端。
–XTAL2(Pin18):用作片内振荡电路的输出端或者外部时钟源的输入引脚。
•P0端口即P0.0~P0.7,占据Pin39~Pin32共8个引脚。
P0端口具有两个功能,既可以用作双向数据总线口,也可以分时复用输出低8位地址总线。
控制•P1端口即P1.0~P1.7,占据Pin1~Pin8共8个引脚。
P1端口一般用做通用I/O端口,是8位准并行的,具备4个TTL负载的驱动能力。
P1端口可以用做位处理,既各位都可以单独输出或输入数据。
读锁存器VCCP2端口即P2.0~P2.7,占据Pin21~Pin28共8个引脚。
P2端口可以用作通用I/O端口,或者在扩展外部存储器时用作高8位地址线。
••••••••••••••P3端口即P3.0~P3.7,占据Pin10~Pin17共8个引脚。
P3端口可以用作通用I/O端口,可进行位操作,同时还具有特定的第二功能。
P3端口的第二功能•单片机的复位引脚为RST(Pin9),单片机内部CPU的复位信号便从这里输入。
•单片机复位完全通过RST引脚来完成,其基本原理是在单片机的时钟振荡电路启动后,如果RST引脚外加两个机器周期(即24个时钟振荡脉冲)以上的高电平,单片机便实现了复位。
上电复位电路手动加上电复位电路•ALE引脚(Pin30)具有两种功能,可以作为地址锁存使能端和编程脉冲输入端。
下面分别进行介绍。
–当作为地址锁存使能端时为ALE。
当单片机访问外部程序存储器时,ALE(地址锁存)的负跳变将低8位地址打入锁存。
而当访问外部数据存储器时,例如执行MOVX类指令,ALE引脚会跳过一个脉冲。
当单片机在非访问内部程序存储器时,ALE引脚将有一个1/6振荡频率的正脉冲信号输出,该信号可以用于外部计数或电路其他部分的时钟信号。
C51单片机步步学笔记
C51单片机步步学笔记(最新更新)管理提醒:本帖被icneo 执行取消置顶操作(2009-01-02)作为一个初学者,如何单片机入门?我需要那些知识和设备?知识上,其实不需要多少东西,会简单的C语言,知道51单片机的基本结构就可以了。
一般的大学毕业生都可以了,自学过这2门课程的高中生也够条件。
设备上,一般是建议购买一个仿真器,这样才可以进行实际的,全面的学习。
日后在工作上,仿真器也大有用处还有,一般光有仿真器是不行,还得有一个实际的电路,即学习板。
学习板一般价格都比较贵,而且许多学习板配套程序和讲解不够完善。
这里介绍的是最简单的学习板,4个按键加4个LED发光管,一个蜂鸣器,一个24c 02即可。
通过30个教程,初学者可以学到:单片机控制外部设备,读取外部设备状态,外部中断的应用,中断的深入理解,变量和标记的灵活应用,定时器的灵活应用,可编程自动控制的方法,按键控制设备动作的方法,PWM输出的设计,存储器的读写,延时报警器的设计,各种报警音的设计,音乐播放的设计,程序模块化的设计等等知识。
虽然,这些知识的覆盖面有限,但是,当你学习并掌握了这30个试验之后,您就会豁然开朗,单片机的编程控制如此简单!学习完后,您就已经完全地入门了,并可以自主地对其它的单片机知识进行学习、试验,甚至进行项目开发!第一课了解单片机及单片机的控制原理,控制一个LED 灯的亮和灭本章学习内容:单片机基本原理,如何仿真器,如何编程点亮和灭掉一个LED 灯,如何进入KEILC51uV 调试环境,如何使用单步,断点,全速,停止的调试方法单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需要学习单片机。
可以说,掌握了单片机开发,就多了一个饭碗。
51 单片机已经有30 多年的历史了,在中国,高校的单片机课程大多数都是51,而51 经过这么多年的发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。
51单片机学习笔记:独立按键s2按下数码管加一(缺陷版)
51单⽚机学习笔记:独⽴按键s2按下数码管加⼀(缺陷版)在学习了独⽴按键后,就产⽣了这个想法。
所以今天就把他实现了出来:#include<reg52.h>sbit KEY_s2 = P3^0; //定义按键s2sbit WE = P2^7; //定义位选sbit DU = P2^6; //定义段选unsigned int code table[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};unsigned int code duan[10] = {0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};void delay() //20ms延时函数(⽤于键盘消抖){unsigned char a,b,c;for(c=1;c>0;c--)for(b=222;b>0;b--)for(a=40;a>0;a--);}void softwaredelay() //⽤于动态显⽰数码管{unsigned char a,b;for(b=102;b>0;b--)for(a=3;a>0;a--);}void digitaltube(unsigned int du,unsigned int num){if(num == 0){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[0];DU = 0;}if(num == 1){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[1];DU = 0;}if(num == 2){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[2];DU = 0;}if(num == 3){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[3];DU = 0;}if(num == 4){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[4];DU = 0;}if(num == 5){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[5];DU = 0;}if(num ==6){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[6];DU = 0;}if(num == 7){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[7];DU = 0;}if(num == 8){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[8];DU = 0;}if(num == 9){P0 = 0xFF;WE = 1;P0 = duan[du];WE = 0;DU = 1;P0 = table[9];DU = 0;}}void main(){unsigned int sec = 0;unsigned int dt4;unsigned int dt3;unsigned int dt2;unsigned int dt1;while(1){if(KEY_s2 == 0){delay(); //键盘消抖if(KEY_s2 == 0) {sec ++;while(!KEY_s2); }}//松键盘后数码管显⽰加1dt4 = sec % 10;dt3 = (sec / 10) % 10;dt2 = (sec / 100) % 10;dt1 = (sec/ 1000) % 10;digitaltube(1 , dt1);softwaredelay();digitaltube(2 , dt2);softwaredelay();digitaltube(3 , dt3);softwaredelay();digitaltube(4 , dt4);softwaredelay();}}但是在烧录到单⽚机⾥执⾏的时候会发现在按键按下时,数码管是熄灭的......这就涉及到了中断的问题。
51单片机键盘
\\\§8.3 键盘接口技术一、键盘输入应解决的问题键盘是一组按键的集合,它是最常用的单片机输入设备.操作人员可以通过键盘输入数据或命令,实现简单的人机通讯。
键是一种常开型按钮开关,平时(常态)键的二个触点处于断开状态,按下键时它们才闭合(短路)。
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件译码器实现并产生编号或键值的称为编码键盘,如:ASCⅡ码键盘、BCD码键盘等;靠软件识别的称为非编码键盘。
在单片机组成的测控系统及智能化仪器中用得最多的是非编码键盘。
本节着重讨论非编码键盘的原理、接口技术和程序设计。
键盘中每个按键都是—个常开关电路,如图所示。
1.按键的确认:P1.7=1 无按键;P1.7=0 有按键;2.去抖动去抖动的方法:①硬件去抖动采用RS触发器:优点: 速度快,实时,缺点: 增加了硬件成本②软件去抖动采用延时方法延时5—10ms 延时5—10ms P1.7=0 确认P1.7=0 P1.7=1 (去前沿抖动) (去后沿抖动)二、独立式键盘每个I/O口连接一个按,S1 P1.0S2 P1.1……………………….S8 P1.7软件:START:MOV P1,#0FFH ;置P1口为高电平JNB P1.0, RS1 ; S1按下,程序去执行RS1JNB P1.1, RS2 ; S2按下,程序去执行RS2JNB P1.2, RS3 ; S3按下,程序去执行RS3JNB P1.3, RS4 ; S4按下,程序去执行RS4JNB P1.4, RS5 ; S5按下,程序去执行RS5JNB P1.5, RS6 ; S6按下,程序去执行RS6JNB P1.6, RS7 ; S7按下,程序去执行RS7JNB P1.7, RS8 ; S8按下,程序去执行RS8AJMP START ; 继续扫描按键………….RS1: AJMP PK1 ;RS2: AJMP PK2 ;RS3: AJMP PK3 ;RS4: AJMP PK4 ;RS5: AJMP PK5 ;RS6: AJMP PK6 ;RS7: AJMP PK7 ;RS8: AJMP PK8 ;AJMP START ; 无键按下,继续扫描…………………PK1: ……….. ;按键S1功能处理程序AJMP START ;处理S1按键后, 继续扫描PK2: ……….. ;按键S2功能处理程序AJMP START………………….PK8: ………………;按键S8功能处理程序AJMP START ; 处理S8按键后, 继续扫描优点: 连线简单,程序容易.缺点: 太浪费资源适用于按键较少、I/O口空闲的场合。
51单片机C语言学习笔记1:MCS-51系统结构
51单片机C语言学习笔记1:MCS-51系统结构51 单片机管脚图51 单片机系统结构传统的51 单片机是DIP40(双列直插40 管脚)的,也有PLCC44 的,多用于板子要求紧凑的场合。
如果想占地较少,可以用2051,管脚只有20。
当然增强型51 芯片封装多样,有TQFP48等等小体积的,兼容51 指令集,并且在传统51 的功能上有了很多的提高,如AD、USB 等等,这也是51 单片机还能胜任现在多种应用的原因。
还是让我们看看传统51 单片机的系统结构。
●8位bit CPU。
●片内时钟振荡器。
●4KB(4K 字节)程序存储器ROM。
●片内有128B(128 字节)数据存储器RAM。
●可寻址外部程序存储器和数据存储器空间各64KB。
●21个特殊功能寄存器SFR。
●4个8 位并行I/O 口,共32 根I/O 线。
●1个全双工串行口。
●2个16 位定时器/计数器。
●5个中断源,有2 个优先级。
●具有位寻址功能,适用于位(布尔)处理。
通常使用的51 芯片:1)AT89S51/AT89C51、AT89S52 (S51 和S52 可以使用ISP 下载)2)STC89S54RD+(使用串口下载)STC(宏晶科技)单片机选型mcu-memory/stc-mcu-select-3.htm3)C8051F 系列C8051F320Silicon Lab C8051F 高速单片机选型xhl/xxzn/xxzn.asp 参考资料:1)Chapter2: 8051 Microcontroller Architecturehandsontec/chapter2.htm2)单片机C 语言日记四blog.ednchina/klyzh2003/188178/message.aspxtips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
MCS-51与键盘.ppt
工作过程:
(1)在键盘扫描子程序中,先判断有无键按下。
方法:PA口8位输出全0,读PC口低4位状态,若PC0~ PC3为全1,则说明键盘无键按下;若不全为1,则说明 键盘可能有键按下。
2020/10/22
(2)用软件来消除按键抖动的影响。如有键按下,则 进行下一步。 (3)求按下键的键号。 (4)等待按键释放后,再进行按键功能的处理操作。 2. 定时扫描工作方式
LJMP PKEY3
;S3按下,转PKEY3处理
KEY4: CJNE A,#17H,KEY5 ;S4键未按下,转KEY5
LJMP PKEY4
;S4按下,转PKEY4处理
KEY5: CJNE A,#0FH,PASS ;S5未按下,转RETURN
LJMP PKEY5
;S5按下,转PKEY5处理
RETURN:RET
2020/10/22
识别键盘有无键被按下的方法,分两步进行:
第1步:识别键盘有无键按下; 第2步:如有键被按下,识别出具体的按键。
把所有列线置0,检查各行线电平是否有变化,如 有变化,说明有键按下,如无变化,则无键按下。
上述方法称为扫描法,即先把某一列置低电平, 其余各列为高电平,检查各行线电平的变化,如果某 行线电平为低,可确定此行列交叉点处的按键被按 下。 b. 线反转法
MOV A,#00H
;0行有键闭合,首键号0→A
AJMP LKP
;跳LKP,计算键号
LONE:JB Acc.1,LTW0 ;1行线为高,无键闭合,跳LTW0,
1.动态显示程序设计 8031内部RAM 6个显示缓冲单元:79H~7EH,存
放要显示的6位数据。 8155H的PB口输出相应位的段码,依次改变PA口
(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法)
Delay1ms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; switch(temp) { case 0xde:num=9; break; case 0xdd:num=10; break; case 0xdb:num=11; break; case 0xd7:num=12; break; } } } else num=17; P3=0xef; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { Delay1ms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; switch(temp) { case 0xee:num=13; break; case 0xed:num=14; break; case 0xeb:num=15; break; case 0xe7:num=16; break; } }
case 0x7e:num=1; break; case 0x7d:num=2; break; case 0x7b:num=3; break; case 0x77:num=4; break; } } } else num=17; P3=0xbf; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { Delay1ms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; switch(temp) { case 0xbe:num=5; break; case 0xbd:num=6; break; case 0xbb:num=7; break; case 0xb7:num=8; break; } } } else num=17; P3=0xdf; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {
51单片机C语言实验及实践教程_8.按键识别方法之一
3. 系统板上硬件连线
图 4.8.1
(1. 把“单片机系统”区域中的 P3.7/RD 端 口连接到“独立式键盘”区域中的 SP1 端口上;
(2. 把“单片机系统”区域中的 P1.0-P1.4 端口用 8 芯排线连接到“八路 发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0 连接到 L1,P1.1 连接到 L2,P1.2 连接到 L3,P1.3 连接到 L4 上。
4. 程序设计方法
(1. 其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,
也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而
在按键按下的 过程中,不要有干扰进来,因为,在按下的过程中,
一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因
此在按键按下的时候,
图 4.8.2
void main(void) {
while(1) { if(P3_7==0) { delay10ms(); if(P3_7==0) { count++; if(count==16) { count=0; } P1=~count; while(P3_7==0); } } }
}
(2. 但对程序设计过程中按键识别过程的框图如右图所示:
5. 程序框图
6. 汇编源程序
ORG 00H
START: 0,表示从 0 开始计数
MOV R1,#00H
MOV A,R1
CPL A
;初始化 R7 为 ;
;取反指
令
MOV P1,A
;送出 P1 端口由发光二极管显示
REL:
JNB P3.7,REL
51 单片机 C 语言实验及实践教程_8.按键识别方法之一
51单片机学习笔记
一、汇编语言实现流水灯ORG 0H // ORG 16位地址,程序起始地址,即用来说明此语句后的内容被存放的ROM起始地址;MOV A,#0FEH //立即寻址,操作数为立即数,#用来表示非地址;MOV P1,A //寄存器寻址;MOV R2,#7DOWN:RL A //循环左移指令,A左移一位;ACALL DEL50 //ACALL,子程序调用,绝对调用指令,调用范围2KB;MOV P1,ADJNZ R2,DOWN //DJNZ,减1非零转移指令,即R2=R2-1,若R2=0,则顺序执行,否则转移到DOWN指示的程序段;MOV R2,#7UP:RR A //循环右移指令,A右移一位;ACALL DEL50MOV P1,ADJNZ R2,UPMOV R2,#7SJMP DOWN //无条件转移指令,相对转移指令,-80H~7FH短转移;DEL50:MOV R7,#200 //大约50ms软件延时;DEL1:MOV R6,#125DJNZ R6,$DJNZ R7,DEL1RET //子程序返回;END //汇编程序源程序结束;二、独立按键识别#include<reg51.h>void main(){char key=0;P2=0;while(1){key=~P0&0x0f; //读取按键状态;if(key!=0) P2=key;}}三、键控流水灯#include<reg51.h>char led[]={0x01,0x02,0x04,0x08};void Delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<125;j++);}char key(){return ((P0&0x0f)==0x0f)?0:(P0&0x0f);}void main(){bit direction=0,run=0; //位变量;char i;while(1){switch(key()){case 0x0e:run=1;break;case 0x0d:run=0,direction=0;break;case 0x0b:direction=1;break;case 0x07:direction=0;break;}if(run) if(direction) //自上而下流动;for(i=0;i<=3;i++){P2=led[i]; Delay(100);}else //自下而上流动;{for(i=3;i>=0;i--){P2=led[i]; Delay(100);}}else P2=0;}}四、混合编程实现键控流水灯PUBLIC KEY//按键处理函数的汇编实现,在上述C语言程DE SEGMENT CODE //序中,只要进行char key();的原型声明即可;RSEG DEKEY:MOV A,P0ANL A,#0FH //与操作;MOV B,ACJNE A,#0FH,KEYOUT //比较条件转移指令,若A=0FH,则顺序进行,否则转移;MOV R7,#0KEYOUT:MOV R7,BRETENDC程序中调用汇编语言实现的函数:1)程序的寻址,通过在汇编文件中定义同名的“函数”来实现,如key()和KEY;函数名的转换规则:2参数传递规则:3)返回值传递,汇编语言通过寄存器或存储器传递参数给C程序;五、数码管计数显示器#include<reg51.h>sbit P3_7=P3^7;unsigned chartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char count=0; //LED显示字模;void Delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<125;j++);}void main(){P2=table[count/10];P0=table[count%10];while(1){if(P3_7==0) //软件消颤,检测按键是否压下;{Delay(10);if(P3_7==0) //若按键压下;{count++;if(count==100) count=0;P2=table[count/10];P0=table[count%10];while(P3_7==0);} //等待按键松开,防止连续计数;}}}六、数码管动态显示#include<reg51.h>char led_mod[]={0x71,0x5B,0x76,0x4F}; //显示字模F2H3;sbit P17=P1^7;void Delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<125;j++);}void main(){char led_point=0; //数码管共阴极点选择;char switch_sta=0; //开关触点选择;while(1){switch_sta=(P17==1)?2:0;P3=2-led_point; //LED位选择;P2=led_mod[switch_sta+led_point]; //P2口输出字模;led_point=1-led_point;Delay(30);}}七、行列式键盘1、键盘扫描的一种典型做法:1)先使行线和列线端口的输出电平分别为低电平和高电平。
51单片机学习笔记
delayMs(count);
P3=0x01;
delayMs(count);
}
}
//八拍
/*///反向
P3 = 0x01;DelayMs(Speed);
P3 = 0x03;DelayMs(Speed);
P3 = 0x02;DelayMs(Speed);
while(--t);//微秒延时,延时时间为7.6+(t-1)*2.17微秒;
//或t!=1,t*2.17+5.43微秒;
}
void delayMs(unsigned char t){
for(i=0;i<8;i++){
j=j<<1;//利用缓冲技术实现流水灯;
j=j|0x01;
P1=j;
delayMs(200);
}
}
}
5----------------
主程序延时,数码管闪烁问题;
7----------------30
行列扫描;
return h4+l4;
}
}
return 0xff;
}
11---------------------
静态变量: static unsigned char num,是属于全局的,即使定义在子函数中;
13---------------------
}
for(i=0;i<8;i++){
SRCLK2 = 0;
SI2 = dat1&0x80;
dat1 = dat1<<1;
SRCLK2 = 1;
C51学习笔记
51单片机C语言学习杂记 学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语言,还有众多种类的单片机选择真是件让人头痛的事。
在众多单片机中51架构的芯片风行很久,学习资料也相对很多,是初学的较好的选择之一。
51的编程语言常用的有二种,一种是汇编语言,一种是C语言。
汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C语言还可以嵌入汇编来解决高时效性的代码编写问题。
对于开发周期来说,中大型的软件编写用C语言的开发周期通常要小于汇编语言很多。
综合以上C语言的优点,我在学习时选择了C语言。
以后的教程也只是我在学习过程中的一些学习笔记和随笔,在这里加以整理和修改,希望和大家一起分享,一起交流,一起学习,一起进步。
*注:可以肯定的说这个教程只是为初学或入门者准备的,笔者本人也只是菜鸟一只,有望各位大侠高手指点错误提出建议。
明浩 2003-3-30 pnzwzw@第一课 建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。
KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。
51单片机学习之5独立按键和矩阵键盘
51单片机学习之5独立按键和矩阵键盘51单片机学习之5-独立按键和矩阵键盘第14集键盘的原理键盘分编码键盘(例如电脑键盘)和非编码键盘(自己用程序去识别)。
非编码键盘分:独立式非编码键盘(独立按键)、行列式非编码键盘(4*4阵列键盘)独立键盘的电路图。
因为51单片机的IO口不是双向口而是准双向口,要让IO口具备输入功能,必须将IO口置1,置1之后当按键按下时IO口的电平会被拉低,即被置0。
当检测到IO 口为0时即可判断该按键已经按下。
按键按下时会有一个抖动的过程(弹片会抖动),由于单片机检测IO口速度非常快,超过弹片抖动的频率,所以当单片机检测到IO口为0时需延时一小段时间再检测IO是否为0,如果仍为0就确认该按钮被按下。
因为IO口里面有上拉电阻,所以当松开按钮时,IO口又被拉高。
例程:#include;#defineuintunsignedint#defineucharunsignedcharsbitKey=P3^4;//按键sbitLed=P1^0; //Led灯voiddelay(uintz);/********主函数********/voidmain(){while(1){if(!Key){delay(10);//消抖操作if(!Key)Led=0; //按下时Led亮elseLed=1;}}}voiddelay(uintz){uintx,y;for(x=z;x>;0;x--)for(y=110;y>;0;y--);}第15集4*4矩阵键盘上图中,1个按键占用一个IO口,如果有16个按键就占用了16个IO口。
为了减少IO口的使用,就需要用矩阵的方式连线。
如下图矩阵扫描原理从图可以看出P30、P31、P32、P33为行(低四位),P34、P35、P36、P37为列(高四位)。
假设我们按下的是S6按钮。
第一步,我们先确定列,给P3口赋值0xF0=11110000,那么P37、P36、P35、P34都被置1,P33、P32、P31、P30都被置0,当S6被按下时,由于S6按钮的一边P31为0,所以跟S6另一边相连的P35被拉低,即等于0。
51键盘扫描,c笔记,1602液晶
#include<rge51.h>void main(){语句;} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>while(a<101) //如果a<101,执行以下语句{语句;} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>do{语句;}while(a<101); //如果a<101,执行以上语句>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>for(a=0;a<101;a++) //如果a<101,执行循环语句{语句;} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>if (a==100) //如果a==100,执行以下语句语句;else //否则,执行以下语句语句;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>switch(a){case 100: //如果a==100,执行以下语句printf("100\n");break; //跳出开关语句case 200:printf("200\n");break;case 300:printf("300\n");break;default: //如果都不是,执行以下语句printf("500\n");break;} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>语句;loop:语句goto loop;//回到loop >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>break; //跳出循环或开关>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> continue; //跳出这次循环,执行下一个循环>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>return a; //把值返回给函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>void myprint(){语句;} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>int add(int a) //定义函数和函数值都是整型{return a+1; //返回一个值} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#include <stdio.h>#include <stdlib.h>main (){printf("Hello world !\n");system("pause");}//《1602液晶》#include <reg52.h>//p2.1=en,p2.0=rs,p0.0-p0.7=do-d7#define uchar unsigned char#define uint unsigned intuchar code table[]="I LIKE MCU!";uchar code table1[]="";sbit lcden=P2^1;sbit lcdrs=P2^0;uchar num;void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写入指令{lcdrs=0; //打开指令寄存器P0=com;lcden=1; //使能高电平delay(5);lcden=0; //使能低电平}void write_data(uchar date) //写入数据{lcdrs=1; //打开数据寄存器P0=date;lcden=1; //使能高电平delay(5);lcden=0; //使能低电平}void init() //初始化{lcden=0; //使能低电平write_com(0x38); //显示设置write_com(0x0c); //显示开,无光标,光标不闪write_com(0x06); //指针位置加1,光标加1write_com(0x01); //清屏}void main(){init();write_com(0x80); //光标位置(第一行)for(num=0;num<12;num++){write_data(table[num]);}write_com(0x80+0x40); //光标位置(第二行)for(num=0;num<13;num++){write_data(table1[num]);}while(1);}//《键盘扫描》#include <reg51.h>void delay(unsigned int YS) //延时{int a=2200*YS; //177=1ms (24mhz)while(a--);}void chafang(unsigned int jian){while(1){delay(1);if(P1!=jian)break; //判断键盘松开}}void main(){while(1){P1=0xfe;switch(P1){if(P1!=0xfe) delay(1); //消抖if(P1==0xfe) break;case 0xee:P0=~0x06;//1chafang(0xee);break;case 0xde:P0=~0x5b;//2chafang(0xde);break;case 0xbe:P0=~0x4f;//3chafang(0xbe);break;case 0x7e:P0=~0x66;//4chafang(0x7e);break;}P1=0xfd;switch(P1){if(P1!=0xfd) delay(1); //消抖if(P1==0xfd) break;case 0xed:P0=~0x6d;//5chafang(0xed);break;case 0xdd:P0=~0x7d;//6chafang(0xdd);break;case 0xbd:P0=~0x07;//7chafang(0xbd);break;case 0x7d:P0=~0x7f;//8chafang(0x7d);break;}P1=0xfb;switch(P1){if(P1!=0xfb) delay(1); //消抖if(P1==0xfb) break;case 0xeb:P0=~0x6f;//9chafang(0xeb);break;case 0xdb:P0=~0x77;//Achafang(0xdb);break;case 0xbb:P0=~0x7f;//Bchafang(0xbb);break;case 0x7b:P0=~0x39;//Cchafang(0x7b);break;}P1=0xf7;switch(P1){if(P1!=0xf7) delay(1); //消抖if(P1==0xf7) break;case 0xe7:P0=~0x3f;//Dchafang(0xe7);break;case 0xd7:P0=~0x79;//Echafang(0xd7);break;case 0xb7:P0=~0x71;//Fchafang(0xb7);break;case 0x77:P0=~0x3f;//0chafang(0x77);break;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机C教程键盘专题学习笔记(原创)-
图文
第五课键盘专题
一、键盘分为编码键盘和非编码键盘:键盘上闭合键的识别又专用的硬件编码器实
现,并产生键编码号或键值的称为编码键盘,如计算机键盘。
靠软件编程来识别的键盘称为非编码键盘。
在单片机组成的各种系统中,用的较多的是非编码键盘。
非编码键盘又分为独立键盘和行列式(又称矩阵式)键盘。
二、独立键盘检测
1. 弹性小按键(弹性小按键被按下时闭合,松手后自动断开;单片机的外围
输入控制用小弹性按键较好)
、贴片式小按键、自锁式小按键(自锁式按键按下时闭合且会自动锁住,只有再次按下时才弹起断开。
通常当做开关使用,比如TX-1C实验板上的电源开关)。
2. 单片机检测按键的原理
3. 为什么单片机在检测键盘时需要去抖动操作?去抖动操作有哪些方法?通
常我们用哪种方法?为什么?
4. 编写单片机的键盘检测程序时,一般在检测按下时加入去抖动延时,检测
松手时就不用加了(不过有加,会使程序显得更严密!)。
5. TX-1C实验板独立键盘与单片机连接原理图
三、矩阵键盘检测
1. 典型的“矩阵键盘与单片机”的接法
2. TX-1C上的矩阵键盘模块
3. 矩阵键盘的工作原理和检测方法
四、键盘专题例程
1. 在TX - 1C 实验板上,实现一个数码管变化范围为0~9,开始时显示0,当
按下S2键一次,数值加1;当加到9时,数值回0重新计。
2. 用数码管的前两位显示一个十进制数,变化范围为
00~59,开始时显示
00;每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归00;每按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止自动加1,保持显示原数。
3. 在TX-1C实验板上实现如下描述:实验板上电时,数码管不显示,顺序按
下矩阵键盘后,在数码管上依次显示0~F,6个数码管同时静态显示即可。
4. 按下16个矩阵键盘依次在数码管上显示1-16的平方。
如按下第一个显示
1,第二个显示4...
5. 数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按
下第一个独立键盘时跑表停止,松开手后跑表继续运行。
按下第二个时计时停止,按下第三个时计时开始,按下第四个是计数值清零从头开始。
(用定时器设计表)。