15614423926 发表于 2023-5-21 10:16:11

冲哥8051实验箱-STC32G12K128第八集:蜂鸣器的应用

本帖最后由 15614423926 于 2023-5-22 11:16 编辑

1、打印异常,我逻辑已经混乱了,代码如下:

u8 Run_Mode = 0;      //0-8 开关变量 0:没有模式

BEEP = 0;                        //打开蜂鸣器
delay_ms(100);
BEEP = 1;                        //关闭蜂鸣器

Run_Mode++;                        //模式选择
if(Run_Mode > 8)      //如果模式大于8
Run_Mode = 1;                //回到模式1

printf("模式值:%d \r\n",Run_Mode);
printf("模式值-1:%d \r\n",(Run_Mode-1));
printf("模式值-1后左移一位:%d \r\n",1 << (Run_Mode-1));
printf("模式值-1后左移一位且取反:%x \r\n",(u8)~(1 << (Run_Mode-1)));
P2 =~(1 << (Run_Mode-1));      //1<<10000 0001 -> 1111 1110

printf("P2:%x \r\n",P2);

2、串口打印如下


3、若要实现流水灯,需按以下输出实现


4、
疑惑点1:初始状态为模式1,P2 =~(1 << (Run_Mode-1));其中Run_Mode-1值为0,接下来的执行的左移应该也是0,为什么是1;
解答:左移右移的逻辑关系搞混了
1<<0 ->0000 0001 << 0 -> 0000 0001
1<<1 ->0000 0001 << 1 -> 0000 0010
1<<2 ->0000 0001 << 2 -> 0000 0100
1<<3 ->0000 0001 << 3 -> 0000 1000
1<<4 ->0000 0001 << 4 -> 0001 0000
1<<5 ->0000 0001 << 5 -> 0010 0000
1<<6 ->0000 0001 << 6 -> 0100 0000
1<<7 ->0000 0001 << 7 -> 1000 0000

疑惑点2:printf("模式值-1后左移一位且取反:%x \r\n",(u8)~(1 << (Run_Mode-1)));不加强制转换符打印出来的是FFFE,这是原因,起初已用全局变量定义Run_Mode为u8;
解答:同上

疑惑点3:为什么printf("模式值-1后左移一位且取反:%x \r\n",(u8)~(1 << (Run_Mode-1)));和printf("P2:%x \r\n",P2);打印出输出数据不一样,且P2值错误;
解答:加延时即可解决




老工程师果然经验丰富,扎实的基础也是必须的
{:4_246:}










页: [1]
查看完整版本: 冲哥8051实验箱-STC32G12K128第八集:蜂鸣器的应用