在使用 _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锁存器
锁存器的作用:可以把数据输入端与输出端进行隔离或连接


-
输出口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