- 4X4按键和数码管
- 一、8位数码管从左至右显示数字1-8
- 二、读入4X4按键,按下不同的按键可以在最右侧数码管显示数字0-F
- 三.将4X4按键和8位LED数码管结合,按下不同的按键,在数码管不同的位置显示
- 总结
实验仿真图:
控制数码管片选的是3-8译码器74HC138
该芯片数据如下
代码如下(示例):
#include二、读入4X4按键,按下不同的按键可以在最右侧数码管显示数字0-F#include #define uchar unsigned char #define uint unsigned int sbit L1=P1^0; //位定义 定义矩阵键盘的四条列线 sbit L2=P1^1; sbit L3=P1^2; sbit L4=P1^3; uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管0-F //{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};//共阳数码管0-9 void delay(uint t) { uchar i; while(t--) for(i=0;i<200;i++); } void main() { uchar i,temp=0xfc,j=0x7f;//fc 1111 1100 7f 0111 1111 while(1) { for(i=1;i<9;i++) { P2=temp;//P2的3、4、5口连接3-8译码器,译码器接数码管片选 P0=dis_code[i];//循环亮对应的数字 temp=temp-1;//亮下一个数码管 temp=temp&0xfc;//与1111 1100,这样上面的temp减一就会是从倒数第三位,即P2^2开始减 delay(360); } } }
代码如下(示例):
#include三.将4X4按键和8位LED数码管结合,按下不同的按键,在数码管不同的位置显示#include #define uchar unsigned char #define uint unsigned int sbit L1=P1^0; //位定义 定义矩阵键盘的四条列线 sbit L2=P1^1; sbit L3=P1^2; sbit L4=P1^3; uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管0-F //{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};//共阳数码管0-9 void delay(uint t) { uchar i; while(t--) for(i=0;i<200;i++); } void main() { uchar i,temp; P0=0x00; while(1) { P1=0x7f;//7f是0111 1111,行扫描初值,开始扫描第一行P1^7那一行 for(i=0;i<4;i++)//循环扫描四行 { P2=0x00;//数码管灭 if(L1==0) P0=dis_code[i*4+0];//当L1出现低电平,即P1^0那行,凉数 if(L2==0) P0=dis_code[i*4+1]; if(L3==0) P0=dis_code[i*4+2]; if(L4==0) P0=dis_code[i*4+3]; delay(25); temp=P1; temp=temp|0x0f;//或0f 0000 1111 或0为本身,或1为1,让高四位(行线)不变,列线为1 temp=_cror_(temp,1);//右移一位 P1=temp;//赋值给P1口,下次循环扫描下一行 } } }
程序的问题:按按键时有的按键需要长按一会数码管才会有显示,感觉应该是检测时一个太快的低电平单片机检测不出来,需要给一定时间的低电平。
代码如下(示例):
#include#include #define uchar unsigned char #define uint unsigned int sbit L1=P1^0; //位定义 定义矩阵键盘的四条列线 sbit L2=P1^1; sbit L3=P1^2; sbit L4=P1^3; uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管0-F //{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};//共阳数码管0-9 //uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code a[]={0xff,0xf8,0xf4,0xf0,0x0f,0x08,0x07,0x00,0xff,0xf8,0xf4,0xf0,0x0f,0x08,0x07,0x00};//P2口连接的是3-8译码器 根据译码器的真值表,ff到00是亮第1到第8个数码管 void delay(uint t) { uchar i; while(t--) for(i=0;i<200;i++); } void main() { uchar i,temp; P0=0x00; while(1) { P1=0x7f; //P0=0x00; for(i=0;i<4;i++) { if(L1==0) {P0=dis_code[i*4+0];P2=a[i*4+0];} if(L2==0) {P0=dis_code[i*4+1];P2=a[i*4+1];} if(L3==0) {P0=dis_code[i*4+2];P2=a[i*4+2];} if(L4==0) {P0=dis_code[i*4+3];P2=a[i*4+3];} delay(50); temp=P1; temp=temp|0x0f; temp=_cror_(temp,1); P1=temp; } } }
该处使用的url网络请求的数据。
总结
挺好



