单片机编程小技巧总结--随时更新

字节操作修改位

设置TMOD

将定时器0设置为模式1,且不干扰定时器1配置

TMOD = TMOD&0xF0;//高四位不变,低四位清零
TMOD = TMOD|0x01;//高七位不变,最低位置1

简写

TMOD &= 0xF0;
TMOD|= 0x01;

数码管扫描

动态扫描switch简写

P0 = 0xFF;
P1 = (P1 & 0xF8) | i;
P0 = LedBuff[i];
if(i < 5)
    i++;
else
     i = 0;

注:这部分与硬件有关,不能照搬,需要对应自己数码管电路

 0xF8即为二进制11111000,与P1与即,不改变P1高5为,后3为置零;与i或则第三位值为i。

 我的数码管由三八译码器控制;

引脚分别为P2^0, P2^1, P2^2.记为P20, P21, P22.

按P22,P21,P20顺序,初始值全为1,即0b111,

减1为0b110,此时小灯亮

再减1为0b101,此时末尾数码管亮(最右边)

再减1为0b100,此时从右边数第二个数码管亮,以此类推

十进制 二进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111

所以按顺序应为:(P1&0xF8)|(~(i+1))

注:
直接P1 等于一个值,P1^0对应的是这个值的二进制最低位。

P1=2,2的二进制是 10,送到 1 位引脚的数据,只能是末尾的 0。

--欢迎各位补充

原文地址:https://www.cnblogs.com/hgyzm/p/14446693.html