51单片机 大神谁能帮我解读一下下面的编程 #include<reg52.h> #define unit unsig

2025-04-13 15:37:54
推荐回答(1个)
回答(1):

#include//包含52头文件
#define unit unsigned int//宏定义 无符号整型
#define uchar unsigned char//宏定义 无符号字符型

sbit duanx=p2^6;//数码管段选引脚(估计是锁存器,这就是典型的不规范取名)
sbit weix=p2^7;//数码管位选引脚(从程序看,估计也是锁存器,不规范+1)
uchar show[]={//无符号字符型 数组
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//共阴数码管代码表"0-9"、"AbCdEF"

void keyscan(void)//按键扫描函数
{key=16;//清按键值 (16代表无按键键值),没定义先使用,难道不报警吗??
p3=0xf0;k_tmp=p3&0xf0;//4×4键盘(P3口)行线((低4位,也可能叫列线)置0,列线(高4位,也可能叫行线)作为扫描口,读取扫描结果,存到临时变量 k_tmp(问题是这临时变量也没定义)
if(k_tmp==0x70)key=0;//如果第0列(按0-3列算吧)有按键,key记录 0列
else if(k_tmp==0xb0)key=1;//否则,如果第1列有按键,key记录 1列
else if(k_tmp==0xd0)key=2;//否则,如果第2列有按键,key记录 2列
else if(k_tmp==0xe0)key=3;//又否则(烦不烦),如果第3列有按键,key记录 3列
p3=0x0f;k_tmp=p3&0x0f;//转置行列,行线作为扫描。读取 扫描结果,又存到临时变量k_tmp
if(k_tmp==0x70)key=key+12;//如果第0列(没看错,是 0列,本想写第3行的,估计复制后犯傻)有按键,则记录值+12(每行4个按键,跨越3行,+12)
else if(k_tmp==0x0b)key=key+8;//否则,如果第2行有按键,记录值 +8
else if(k_tmp==0x0d)key=key+4;//否则,如果第1行有按键,记录值 +4
else if(k_tmp==0x0e)key=key+0;//还否则(无聊),如果第0行有按键,记录值,额,不用加了。
view=show[key];//视图(我也不懂咋翻译 view) 存储 按键值 对应 的数码管代码

void display(uchar view)//显示函数,形参:无符号字符型“视图”
{p0=view;duanx=1;duanx=0;//将“视图”(就是按键值对应的数码管代码)赋值给P0(原来P0才是 数码管 段选),所谓“段选”拉高又拉低(锁存器输出)
p0=0xfe;weix=1;weix=0;//P0=0xfe,估计就是8个数码管中的第一个数码管位选数据了,再所谓“位选”拉高又拉低(又是锁存器搞的鬼)

main()//主函数
{ while(1)//循环系统
{keyscan();//调用 按键扫描函数
display(view);//调用 显示函数,显示“视图”

}//没了