按键控制移位显示
2016-01-25 11:47
495 查看
应邀写个“按键移位”的程序。
要求使用4×4矩阵键盘,数码显示器。键盘接在P1,数码显示器接在P0、P2口。
电路、以及运行后的显示效果如下:
插图链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/0827e94dde7e2ba3d62afcca.html#
插图链接:http://xiangce.baidu.com/picture/detail/f13851b8e95c7608774aa47fc8a754749636421f
C语言的控制程序如下:
//=======================================================
#include <AT89X51.H>
char disp_buff [] ={0, 0, 0, 0, 0, 0, 0, 0};//显示缓冲单元
//-------------------------------------------------------
delay1ms(unsigned int t) //1ms延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++) for(j = 0; j < 120; j++);
}
//-------------------------------------------------------
void display(void) //显示函数
{
char code table[] = { //共阴数码管的段码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
char code wei[] = {128, 64, 32, 16, 8, 4, 2, 1};//位选代码
char i;
for (i = 0; i < 8; i++) {
P2 = 0; //先消隐
P0 = ~table[disp_buff [i]]; //取反,用于共阳数码管
P2 = wei[i];
delay1ms(2);
}
}
//-------------------------------------------------------
unsigned char keyboard(void) //扫描键盘函数
{
char i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循环扫描四行
P1 = Buffer[j]; //在高四位分别输出一个低电平
temp = 0x01; //计划先判断第0位
for(i = 0; i < 4; i++) { //循环扫描四列
if(!(P1 & temp)) //从低四位,截取1位
return (i + j * 4); //如果为0就返回按键值
temp <<= 1; //判断的位,左移一位
} }
return 16; //判断结束,没有键按下,返回16
} //呵呵,实质性的语句不过8行,就是这么简练!
//-------------------------------------------------------
void main(void)
{
unsigned char i, key;
while(1) { //无限循环
display(); //显示一遍
key = keyboard(); //读出一遍键盘
if (key < 16) { //如果有人按键
//--------------------进行按键处理
disp_buff [7] = disp_buff [6];
disp_buff [6] = disp_buff [5];
disp_buff [5] = disp_buff [4];
disp_buff [4] = disp_buff [3];
disp_buff [3] = disp_buff [2];
disp_buff [2] = disp_buff [1];
disp_buff [1] = disp_buff [0];
disp_buff [0] = key;
//--------------------处理结束,去等待按键释放
for (i = 0; i < 20; i++) display();//稍稍延时
while(key < 16) { //等待按键释放
key = keyboard(); //再读
display(); //别忘了显示
} } } //无限循环
}
//=======================================================
题目来自《百度知道》,利用QQ进行的交流,最终,求知者得到了满意的结果。
要求使用4×4矩阵键盘,数码显示器。键盘接在P1,数码显示器接在P0、P2口。
电路、以及运行后的显示效果如下:
插图链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/0827e94dde7e2ba3d62afcca.html#
插图链接:http://xiangce.baidu.com/picture/detail/f13851b8e95c7608774aa47fc8a754749636421f
C语言的控制程序如下:
//=======================================================
#include <AT89X51.H>
char disp_buff [] ={0, 0, 0, 0, 0, 0, 0, 0};//显示缓冲单元
//-------------------------------------------------------
delay1ms(unsigned int t) //1ms延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++) for(j = 0; j < 120; j++);
}
//-------------------------------------------------------
void display(void) //显示函数
{
char code table[] = { //共阴数码管的段码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
char code wei[] = {128, 64, 32, 16, 8, 4, 2, 1};//位选代码
char i;
for (i = 0; i < 8; i++) {
P2 = 0; //先消隐
P0 = ~table[disp_buff [i]]; //取反,用于共阳数码管
P2 = wei[i];
delay1ms(2);
}
}
//-------------------------------------------------------
unsigned char keyboard(void) //扫描键盘函数
{
char i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循环扫描四行
P1 = Buffer[j]; //在高四位分别输出一个低电平
temp = 0x01; //计划先判断第0位
for(i = 0; i < 4; i++) { //循环扫描四列
if(!(P1 & temp)) //从低四位,截取1位
return (i + j * 4); //如果为0就返回按键值
temp <<= 1; //判断的位,左移一位
} }
return 16; //判断结束,没有键按下,返回16
} //呵呵,实质性的语句不过8行,就是这么简练!
//-------------------------------------------------------
void main(void)
{
unsigned char i, key;
while(1) { //无限循环
display(); //显示一遍
key = keyboard(); //读出一遍键盘
if (key < 16) { //如果有人按键
//--------------------进行按键处理
disp_buff [7] = disp_buff [6];
disp_buff [6] = disp_buff [5];
disp_buff [5] = disp_buff [4];
disp_buff [4] = disp_buff [3];
disp_buff [3] = disp_buff [2];
disp_buff [2] = disp_buff [1];
disp_buff [1] = disp_buff [0];
disp_buff [0] = key;
//--------------------处理结束,去等待按键释放
for (i = 0; i < 20; i++) display();//稍稍延时
while(key < 16) { //等待按键释放
key = keyboard(); //再读
display(); //别忘了显示
} } } //无限循环
}
//=======================================================
题目来自《百度知道》,利用QQ进行的交流,最终,求知者得到了满意的结果。
相关文章推荐
- 51单片机利用74HC595驱动数码管
- 晚期(运行期)优化
- 基于51单片机的交通灯C语言程序设计
- 数码管动态显示 汇编 60进制
- 数据键入与排序程序--80x86汇编语言
- 用C语言编写程序,判断输入的一个字符串是否是回数
- 两台 PC 机之间的串口通信
- 51单片机的中断控制
- MCS-51 单片机的存储器地址空间如何划分?
- <Test> XiMaLaYa 新奇部分的添加
- statfs获取硬盘使用情况函数详解
- Android开发——android调试工具集【转】
- Jmeter之Bean shell使用(一)
- 日本发生9级地震与海啸
- 关于C语言延时时间的问题
- 4×4矩阵键盘,控制数码管显示
- 四舍六入!
- 一代枭雄张作霖
- LCD1602 的4线接法
- 摩尔斯电码