题目要求:
设计一个4X4的矩阵键盘,键盘的号码0~F,要求编写出一个键盘输入扫描程序,要求单片机能根据键盘排列顺序,能将按下去键盘号正确识别出来,并采用两个数码管分别显示键盘号码的个位和十位。
问题:第一个数码管总是没数值,一直全亮,就是不显示正确的数值。第二个数码管是正常的,我该程序改了好久,但是不知道为什么第一个数码管总是没反应。
原理图:
程序:
#include "reg51.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
#define matrix_ranks P1
sbit A=P2^6;
sbit B1=P2^7;//定义两个数码管的位选端
u8 smg_x;
u8 display[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void smg_display(u8 smg_x,u8 k)
{
switch(smg_x)
{
case 1:
A=1;B1=0;break;
case 2:
A=0;B1=1;break;
}
SMG_A_DP_PORT=display[k];
delay_ms(1);
SMG_A_DP_PORT=0x00;//消隐
}
void matrix_key(void)
{
matrix_ranks=0xfe;
if(matrix_ranks!=0xfe)//第一列为低电平
{
delay_ms(1);//消除抖动
switch(matrix_ranks)
{
case 0xee: smg_display(1,0);smg_display(2,0);break;
case 0xde: smg_display(1,0);smg_display(2,4);break;
case 0xbe: smg_display(1,0);smg_display(2,8);break;
case 0x7e: smg_display(1,1);smg_display(2,2);break;
}
}
matrix_ranks=0xfd;
if(matrix_ranks!=0xfd)//第二列为低电平
{
delay_ms(1);//消除抖动
switch(matrix_ranks)
{
case 0xed: smg_display(1,0);smg_display(2,1);break;
case 0xdd: smg_display(1,0);smg_display(2,5);break;
case 0xbd: smg_display(1,0);smg_display(2,9);break;
case 0x7d: smg_display(1,1);smg_display(2,3);break;
}
}
matrix_ranks=0xfb;
if(matrix_ranks!=0xfb)//第三列为低电平
{
delay_ms(1);//消除抖动
switch(matrix_ranks)
{
case 0xeb: smg_display(1,0);smg_display(2,2);break;
case 0xdb: smg_display(1,0);smg_display(2,6);break;
case 0xbb: smg_display(1,1);smg_display(2,0);break;
case 0x7b: smg_display(1,1);smg_display(2,4);break;
}
}
matrix_ranks=0xf7;
if(matrix_ranks!=0xf7)//第四列为低电平
{
delay_ms(1);//消除抖动
switch(matrix_ranks)
{
case 0xe7: smg_display(1,0);smg_display(2,3);break;
case 0xd7: smg_display(1,0);smg_display(2,7);break;
case 0xb7: smg_display(1,1);smg_display(2,1);break;
case 0x77: smg_display(1,1);smg_display(2,5);break;
}
}
}
void main()
{
while(1)
{
matrix_key();
}
}
#include "stdio.h"
#include "math.h"
int main()
{
int i,j,k;
for(i=100000;i <=999999;i++){
j=i;
k=0;
while(j!=0){
k=k*10+j%10;
j=j/10;
}
if(i==k&&(int)sqrt(i)==sqrt(i))
printf("%d\n",i);
}
}
//需要引入的文件
#include "stdio.h"
int main() {
int a=836,b,c,d,j;
a*=a;
c=a;
for (int i = 0; i < 1; i++)
{
d=5;
for (int i = 0; i < 6; i++)
{
b=(a%10) ;
j+=b*pow(10,d--);
a=a/10;
}
if (c==j)
{
printf("%d",c);
}
else
printf("%d",c);
}
}