矩阵按键控制动态数码管

mac2024-06-04  52

#include<reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit KZA=P2^2; //位定义 sbit KZB=P2^3; sbit KZC=P2^4; #define GPIO_key P1 #define GPIO_DIG P0 u8 KeyValue; u8 code shumag[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay(u16 i) { while(i--); } void KeyDown() //按键判定 { char a=0; GPIO_key=0x0f; if(GPIO_key!=0x0f) { delay(1000); if(GPIO_key!=0x0f) { GPIO_key=0x0f; switch(GPIO_key) { case 0x07:KeyValue=0;break; case 0x0b:KeyValue=1;break; case 0x0d:KeyValue=2;break; case 0x0e:KeyValue=3;break; } GPIO_key=0xf0; switch(GPIO_key) { case 0x70:KeyValue=KeyValue;break; case 0xb0:KeyValue+=4;break; case 0xd0:KeyValue+=8;break; case 0xe0:KeyValue+=12;break; } /*while((a<50)&&(GPIO_key!=0xf0)) { delay(1000); a++; }*/ } } while((a<50)&&(GPIO_key!=0xf0)) { delay(100); a++; } } void xianshi() //数码管显示 { u8 i; for(i=0;i<8;i++) //循环输出 { switch(i) //数码管选择 { case 0: KZA=0;KZB=0;KZC=0;break; case 1: KZA=1;KZB=0;KZC=0;break; case 2: KZA=0;KZB=1;KZC=0;break; case 3: KZA=1;KZB=1;KZC=0;break; case 4: KZA=0;KZB=0;KZC=1;break; case 5: KZA=1;KZB=0;KZC=1;break; case 6: KZA=0;KZB=1;KZC=1;break; case 7: KZA=1;KZB=1;KZC=1;break; } GPIO_DIG=~shumag[KeyValue]; delay(1000); //延时,视觉暂留 P0=0x00; } } void main() { while(1) { KeyDown(); //GPIO_DIG=~shumag[KeyValue]; xianshi(); } }

整体实现还行,数码管闪烁严重,不能一直显示静态画面

最新回复(0)