在使用 _nop_(); 指令时,需要引用头文件

#include "intrins.h"
当我们需要给整组对 P1 口赋值时:
P1 = 0xfe;
标准库函数:intrins.h
字符型循环左移:_crol_
字符型循环右移:_cror_

举个例子:
#include <intrins.h>
void test_crol (void) 
{
  unsigned char a;
  unsigned char b;
  a = 0xFE;      //1111 1110
  b = _crol_(a,1); // b now is 0xFD  二进制为1111 1101
}


使用字符型循环左移:
#include <intrins.h>
void test_crol (void) {
  unsigned char a;
  unsigned char b;
  a = 0xFE;        //1111 1110
  b = _crol_(a,1); // b now is 0xFD  二进制为1111 1101
}
使用左移运算符
  a = 0xFE;        //1111 1110
  b = a<<1;        // b now is 0xFC  二进制为1111 1100
以上着两者的区别:循环左移是把最高位移到最低位上,左移运算符是把最高位移除最低位补0。

流水灯

	uchar temp = 0xfe;   //声明一个中间变量,用来存储IO状态
	P1 = temp;           //将temp赋值给P1口
	Delay300ms();        //延时
	
	while(1)
	{
		temp = _crol_(temp,1);   //将temp循环左移1位,并赋值给temp
		P1 = temp;               //将temp赋值给P1口
		Delay300ms();            //延时
	}

蜂鸣器

状态取反
beep = ~beep;//	蜂鸣器发出滴滴声

数码管的静态显示与动态显示

共阴极数码码表
0x3F,  //"0"
0x06,  //"1"
0x5B,  //"2"
0x4F,  //"3"
0x66,  //"4"
0x6D,  //"5"
0x7D,  //"6"
0x07,  //"7"
0x7F,  //"8"
0x6F,  //"9"
0x77,  //"A"
0x7C,  //"B"
0x39,  //"C"
0x5E,  //"D"
0x79,  //"E"
0x71,  //"F"
0x76,  //"H"
0x38,  //"L"
0x40,  //"-"
0x00,  //熄灭

动态显示分 “段选” 跟 “位选”

74HC573锁存器

锁存器的作用:可以把数据输入端与输出端进行隔离或连接

![[Pasted image 20260315181937.png|315]]
在这里插入图片描述

  • 输出口Q要想输出高低电平OE使能脚必须接GND
  • LE脚为高时,输出端Q随输入端D的数据而变化。
  • LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据。
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选

WE = 1;     //打开位选锁存器
P0 = 0XFE;  //1111 1110 选通第一位数码管
WE = 0;     //锁存位选数据

DU = 1;     //打开段选锁存器
P0 = 0X06;  //0000 0110 显示“1”
DU = 0;     //锁存段选数据
//第一位数码管  		
P0 = 0XFF;   //清除断码
WE = 1;      //打开位选锁存器
P0 = 0XFE;   //1111 1110
WE = 0;      //锁存位选数据

DU = 1;      //打开段选锁存器
P0 = tabel[bai];
DU = 0;      //锁存段选数据
delay(5);

自适应延时函数

// delay.c 文件

//========================================================================
// 函数: void  Delay_Ms(INT16U ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-8-8
// 备注: 
//========================================================================
void Delay_Ms(INT16U ms)
{
     INT16U i;
	 do{
	      i = MAIN_Fosc / 96000;
		  while(--i)	;   //96T per loop
     }while(--ms);
}
//========================================================================
// 函数: void  Delay5us()
// 描述: 5us延时函数,自动适应11.0592M、12M、22.1184M主时钟。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-8-9
// 备注: 
//========================================================================
void Delay5us()
{
	#if MAIN_Fosc == 11059200
		_nop_();
	#elif MAIN_Fosc == 12000000
		_nop_()
	#elif MAIN_Fosc == 22118400
		_nop_(); _nop_(); _nop_();
	#endif
}

// delay.h 文件

#ifndef	__DELAY_H
#define	__DELAY_H

#include	"REGX52.h"

/*********************************************************/

//#define MAIN_Fosc		24000000UL	//定义主时钟
//#define MAIN_Fosc		22118400UL	//定义主时钟
//#define MAIN_Fosc		12000000UL	//定义主时钟
#define MAIN_Fosc		11059200UL	//定义主时钟
//#define MAIN_Fosc		 5529600UL	//定义主时钟

/*********************************************************/

void Delay_Ms(INT16U ms);
void Delay5us();
#endif

数据类型

// datatype.h 文件

#ifndef		__DATATYPE_H
#define		__DATATYPE_H

/*********************************************************/

typedef bit BOOL;	//位变量
typedef unsigned char 	INT8U;//无符号8位整型变量
typedef signed char		INT8S;//有符号8位整型变量
typedef unsigned int 	INT16U;//无符号16位整型变量
typedef signed int		INT16S;//有符号16位整型变量
typedef unsigned long	INT32U;//无符号32位整型变量
typedef signed long		INT32S;//有符号32位整型变量
typedef float			FP32;  //单精度浮点数(32位长度)
typedef double			FP64;  //双精度浮点数(64位长度)	

typedef unsigned char 	uchar; //无符号8位整型变量
typedef unsigned int	uint;  //无符号16位整型变量
/*********************************************************/

#endif

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐