嵌入式学习——51单片机——day16

1. 位运算在单片机中的使用

      & : 按位与   (与0得0、与1不变)(全1为1,有0得0)指定位置0

            1. 让一个字节第n位(从右往左第n位)置0

                P0 &= ~(1 << n); 

             2. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置0:

                P0 &= ~((1 << n) | (1 << m));

            3. 判断一个字节某一位是否为1

int i = 0xaaaaaaaa;

if ((i & (1 << n) != 0)
{
    printf("第n位是 1 \n");
}else
{
    printf("第n位是 0 \n");
}

            4. 判断一个字节某一位是否为0

int i = 0xaaaaaaaa;

if ((i & (1 << n)) == 0)
{
    printf("第n位是 0 \n");
}else
{
    printf("第n位是 1 \n");
}

       | : 按位或 (或1得1、或0不变)(全0为0,有1得1)指定位置1

            1. 让一个字节第n位(从右往左第n位)置1:

                P0 |= (1 << n);

            2. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置1:

                P0 |=  ((1 << n) | (1 << m));

      ^ :按位异或 (相同为0、相异为1)    (异或1翻转原位, 异或0原位不变)      指定位翻转

            1.  num ^ num == 0        num ^ 0 == num

            2. 让一个字节整体翻转

                 P0 ^= 0XFF;  

        <<       左移       放大:乘以2^n

        >>       右移       缩小:除以2^n

        ~        按位取反

2. 单片机流水灯程序

        1. 主函数

#include <reg51.h>
#include "led.h"

void delay(unsigned int n)
{
	while (n--);
}

int main(void)
{
	while (1)
	{
		int i = 0;

		for (i = 0; i < 8; i++)
		{
			led_on_n(i);
			delay(0xffff);
		}

		for (i = 7; i >= 0; i--)
		{
			led_on_n(i);
			delay(0xffff);
		}	
	}

	return 0;
}

        2. 头文件

#ifndef _LED_H_
#define _LED_H_

extern void init_led(void);
extern void led_all_on(void);
extern void led_all_off(void);
extern void led_all_nor(void);
extern void led_on_n(unsigned int n);

#endif

        3. 源文件

#include <reg51.h>
#include "led.h"

void init_led(void)
{
	P2 = 0XFF;
}

void led_all_on(void)
{
	P2 = 0;
}

void led_all_off(void)
{
	P2 = 0XFF;
}

void led_all_nor(void)
{
	P2 ^= 0XFF;
}

void led_on_n(unsigned int n)
{
	P2 = ~(1 << n);
}

3. 单片机数码管程序

        1. 主函数

#include <reg51.h>
#include "digit.h"

void delay(unsigned int n)
{
	while (n--);
}

int main(void)
{
	int cnt = 0;
	int n = 0;

	while (1)
	{
		cnt = 0x5f;
		while (cnt != 0)
		{
			show_number(n);
			cnt--;			
		}
		n++;
	}

	return 0;
}

        2. 头文件

#ifndef _DIGIT_H_
#define _DIGIT_H_

extern void display(int digit, int n);
extern void show_number(unsigned int n);

#endif

        3. 源文件

#include <reg51.h>
#include "digit.h"

void display(int digit, int n)
{
	unsigned char a[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
	P1 &= ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3));
	P1 |= (1 << digit);
	P0 = a[n];
}

void show_number(unsigned int n)
{
	int i = 0;
	int j = 0;

	while (n != 0)
	{
		i = n % 10;
		n /= 10;
		display(j++, i);
	}
}

                    

相关推荐

  1. 嵌入学习——51单片机——day16

    2024-05-09 22:24:03       30 阅读
  2. 嵌入学习——51单片机——(按键、中断)day17

    2024-05-09 22:24:03       34 阅读
  3. 嵌入学习 Day17

    2024-05-09 22:24:03       49 阅读
  4. 嵌入学习day10

    2024-05-09 22:24:03       36 阅读
  5. 嵌入学习day11

    2024-05-09 22:24:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 22:24:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 22:24:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 22:24:03       82 阅读
  4. Python语言-面向对象

    2024-05-09 22:24:03       91 阅读

热门阅读

  1. 【QT教程】QT6硬件数据库编程 QT硬件数据库

    2024-05-09 22:24:03       25 阅读
  2. 子集II(力扣90)

    2024-05-09 22:24:03       30 阅读
  3. [力扣题解]131. 分割回文串

    2024-05-09 22:24:03       32 阅读
  4. 【收录 Hello 算法】3.2 基本数据类型

    2024-05-09 22:24:03       33 阅读
  5. 闰年的数目

    2024-05-09 22:24:03       33 阅读
  6. Robots协议的一点知识

    2024-05-09 22:24:03       32 阅读
  7. 计算机网络chapter2——家庭作业

    2024-05-09 22:24:03       24 阅读