文档分类
2.1.3 键盘控制实现流水灯原理
本实验中采用键盘扫描子函数,函数返回值则是按键的编号。通过返回的键值即可跳到不同流水灯的模式。
下面用一个例子对控制方法进行说明。实现按下 BlueSkyC51 开发板上任意一个按键都会令与P0.0 相连的 LED0 状态翻转,即亮变灭或灭变亮。main.c程序如下: #include #include
#define uchar unsigned char #define uint unsigned int sbit LED0 = P0^0;
void Delay_ms(uint time) {
uinti,j;
for(i = 0;i void main() { uchar key; while(1) { key = Key_Scan(); //在 while(1)里面不断循环执行按键扫描程序Key_Scan(),Key_Scan()不断 将按键的返回值赋给变量 key if(key != 0) //key!=0 说明有按键被按下 { LED0 = !LED0; } } } 程序中加粗的那部分,由key = Key_Scan()读出键值,由if语句进行判断,即可实现不同流水灯功能。 2.2 键盘控制LED灯程序(关键程序逐条加注释) 做出了两种流水灯的控制模式,如下: 2.2.1 程序一 实现按下 BlueSkyC51 开发板上任意一个按键都会令与P0.0 相连的 LED灯由上至下,依次点亮一个,进行循环。程序如下: 使用键盘扫描,从LED0开始,按下任意键使灯左移。 #include #include #include #define uchar unsigned char #define uint unsigned int #define LED_PORT P0 //定义跑马灯连接的端口 sbit LED0 = P0^0; voidDelay_ms(uint time) { uinti,j; for(i = 0;i void main() { uchar key; uchar temp = 0xFE; while(1) { LED_PORT = temp; key = Key_Scan();//在 while(1)里面不断循环执行按键扫描程序Key_Scan() if(key != 0) //key!=0 说明有按键被按下 { temp=_crol_(temp,1); //循环左移一位 } } } 2.2.2 程序2 按下键值为1,2,3,则分别实现上述2.1.2中三种流水灯的运行。每一次按下键值进入一种流水灯后,需要先复位才可按下其他键值实现另一种流水灯。程序如下: #include #include #include #define uchar unsigned char #define uint unsigned int #define LED_PORT P0 //定义流水灯连接的端口 voiddelay_ms(uint time) { uinti,j; for(i = 0;i void main() { uchar key; while(1) //一直循环 { key = Key_Scan();//在 while(1)里面不断循环执行按键扫描程序 if(key==1) { uchar temp = 0xFE; while(key==1) { LED_PORT = temp; Delay_ms(500);//延时 0.5s temp=_crol_(temp,1); //循环左移一位 } } else if(key==2) { uchar temp = 0x80; while(key==2) { LED_PORT = temp; Delay_ms(500);//延时 0.5s temp=_cror_(temp,1); //循环左移一位 } } else if(key==3) { while(1) { uchar temp = 0x01; uchari; for(i=0; i<8; i++) { LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); // 延时 temp=temp<<1; // temp 中数据左移一位 } temp=0x80; // 赋右移初值给temp for(i=0; i<8; i++) { LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); ; // 延时 temp=temp>>1; // temp 中数据右移一位 } } } else { uchar temp = 0xff; LED_PORT = temp; } } } 该程序是用if语句对键值进行筛选,也可以使用switch语句,相关程序在附录中给出。 三、实验步骤及调试过程 1、C51语言程序的编写与调试 依照手册上的例子及课件上的例题,对相关程序进行了理解,编写了键盘控制流水灯的程序(实验原理2.2中已给出)。 打开keil软件,经过新建工程等操作,开始程序的编译。编译过程中,遇到一些问题,并将其解决,直至编译成功。现将问题总结如下: 1.1 调试程序一 问题(1):程序直接复制的不完全手册上的,对对程序进行说明的”//”后面的话写在复制时部分文字跳到了下一行,被认为是程序中的语句,导致程序调试时显示错误 解决:删除空行。修改 // 后面的说明性的文字,使其不在程序中出现。 1.2 调试程序二 问题(1):调试时,显示 TEXT2.C(23): 警告 C206: '_crol_': missing function-prototype 解决:利用循环左移函数_crol_()。它是在intrin.h头文件中定义的一个函数,因此要调用此函数必须先把intrins.h头文件包含进去,该指令是:#include,把头文件包含进去后就可以在程序中调用函数_crol_()了 问题(2):错误 C141: syntax error near 'unsigned' 1234
void main() {
uchar key; while(1) {
key = Key_Scan();
//在 while(1)里面不断循环执行按键扫描程序Key_Scan(),Key_Scan()不断 将按键的返回值赋给变量 key
if(key != 0) //key!=0 说明有按键被按下 {
LED0 = !LED0; } } }
程序中加粗的那部分,由key = Key_Scan()读出键值,由if语句进行判断,即可实现不同流水灯功能。
2.2 键盘控制LED灯程序(关键程序逐条加注释)
做出了两种流水灯的控制模式,如下: 2.2.1 程序一
实现按下 BlueSkyC51 开发板上任意一个按键都会令与P0.0 相连的 LED灯由上至下,依次点亮一个,进行循环。程序如下:
使用键盘扫描,从LED0开始,按下任意键使灯左移。 #include #include #include
#define uchar unsigned char #define uint unsigned int
#define LED_PORT P0 //定义跑马灯连接的端口 sbit LED0 = P0^0;
voidDelay_ms(uint time) {
for(i = 0;i void main() { uchar key; uchar temp = 0xFE; while(1) { LED_PORT = temp; key = Key_Scan();//在 while(1)里面不断循环执行按键扫描程序Key_Scan() if(key != 0) //key!=0 说明有按键被按下 { temp=_crol_(temp,1); //循环左移一位 } } } 2.2.2 程序2 按下键值为1,2,3,则分别实现上述2.1.2中三种流水灯的运行。每一次按下键值进入一种流水灯后,需要先复位才可按下其他键值实现另一种流水灯。程序如下: #include #include #include #define uchar unsigned char #define uint unsigned int #define LED_PORT P0 //定义流水灯连接的端口 voiddelay_ms(uint time) { uinti,j; for(i = 0;i void main() { uchar key; while(1) //一直循环 { key = Key_Scan();//在 while(1)里面不断循环执行按键扫描程序 if(key==1) { uchar temp = 0xFE; while(key==1) { LED_PORT = temp; Delay_ms(500);//延时 0.5s temp=_crol_(temp,1); //循环左移一位 } } else if(key==2) { uchar temp = 0x80; while(key==2) { LED_PORT = temp; Delay_ms(500);//延时 0.5s temp=_cror_(temp,1); //循环左移一位 } } else if(key==3) { while(1) { uchar temp = 0x01; uchari; for(i=0; i<8; i++) { LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); // 延时 temp=temp<<1; // temp 中数据左移一位 } temp=0x80; // 赋右移初值给temp for(i=0; i<8; i++) { LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); ; // 延时 temp=temp>>1; // temp 中数据右移一位 } } } else { uchar temp = 0xff; LED_PORT = temp; } } } 该程序是用if语句对键值进行筛选,也可以使用switch语句,相关程序在附录中给出。 三、实验步骤及调试过程 1、C51语言程序的编写与调试 依照手册上的例子及课件上的例题,对相关程序进行了理解,编写了键盘控制流水灯的程序(实验原理2.2中已给出)。 打开keil软件,经过新建工程等操作,开始程序的编译。编译过程中,遇到一些问题,并将其解决,直至编译成功。现将问题总结如下: 1.1 调试程序一 问题(1):程序直接复制的不完全手册上的,对对程序进行说明的”//”后面的话写在复制时部分文字跳到了下一行,被认为是程序中的语句,导致程序调试时显示错误 解决:删除空行。修改 // 后面的说明性的文字,使其不在程序中出现。 1.2 调试程序二 问题(1):调试时,显示 TEXT2.C(23): 警告 C206: '_crol_': missing function-prototype 解决:利用循环左移函数_crol_()。它是在intrin.h头文件中定义的一个函数,因此要调用此函数必须先把intrins.h头文件包含进去,该指令是:#include,把头文件包含进去后就可以在程序中调用函数_crol_()了 问题(2):错误 C141: syntax error near 'unsigned' 1234
uchar key;
uchar temp = 0xFE; while(1) {
LED_PORT = temp;
key = Key_Scan();//在 while(1)里面不断循环执行按键扫描程序Key_Scan() if(key != 0) //key!=0 说明有按键被按下 {
temp=_crol_(temp,1); //循环左移一位 } } }
2.2.2 程序2
按下键值为1,2,3,则分别实现上述2.1.2中三种流水灯的运行。每一次按下键值进入一种流水灯后,需要先复位才可按下其他键值实现另一种流水灯。程序如下:
#include #include #include
#define LED_PORT P0 //定义流水灯连接的端口
voiddelay_ms(uint time) {
for(i = 0;i void main() { uchar key; while(1) //一直循环 { key = Key_Scan();//在 while(1)里面不断循环执行按键扫描程序 if(key==1) { uchar temp = 0xFE; while(key==1) { LED_PORT = temp; Delay_ms(500);//延时 0.5s temp=_crol_(temp,1); //循环左移一位 } } else if(key==2) { uchar temp = 0x80; while(key==2) { LED_PORT = temp; Delay_ms(500);//延时 0.5s temp=_cror_(temp,1); //循环左移一位 } } else if(key==3) { while(1) { uchar temp = 0x01; uchari; for(i=0; i<8; i++) { LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); // 延时 temp=temp<<1; // temp 中数据左移一位 } temp=0x80; // 赋右移初值给temp for(i=0; i<8; i++) { LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); ; // 延时 temp=temp>>1; // temp 中数据右移一位 } } } else { uchar temp = 0xff; LED_PORT = temp; } } } 该程序是用if语句对键值进行筛选,也可以使用switch语句,相关程序在附录中给出。 三、实验步骤及调试过程 1、C51语言程序的编写与调试 依照手册上的例子及课件上的例题,对相关程序进行了理解,编写了键盘控制流水灯的程序(实验原理2.2中已给出)。 打开keil软件,经过新建工程等操作,开始程序的编译。编译过程中,遇到一些问题,并将其解决,直至编译成功。现将问题总结如下: 1.1 调试程序一 问题(1):程序直接复制的不完全手册上的,对对程序进行说明的”//”后面的话写在复制时部分文字跳到了下一行,被认为是程序中的语句,导致程序调试时显示错误 解决:删除空行。修改 // 后面的说明性的文字,使其不在程序中出现。 1.2 调试程序二 问题(1):调试时,显示 TEXT2.C(23): 警告 C206: '_crol_': missing function-prototype 解决:利用循环左移函数_crol_()。它是在intrin.h头文件中定义的一个函数,因此要调用此函数必须先把intrins.h头文件包含进去,该指令是:#include,把头文件包含进去后就可以在程序中调用函数_crol_()了 问题(2):错误 C141: syntax error near 'unsigned' 1234
while(1) //一直循环 {
key = Key_Scan();//在 while(1)里面不断循环执行按键扫描程序 if(key==1) {
uchar temp = 0xFE; while(key==1) {
Delay_ms(500);//延时 0.5s
temp=_crol_(temp,1); //循环左移一位 } }
else if(key==2) {
uchar temp = 0x80; while(key==2) {
temp=_cror_(temp,1); //循环左移一位 } }
else if(key==3) {
while(1) {
uchar temp = 0x01; uchari;
for(i=0; i<8; i++) {
LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); // 延时 temp=temp<<1; // temp 中数据左移一位 }
temp=0x80; // 赋右移初值给temp for(i=0; i<8; i++) {
LED_PORT=~temp; // temp中的数据取反后送P1口 delay_ms(500); ; // 延时 temp=temp>>1; // temp 中数据右移一位 } } } else {
uchar temp = 0xff; LED_PORT = temp; } } }
该程序是用if语句对键值进行筛选,也可以使用switch语句,相关程序在附录中给出。
三、实验步骤及调试过程
1、C51语言程序的编写与调试
依照手册上的例子及课件上的例题,对相关程序进行了理解,编写了键盘控制流水灯的程序(实验原理2.2中已给出)。
打开keil软件,经过新建工程等操作,开始程序的编译。编译过程中,遇到一些问题,并将其解决,直至编译成功。现将问题总结如下: 1.1 调试程序一
问题(1):程序直接复制的不完全手册上的,对对程序进行说明的”//”后面的话写在复制时部分文字跳到了下一行,被认为是程序中的语句,导致程序调试时显示错误 解决:删除空行。修改 // 后面的说明性的文字,使其不在程序中出现。 1.2 调试程序二
问题(1):调试时,显示 TEXT2.C(23): 警告 C206: '_crol_': missing function-prototype
解决:利用循环左移函数_crol_()。它是在intrin.h头文件中定义的一个函数,因此要调用此函数必须先把intrins.h头文件包含进去,该指令是:#include,把头文件包含进去后就可以在程序中调用函数_crol_()了 问题(2):错误 C141: syntax error near 'unsigned'
相关推荐: