这个程序不懂,请问可以帮忙看一下吗?

#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit BEEP = P3^7;uchar code DSY_CODE[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};uchar Pre_KeyNO = 16,KeyNO = 16;(这个不懂)void DelayMS(uint ms){ uchar t; while(ms--) { for(t=0;t<120;t++); }}void Keys_Scan(){ uchar Tmp; P1 = 0x0f; DelayMS(1); Tmp = P1 ^ 0x0f;(是检测地位有没有1吗) switch(Tmp) { case 1: KeyNO = 0; break; case 2: KeyNO = 1; break; case 4: KeyNO = 2; break; case 8: KeyNO = 3; break; default: KeyNO = 16; } P1 = 0xf0; DelayMS(1); Tmp = P1 >> 4 ^ 0x0f;(这个不懂) switch(Tmp) { case 1: KeyNO += 0; break;(为什么有+) case 2: KeyNO += 4; break; case 4: KeyNO += 8; break; case 8: KeyNO += 12; }}void Beep(){ uchar i; for(i=0;i<100;i++) { DelayMS(1); BEEP = ~BEEP; } BEEP = 1;}void main(){ P0 = 0x00;(这个不懂) while(1) { P1 = 0xf0; if(P1 != 0xf0) Keys_Scan(); if(Pre_KeyNO != KeyNO)(不懂) { P0 = ~DSY_CODE[KeyNO];(不懂) Beep(); Pre_KeyNO = KeyNO;(Pre_KeyNO, KeyNO分别是什么意思啊) } DelayMS(100); }}还有P1口,P0口分别代表什么啊!O(∩_∩)O谢谢!
2026年09月18日 15:40
有1个网友回答
网友(1):

脱离了硬件不太好理解,不过大体应该是
0.0问题:还有P1口,P0口分别代表什么啊!O(∩_∩)O谢谢!
这是最基本的,可能那你不是搞硬件的,那是单片机的IO口

1uchar Pre_KeyNO = 16,KeyNO = 16;(这个不懂)
这两个应该是来实现一个消抖的功能
2Tmp = P1 ^ 0x0f;(是检测地位有没有1吗)
逻辑与取低四位
3case 1: KeyNO += 0; break;(为什么有+)
和后面的一起表示那个按下的意思,不能单独理解
4P0 = 0x00;(这个不懂)
置零,和内部有关
5if(Pre_KeyNO != KeyNO)(不懂
消抖
6P0 = ~DSY_CODE[KeyNO];(不懂
表示有按键按下
7P0 = ~DSY_CODE[KeyNO];(不懂)
表示有按键按下
8Pre_KeyNO = KeyNO;(Pre_KeyNO, KeyNO分别是什么意思啊)
消抖的辅助工具
9 ok