摘要: 根据矩阵键盘的原理图可知,当没有按键按下时,P1=0xf0;然后依次将P1^0~P1^3单独置低电平,其他置高,再扫描各列的状态,来判断是哪个按键按下,比如,将P1^0输出低电平,其他的引脚都输出高电平,即P1=0xfe,那么当第1行有按键按下时P1的相应值为,1X1(01111110=0x7e) ... 阅读全文
posted @ 2014-04-16 22:01 彩蛋 阅读(10659) 评论(0) 推荐(0) 编辑
摘要: 根据电路原理图,键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有 阅读全文
posted @ 2014-03-30 21:18 彩蛋 阅读(11994) 评论(1) 推荐(1) 编辑
摘要: 利用独立按键设计一个抢答器,代码很简单,但是却花了近一个小时,接错线,线8位的顺序出错等,原以为很简单的东西,却花了大量时间在代码之外,或许这就是单片机的特点吧,不光是代码要正确,还要外部连接正确才能最终达到预期的效果。#include sbit Key1 = P0^0; //按键1sbit Key2 = P0^1; //按键2sbit Key3 = P0^2; //按键3sbit Key4 = P0^3; //按键4void main(void){ bit Flag = 0; // bit类型,做布尔变量 标识是否有键按下 P1 = 0xFF; // 先将L... 阅读全文
posted @ 2014-03-25 22:15 彩蛋 阅读(393) 评论(0) 推荐(0) 编辑
摘要: 长按是在短按的基础上,以一个很短的时间(10ms)再次判断按键是否片于按下状态,当达到一定的时间(1s)后,按键还处于按下状态,说明是长按状态,结合上一节的短按,下面实现一个从0-99的累加,短按时一次加1,长按后,进入快速累加的过程,同时使用了定时器来定时刷新数码管,在Display的处理上就和之前的不同,原来在Display里通过循环刷新每个数码管的显示,现在放到了定时器定时触发的事件里,设置定时时间为2ms,这2ms只负责刷新共阴极的8位数码的一位,所以需要在定时事件里处理每次刷新不同位置的数码管。#include sbit KeyAdd = P0^0;sbit LED = P0^1;s 阅读全文
posted @ 2014-03-24 22:18 彩蛋 阅读(7132) 评论(0) 推荐(0) 编辑
摘要: 前面学习了数码管和按键,将两者结合,完成一个用两个按键控制加减数字的小程序,一个按键控制加1另一个控制减1。#include sbit KeyAdd = P0^0; //加1按键sbit KeyDec = P0^1; //减1按键sbit LATCH1 = P2^2; //段锁存sbit LATCH2 = P2^3; //位锁存unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code WeiMa[]={0xfe,0xfd,0xfb 阅读全文
posted @ 2014-03-19 21:50 彩蛋 阅读(1427) 评论(0) 推荐(0) 编辑
摘要: 上一节的按键的使用中,效果是按下键亮,弹起后又灭,无法保持状态,下面的实现按下弹起后,实现一次切换;#include sbit LED = P0^2; //控制引脚sbit Key = P0^0; //按键void main(void){ LED = 0; //初始亮 while (1) { if (!Key) //如果按下 { LED = !LED; //切换LED状态 } }}测试后发现,按键按下弹起的时间间隔不同,效果也不同,... 阅读全文
posted @ 2014-03-17 22:36 彩蛋 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 我有学习板上独立按键共有8个,可以把它做为一个输入端口的8位控制。按下时输出0,松开时输出1,下面是用按键控制一个LED的亮灭,按下时亮,松开时灭。#include sbit LED = P0^2; sbit KEY = P0^0; // 注意输入要使用P0或P3,这两个口同时支持输入和输出void main(){ while(1) { if (KEY == 0) // 按下 LED = 0; else // 松开 LED = 1; //LED = KEY; ... 阅读全文
posted @ 2014-03-15 22:57 彩蛋 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 定时器的几种工作方式中,除0和前面的1类似都需要初始化计数值,然后开始计数,计数溢出后,需要再次控制计数的初值,但工作模式2不同于此,工作方式2将THx和TLx分开处理,将初值存放在THx中,计数时只处理TLx的8位,所以计数最大值为2^8=256,方式2的另一个特点是,当计数溢出后,不需要控制初值,而是会自动将THx中的值做为计数初值重新开始计数。用工作方式2,实现1s延时程序如下:查询方式#include sbit LED = P0^2;unsigned int vT = 0;void main(){ LED = 0; // 初始亮灯 TMOD = 0x02; ... 阅读全文
posted @ 2014-03-15 22:43 彩蛋 阅读(6794) 评论(0) 推荐(1) 编辑
摘要: 中断方式比较特殊,需要使用单片机内部的中断处理机制,同时指定中断函数。#include sbit LED = P0^2;unsigned int vT = 0;void main(){ LED = 0; TMOD = 0x01; TH0 = 0x3C; // 计数初值3CB0H = 15536 (65536-15536=50000 * 1us = 50ms) TL0 = 0xB0; ET0 = 1; // EA即IE^1 等于1时申请中断定时器0中断打开 EA = 1; // 总中断打开 TR0 = 1; /... 阅读全文
posted @ 2014-03-15 22:01 彩蛋 阅读(1633) 评论(0) 推荐(0) 编辑
摘要: 以查询控制器的控制位状态来实现1s定时。#include sbit LED = P0^2; unsigned int vT = 0;void main (){ LED = 0; // 点亮 TMOD = 0x01; // 定时模式1 16位定时计数器 TR0 = 1; // 启动定时器0 TH0 = 0x3C; // 计数初值 15536 (65536-15536=50000 * 1us = 50ms) TL0 = 0xB0; while(1) { if (TF0 ==... 阅读全文
posted @ 2014-03-15 14:01 彩蛋 阅读(494) 评论(0) 推荐(0) 编辑