P1 接 8 个独立按键,P2 接 8 个 LED,要求用按键控制 LED 的发光状态
2016-01-25 11:50
148 查看
/*
P1.0~P1.5 接的 6 个按键,分别对应控制 P2.0~P2^5 所接的 6 个 LED。
按一下 P1.0 的按键,P2.0 接的 LED 就长亮,重复按一下,LED 就熄灭;
这 6 路都如此控制。
P1.6 和 P1.7 的按键控制对应的 P2.6 和 P2.7 所接的 2 个 LED。
但是要求输出是 100ms 交替闪烁的信号。
按一下 P1.6 的按键,P2.6 接的 LED 就以100ms的间隔闪烁,重复按一下,LED 就熄灭;
P1.7 与 P2.7 的控制关系也是如此。
下列程序已经调试通过,可以满足上述要求。
仿真截屏如下:
![](http://img.bimg.126.net/photo/NV-fmxlula9rl4L482O_8A==/3976959945961997663.jpg)
图片链接:http://xiangce.baidu.com/picture/detail/93d80b5bd9e3be333f45174afb0e9eee071f831c
*/
#include <AT89X51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//-----------------------------------------------------------
uchar aa, bb, cc, dd; //设定变量.
//-----------------------------------------------------------
void delay(uint ms)
{
uchar t;
while(ms--) for(t = 0; t < 123; t++);
}
//-----------------------------------------------------------
void main(void)
{
TMOD = 0x01; // T0定时方式1
TL0 = (65536 - 50000) % 256; //50ms@12MHz
TH0 = (65536 - 50000) / 256;
TR0 = 1; //启动定时器0
IE = 0x82; //中断允许.
bb = 0x3f;
cc = 0;
while(1) {
aa = P1; //读入按键.
if (aa < 255) { //如果有按下.
delay(10); //延时消抖.
aa = P1; //再读.
if (aa < 255) { //如果仍然按下.
if (aa == 255 - 1) bb ^= 1; //根据按键,分别处理.
if (aa == 255 - 2) bb ^= 2; //这里也可以使用 case 语句.
if (aa == 255 - 4) bb ^= 4;
if (aa == 255 - 8) bb ^= 8;
if (aa == 255 - 16) bb ^= 16;
if (aa == 255 - 32) bb ^= 32;
if (aa == 255 - 64) bb ^= 64;
if (aa == 255 - 128) bb ^= 128;
P2 = (cc & 0xc0) + (bb & 0x3f);//输出.
while(aa < 255) aa = P1; //等待按键松开.
} } }
}
//-----------------------------------------------------------
void T0_INT() interrupt 1
{
TL0 = (65536 - 50000) % 256; //50ms@12MHz
TH0 = (65536 - 50000) / 256;
dd++;
dd %= 4; //4,代表200ms
if (dd == 0) { //如果时间到了.
if ((bb & 64) == 64) cc ^= 64; //按照指定位取反.
else cc |= 64; //关闭指定位.
if ((bb & 128) == 128) cc ^= 128;
else cc |= 128; //关闭指定位.
P2 = (cc & 0xc0) + (bb & 0x3f); //输出.
}
}
//-----------------------------------------------------------
//提问者对于答案的评价:程序很好,因为有了你的无私帮助,让我们这些菜鸟更快的融入单片机世界,感谢。
//原题网址:http://zhidao.baidu.com/question/287237680.html
P1.0~P1.5 接的 6 个按键,分别对应控制 P2.0~P2^5 所接的 6 个 LED。
按一下 P1.0 的按键,P2.0 接的 LED 就长亮,重复按一下,LED 就熄灭;
这 6 路都如此控制。
P1.6 和 P1.7 的按键控制对应的 P2.6 和 P2.7 所接的 2 个 LED。
但是要求输出是 100ms 交替闪烁的信号。
按一下 P1.6 的按键,P2.6 接的 LED 就以100ms的间隔闪烁,重复按一下,LED 就熄灭;
P1.7 与 P2.7 的控制关系也是如此。
下列程序已经调试通过,可以满足上述要求。
仿真截屏如下:
![](http://img.bimg.126.net/photo/NV-fmxlula9rl4L482O_8A==/3976959945961997663.jpg)
图片链接:http://xiangce.baidu.com/picture/detail/93d80b5bd9e3be333f45174afb0e9eee071f831c
*/
#include <AT89X51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//-----------------------------------------------------------
uchar aa, bb, cc, dd; //设定变量.
//-----------------------------------------------------------
void delay(uint ms)
{
uchar t;
while(ms--) for(t = 0; t < 123; t++);
}
//-----------------------------------------------------------
void main(void)
{
TMOD = 0x01; // T0定时方式1
TL0 = (65536 - 50000) % 256; //50ms@12MHz
TH0 = (65536 - 50000) / 256;
TR0 = 1; //启动定时器0
IE = 0x82; //中断允许.
bb = 0x3f;
cc = 0;
while(1) {
aa = P1; //读入按键.
if (aa < 255) { //如果有按下.
delay(10); //延时消抖.
aa = P1; //再读.
if (aa < 255) { //如果仍然按下.
if (aa == 255 - 1) bb ^= 1; //根据按键,分别处理.
if (aa == 255 - 2) bb ^= 2; //这里也可以使用 case 语句.
if (aa == 255 - 4) bb ^= 4;
if (aa == 255 - 8) bb ^= 8;
if (aa == 255 - 16) bb ^= 16;
if (aa == 255 - 32) bb ^= 32;
if (aa == 255 - 64) bb ^= 64;
if (aa == 255 - 128) bb ^= 128;
P2 = (cc & 0xc0) + (bb & 0x3f);//输出.
while(aa < 255) aa = P1; //等待按键松开.
} } }
}
//-----------------------------------------------------------
void T0_INT() interrupt 1
{
TL0 = (65536 - 50000) % 256; //50ms@12MHz
TH0 = (65536 - 50000) / 256;
dd++;
dd %= 4; //4,代表200ms
if (dd == 0) { //如果时间到了.
if ((bb & 64) == 64) cc ^= 64; //按照指定位取反.
else cc |= 64; //关闭指定位.
if ((bb & 128) == 128) cc ^= 128;
else cc |= 128; //关闭指定位.
P2 = (cc & 0xc0) + (bb & 0x3f); //输出.
}
}
//-----------------------------------------------------------
//提问者对于答案的评价:程序很好,因为有了你的无私帮助,让我们这些菜鸟更快的融入单片机世界,感谢。
//原题网址:http://zhidao.baidu.com/question/287237680.html
相关文章推荐
- jQuery/Json/Ajax基础知识
- LA2678
- SQL四种语言:DDL,DML,DCL,TCL
- Android手机上,利用bat脚本模拟用户操作
- poj1700 crossing river 贪心(手动翻译)
- 驱动大尺寸数码管的方法与电路
- 比较两个无符号数的大小
- 晒晒新买的“百度旋转音箱”
- 汇编编程问题:X + Y + Z => 显示
- 汇编语言编程:1 + 2 + 3 + 4 + 5 + …… + n
- 【cocos3.x+box2d+tileMap】制作马里奥游戏(三)创世纪
- 80x86 汇编语言:在屏幕右上角显示系统时间
- 汇编语言编程:按照凯撒密码的规则加密
- 基于51单片机的99-00倒计时秒表
- 用80x86汇编语言编程:分类统计字符个数
- Android中Service类中onStartCommand返回值介绍
- 用C51语言设计程序,实现0~99秒计数器
- 用51单片机汇编语言,写一个60s倒计时的程序
- 用51单片机汇编语言,编写“键控加减一”的程序
- OC浮点数是否需要加上f后缀