51单片机用K1-K3控制数码管移位显示设计 功能:1.按下 K1 时加1 计数并增加显示位, 2.按下K2 时减1 计数并减少显示位, 3.按下K3 时清零。 #include<reg51.h> //头文件 #define uchar unsigned char // 把uchar 定义为usigned char 为后面定义的时候方便 #define uint unsigned int uchar code acode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//其阳极数码管0到9的数字,即为段码 uchar codeindex[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位码 ucharbuffer[]={0,10,10,10,10,10,10,10};//待显示到各数码管的数字缓冲(开始仅在0位显示0,其他黑屏) void delay(uchar x) //延时程序 { uchar i; while(x--) for(i=0;i<120;i++); } void show() //显示程序 { uchar i; for(i=0;i<8;i++) { P0=0xff;//消除对P0口的影响 P0=acode[buffer];//P0口为连接数码管的端口 P2=index;// 位选 delay(2);//延时 } } void main()//主程序 { uchar i,key1,keycount=0;//定义变量i,key1,keycount P0=0xff; P1=0xff; P2=0x00; while(1) { show(); P1=0xff; key1=P1;/将P1的状态保存到key1中 switch (key1)//通过P1的状态来决定作什么操作 { case 0xfe: keycount++;//当P1=0xfe时即P1.0=0,即k1按下 if(keycount>8) keycount=8; buffer[keycount-1]=keycount;//按下 K1 时加1 计数并增加显示位 break; case 0xfd: if(keycount>0) buffer[--keycount]=10;//当P1=0xfd时即P1.1=0,即k2按下 break; 按下 K2时减1 计数并减少显示位 case 0xfb: buffer[0]=0; for(i=0;i<8;i++) buffer=10;//当P1=0xfb时即P1.2=0,即k2按下 keycount=0;//按下K3 时清零。 } while(P1!=0xff) show(); //查询是否有键按下,若没有继续判断,若有则显示出来相应结果 } } Protues仿真图: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
|