/******************************************************************** * 文件名 : 独立按键.c * 描述 : 该程序实现独立按键的判断,按了相应的独立按键后,在LED上进行表现。 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; sbit KEY2 = P3^3; sbit KEY3 = P3^4; sbit LED1 = P0^0; sbit LED2 = P0^1; sbit LED3 = P0^2; /******************************************************************** * 名称 : Delay() * 功能 : 延时,延时时间为 10ms * del * 输入 : del * 输出 : 无 ***********************************************************************/ void Delay(uint del) { uint i,j; for(i=0; i<del; i++) for(j=0; j<1827; j++) ; } /******************************************************************** * 名称 : Delay() * 功能 : 实现按键功能,并在LED上显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void KEY() { if(KEY1==0 || KEY2==0 || KEY3==0) { Delay(2); //20毫秒软件防抖 if(KEY1 == 0) { LED1 = 0; LED2 = 1; LED3 = 1; } if(KEY2 == 0) { LED1 = 1; LED2 = 0; LED3 = 1; } if(KEY3 == 0) { LED1 = 1; LED2 = 1; LED3 = 0; } Delay(50); //延时0.5秒再进行下次按键的检测 } } /******************************************************************** * 名称 : Main() * 功能 : 实现按键控制LED的显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { while(1) { KEY(); } }
/******************************************************************** * 文件名 : 数码管字符显示.c * 描述 : 按下按键,数码管上显示的数字加1。 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY = P3^2; uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; /******************************************************************** * 名称 : Delay() * 功能 : 延时,延时时间为 10ms * del * 输入 : del * 输出 : 无 ***********************************************************************/ void Delay(uint del) { uint i,j; for(i=0; i<del; i++) for(j=0; j<1827; j++) ; } /******************************************************************** * 名称 : Main() * 功能 : 数码管的显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { uchar i = 0; P2 = 7; while(1) { P0 = table[i%16]; //这里i%16是防止table中的数据在0--15,不会溢出 if(KEY == 0) { i++; Delay(30); //延时0.3秒,防止按一次按键,程序自加多次的情况 } } }
/******************************************************************** * 文件名 : 独立按键.c * 描述 : 数码管上最开始显示“88”。 按S1,数码管上的值减1. 按S2,数码管上的值加1. ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; sbit KEY2 = P3^3; sbit KEY3 = P3^4; uint i=88; //数码管的段码编码 uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //下一行的数组可以显示数值外,还可以显示数码管的点 uchar table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1}; /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i) { uint x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Delay() * 功能 : 延时,延时时间为 10ms * del * 输入 : del * 输出 : 无 ***********************************************************************/ void Delay(uchar temp) { uchar j; for(j=0;j<temp;j++) { P0 = table[(i/10)%10]; P2 = 6; Delay_1ms(5); P0 = table[i%10]; P2 = 7; Delay_1ms(5); } } /******************************************************************** * 名称 : Delay() * 功能 : 实现按键功能,并在LED上显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar KEY(void) { if(KEY1==0 || KEY2==0 || KEY3==0) { Delay(2); //20毫秒软件防抖 if(KEY1 == 0) { Delay(10); return 1; } if(KEY2 == 0) { Delay(10); return 2; } if(KEY3 == 0) { Delay(10); return 3; } Delay(10); } return 0; } /******************************************************************** * 名称 : Main() * 功能 : 实现按键控制LED的显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { uchar temp; while(1) { temp = KEY(); if(temp == 1) { i--; } if(temp == 3) { i++; } P0 = 0; P2 = 6; P0 = table[(i/10)%10]; Delay_1ms(3); P0 = 0; P2 = 7; P0 = table[i%10]; Delay_1ms(3); } }
/******************************************************************** * 文件名 : 独立按键.c * 描述 : 这个代码相对于初学者比较麻烦一些。 在数码管上显示全是0. 当按下S18,这个时候是选择某一位数码管,数码管会稍微亮一些。 当按下S19或S17, 这时被选择的那位数码管可以进行加减控制。 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; sbit KEY2 = P3^3; sbit KEY3 = P3^4; //数码管的段码编码 uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar SLED[8]={0}; /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i) { uint x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Delay() * 功能 : 延时,延时时间为 16ms * del , 在延时函数中加入了数码管的操作, 这样按下按键后延时,数码管不会闪烁。 * 输入 : del * 输出 : 无 ***********************************************************************/ void Delay(uchar temp) { uchar i,j; for(j=0;j<temp;j++) { for(i=0;i<8;i++) { P0 = 0; P2 = i; P0 = table[SLED[i]]; Delay_1ms(2); } } } /******************************************************************** * 名称 : Delay() * 功能 : 实现按键功能,并在LED上显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar KEY(void) { if(KEY1==0 || KEY2==0 || KEY3==0) { Delay(2); //20毫秒软件防抖 if(KEY1 == 0) { Delay(10); return 1; } if(KEY2 == 0) { Delay(10); return 2; } if(KEY3 == 0) { Delay(10); return 3; } Delay(10); return 0; } return 0; } /******************************************************************** * 名称 : Main() * 功能 : 实现按键控制LED的显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { uchar temp,i=0,j=0,cs=0; while(1) { temp = KEY(); if(temp == 1) { if(SLED[cs] != 0) { SLED[cs] = SLED[cs] - 1; //被选数码管的值减1 } } if(temp == 2) { if(cs != 7) { cs++; //被选数码管右移一位 } else { cs = 0; } } if(temp == 3) { if(SLED[cs] != 9) { SLED[cs] = SLED[cs] + 1; //被选数码管的值加1 } } for(i=0;i<8;i++) { if(i != cs) { P0 = 0; P2 = i; P0 = table[SLED[i]]; Delay_1ms(1); } else //如果是被选择的那个数码管,进入下面控制 { P0 = 0; P2 = i; P0 = table[SLED[i]]; Delay_1ms(10); //延时时间长一点,这时,数码管更亮 } } } }
/******************************************************************** * 文件名 : 数码管字符显示.c * 描述 : 按下S19按键,数码管上显示的数字加1。 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY = P3^2; /******************************************************************** * 名称 : Main() * 功能 : 数码管的显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { uchar i = 0; P2 = 0xfe; while(1) { if(KEY == 1) { P0 = 0x76; //"H"; } if(KEY == 0) { P0 = 0x38; //"L" } } }
/******************************************************************** * 文件名 : 独立按键.c * 描述 : 首先,在点阵的中间显示一个点。 当您按独立按键的下方或者左右的时候,点阵会随之移动。 ***********************************************************************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; //点左移 sbit KEY2 = P3^3; //点下移 sbit KEY3 = P3^4; //点右移 unsigned char tabP0[]={0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00}; unsigned char tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i)//1ms延时 { uint x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Delay() * 功能 : 实现按键功能,并在LED上显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar KEY(void) { if(KEY1==0 || KEY2==0 || KEY3==0) { Delay_1ms(20); //20毫秒软件防抖 if(KEY1 == 0) { Delay_1ms(100); //延时0.5秒再进行下次按键的检测 return 1; } if(KEY2 == 0) { Delay_1ms(100); //延时0.5秒再进行下次按键的检测 return 2; } if(KEY3 == 0) { Delay_1ms(100); //延时0.5秒再进行下次按键的检测 return 3; } return 0; } return 0; } /******************************************************************** * 名称 : Main() * 功能 : 实现按键控制LED的显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { uchar i,j,tempP0; while(1) { for(i=0; i<8; i++) { if(tabP0[i] != 0) { tempP0 = i; //这里的目的是找出现在的点在哪行 } } switch(KEY()) { case 1: if(tempP0 != 7) //没有到边 { tabP0[tempP0+1]=tabP0[tempP0]; //把数据传给数组的另一位 tabP0[tempP0]=0x00; //本身的这位清零 } break; case 2: j=tabP0[tempP0]; //把j的值左移一位 j = _crol_(j,1); tabP0[tempP0]=j; break; case 3: if(tempP0 != 0) //没有到边 { tabP0[tempP0-1]=tabP0[tempP0]; //把数据传给数组的另一位 tabP0[tempP0]=0x00; //本身的这位清零 } break; default: break; } for(i=0;i<8;i++) { P0=0; P2=tabP2[i]; P0=tabP0[i]; Delay_1ms(2); } } }
/******************************************************************** * 文件名 : 点阵显示.c * 描述 : 按下相应的独立按键,会在数码管上显示相应的左右中 按S19显示左 按S18显示中 按S17显示右 ***********************************************************************/ #include <reg52.H> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit KEY1 = P3^2; sbit KEY2 = P3^3; sbit KEY3 = P3^4; unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //中 的编 unsigned char code tabP0ZHONG[]={0x00,0x3C,0x24,0x24,0xFF,0x24,0x24,0x3C}; //“左”的 unsigned char code tabP0Z[]={0x00,0x94,0x94,0xF4,0x9F,0x94,0x24,0x44}; //“右”的 unsigned char code tabP0Y[]={0x00,0xF4,0x94,0x94,0x9F,0xF4,0x24,0x44}; /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uchar i)//1ms延时 { uchar x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Delay() * 功能 : 实现按键功能,并在LED上显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar KEY(void) { if(KEY1==0 || KEY2==0 || KEY3==0) { Delay_1ms(20); //20毫秒软件防抖 if(KEY1 == 0) { Delay_1ms(100); //延时0.1秒再进行下次按键的检测 return 1; } if(KEY2 == 0) { Delay_1ms(100); //延时0.1秒再进行下次按键的检测 return 2; } if(KEY3 == 0) { Delay_1ms(100); //延时0.1秒再进行下次按键的检测 return 3; } return 0; } return 0; } /******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main() { int i,temp,flag; while(1) { temp = KEY(); if(temp != 0) //这里判断是否按键按下,按下后,才改变要显示的值 { flag = temp; //存标志 } for(i=0;i<8;i++) { P0=0; P2=tabP2[i]; if(flag == 1) { P0=tabP0Z[i]; //显示“左” } if(flag == 2) { P0=tabP0ZHONG[i]; //显示 中 } if(flag == 3) { P0=tabP0Y[i]; //显示“右” } Delay_1ms(2); } } }
/******************************************************************** * 文件名 : 独立按键.c * 描述 : 该程序实现独立按键的判断,按了相应的独立按键后, 会在数码管上显示最先被按下的值,只有按复位按键或者重新开电才消失。 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; sbit KEY2 = P3^3; sbit KEY3 = P3^4; //数码管的段码编码 uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i) { uint x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Delay() * 功能 : 实现按键功能,并在LED上显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar KEY(void) { if(KEY1==0 || KEY2==0 || KEY3==0) { Delay_1ms(20); //20毫秒软件防抖 if(KEY1 == 0) { Delay_1ms(200); return 1; } if(KEY2 == 0) { Delay_1ms(200); return 2; } if(KEY3 == 0) { Delay_1ms(200); return 3; } Delay_1ms(200); } return 0; } /******************************************************************** * 名称 : Main() * 功能 : 实现按键控制LED的显示 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Main(void) { uchar temp,i=0,j=0,cs=0; while(1) { temp = KEY(); //判断是否有按键按下 if(temp != 0) { break; //如果按下,那么退出循环 } } P0 = table[temp]; //显示是哪个按键按下了 P2 = 7; while(1); //程序停止 }
/******************************************************************** * 文件名 : 步进电机.c * 描述 : 按键的长短键操作。 按了按键后,数码管的值加减1。 如果长按住,会发现数码管快速加减。 ***********************************************************************/ #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; //数码管的值加1 "S19" sbit KEY2 = P3^4; //数码管的值减1 "S17" uint angle = 100; uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay(uint i) { uchar x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Delay_LED() * 功能 : 延时代码,延时3毫秒,在延时中加入了数码管的显示,防止按键时抖动 * 输入 : del * 输出 : 无 ***********************************************************************/ void Delay_LED(uchar del) { uchar i; for(i=0;i<del;i++) { P0 = 0x00; P2 = 7; P0 = table[angle%10]; Delay(1); P0 = 0x00; P2 = 6; P0 = table[angle/10%10]; Delay(1); P0 = 0x00; P2 = 5; P0 = table[angle/100%10]; Delay(1); } } void KEY(void) { if((KEY2 == 0) && (angle > 0)) //按P3.4,数码管的值减1 { Delay(15); if((KEY2 == 0) && (angle > 0)) { angle--; } Delay_LED(100); if((KEY2 == 0) && (angle > 0)) { Delay_LED(100); angle--; if((KEY2 == 0) && (angle > 0)) { Delay_LED(80); angle--; while(1) //进入循环,里面进行长键检测 { if((KEY2 == 0) && (angle > 0)) { angle--; Delay_LED(20); } else { break; } } } } } if(KEY1 == 0) //按P3.4,数码管的值加1 { Delay_LED(15); if(KEY1 == 0) { angle++; } Delay_LED(100); if(KEY1 == 0) { Delay_LED(100); angle++; if(KEY1 == 0) { Delay_LED(80); angle++; while(1) //进入循环,里面进行长键检测 { if(KEY1 == 0) { angle++; Delay_LED(20); } else { break; } } } } } } main() { while(1) { KEY(); Delay_LED(1); } }