单片机逻辑取反和按位取反差异
单片机C语言开发逻辑取反和按位取反差异
新手入门容易犯的小错误。
- 在不同条件语句中,注意使用场合。
示例程序
/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */
/*---------------------------------------------------------------------*//************* 功能说明 **************双串口全双工中断方式收发通讯程序。通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.******************************************/#define MAIN_Fosc 11059200L //定义主时钟
#include "STC15Fxxxx.H"
#include "stdio.h"
#define BaudRate1 9600L
#define UART1_BUF_LENGTH 32
#define RX1_Lenth 32 //串口接收缓冲长度
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 1 重装值, 对应300KHZu8 TX1_Cnt; //发送计数
u8 RX1_Cnt; //接收计数
bit B_TX1_Busy; //发送忙标志u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
unsigned char *pchar; //定义一个全局指针void UART1_config(u8 brt); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void PrintString1(u8 *puts);
//========================================================================
// 函数: void delay_ms(unsigned int ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 自动适应主时钟.//========================================================================
void delay_ms(unsigned int ms)
{unsigned int i;do{i = MAIN_Fosc / 13000;while(--i) ; //14T per loop}while(--ms);
}void InitSerialPort(void)
{ SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器时钟1T模式AUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //设置定时器模式TH1 = (u8)(Timer1_Reload >> 8);TL1 = (u8)Timer1_Reload;ET1 = 0; //禁止定时器%d中断TR1 = 1; //定时器1开始计时ES=1; //串口中断开关,采用查询法时不用打开中断 REN=1; //串口为工作方式1,允许接收数据SM0=0; //SM0 SM1串口工作方式选择,01:8位异步收发,波特率由定时器决定SM1=1;
}//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void main(void)
{unsigned int n;P0M1 = 0; P0M0 = 0; //设置为准双向口P1M1 = 0; P1M0 = 0; //设置为准双向口P2M1 = 0; P2M0 = 0; //设置为准双向口P3M1 = 0; P3M0 = 0; //设置为准双向口P4M1 = 0; P4M0 = 0; //设置为准双向口P5M1 = 0; P5M0 = 0; //设置为准双向口P6M1 = 0; P6M0 = 0; //设置为准双向口P7M1 = 0; P7M0 = 0; //设置为准双向口InitSerialPort();//串口初始化EA = 1; //允许总中断PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //SUART1发送一个字符串while (1){delay_ms(500);n = ~0;printf("uint = ~0:%u \r\n",n); //SUART1发送一个字符串n = !0;printf("uint = !0:%u \r\n",n); //SUART1发送一个字符串P10 = !P10;}
}//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字符串函数。
// 参数: puts: 字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void PrintString1(u8 *puts) //发送一个字符串
{for (; *puts != 0; puts++) //遇到停止符0结束{SBUF = *puts;B_TX1_Busy = 1;while(B_TX1_Busy);}
}
//重写putchar函数,方便调用printf串口打印输出char putchar(unsigned char c)
{SBUF = c; //发送数据while(!TI); //等待发送完成TI=0; //清零发送标志位;return c;
}//========================================================================
// 函数: void UART1_int (void) interrupt UART1_VECTOR
// 描述: UART1中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART1_int (void) interrupt UART1_VECTOR
{if(RI){RI = 0;RX1_Buffer[RX1_Cnt] = SBUF; //保存一个字节if(++RX1_Cnt >= RX1_Lenth) RX1_Cnt = 0; //避免溢出处理}if(TI){TI = 0;B_TX1_Busy = 0; //清除发送忙标志}
}
- 无符号整型数值0按位取反就是:
65535
;逻辑取反值:1
单片机逻辑取反和按位取反差异相关推荐
- Verilog逻辑取反与按位取反
Verilog中逻辑取反(取非)用 !,按位取反用~. 取非 ! 表示运算结果只有0(假)与1(真)两种情况: 取反~表示二进制数按位取反. 例如对in=1101分别进行逻辑取反与按位取反: assi ...
- !和~的区别(逻辑取反和按位取反)
在c语言中,!和~均表示取反,这两个的区别在于: ! :代表逻辑取反,即:把非0的数值变为0,0变为1; ~ :表示按位取反,即在数值的二进制表示方式上,将0变为1,将1变为0: 上述其实可以从jav ...
- python逻辑取反的实现
说明 True和False被逻辑取反时要使用not.not是逻辑取反,而~是按位取反. True和False相对应的值为1和0,~True相当于1按位取反,结果为-2,not True的结果为Fals ...
- Python实现逻辑取反
c++中的逻辑取反为! Python用 not 实现逻辑取反 while(not 1):print("进入") print("结束")#结果为: # 结束
- python逻辑取反运算符_python学习笔记------逻辑运算符
条件: 条件可以是:笔记运算符 , 显示布尔值,隐式布尔值 隐式布尔值:大部分都是真,只有0,none,空(字符串,列表等)为假False 逻辑运算符 not:就是把紧跟其后的那个条件,结果取反 pr ...
- java实现js取反_特定位取反(js实现)
去华为面试的时候,没有做好准备工作:面试的流程没有问清也没有查,结果一过去就让上机做题,着实有点措手不及.笔者是擅长前端的Java Web工程师啊,基本的底层编程知识早已生疏了.机试题碰到了这道位运算 ...
- c# 整数取反_按位取反运算符的使用
按位取反运算符的使用 按位取反运算符是按照二进制的每一位取反,比如byte类型,~0的结果就是255. 该功能可以在mask中做一些反转操作 如下代码,a存放了2,4,8三个值.用按位取反'~'运算符 ...
- 取反!和按位取反~的区别
http://blog.csdn.net/pipisorry/article/details/36517411 按位取反"~":按位取反1变0,0变1 逻辑非"!&quo ...
- 单片机c语言中io取反,单片机小白学步(21) IO口:基本的LED和按键操作
原标题:单片机小白学步(21) IO口:基本的LED和按键操作 本篇我们先介绍最基础的几个IO口操作.学完本篇,大家要能自己独立完成下面几个实验. 1.点亮 2.一个按键控制LED,按下灯亮,释放灯灭 ...
最新文章
- Python Beautiful Soup类的基本元素
- matlab的基础使用
- QT乱码总结6.编码测试和总结一
- 数据库连接失败报错com.mysql.cj.jdbc.exceptions.CommunicationsException
- keras笔记(3)-猫狗数据集上的训练以及单张图片多张图片的测试
- 让 API 端点的响应速度提高 50 倍!
- python os path dirname_python中的os.path.dirname(__file__)的使用
- 并行程序调试、测试与模型检测
- 微信点餐系统感悟(上1-6章)
- Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)
- C# Xamarin For Android移动开发基础实战演练
- snmp安装及自定义mib
- 正确理解三极管的放大区、饱和区、截止区
- CSS 字体大小 font-size属性
- java中override快捷键_Java高级应用简笔
- 微信开挂怎么防止封号_越狱过的手机怎样避免外挂微信被封
- [UNR #6]稳健型选手
- 散热性能测试软件,性能测试及散热表现
- CSS基础(14)- 更多的样式
- hive server2源码地址在哪_实战搭建Thinkphp二次开发威客RW平台源码粉丝关注投票发布系统...
热门文章
- 关于浏览器以及各种内置浏览器造成黑屏的解决办法
- java验证码图片滑动验证码_图片滑动验证码的生成
- OPPO reno9,reno8,reno7,reno系列安装Play商店,安装服务框架谷歌Google
- 金仓数据库字段_技术干货 | 超实用!详解人大金仓MPP数据库并行查询技术
- 数据科学家之路 - 个人学习历程和入门规划
- java 格式化日期 注解_详解Java关于时间格式化的方法
- springcloud+zipkin实现链路监控搭建zipkin-server(五)
- android点击按钮打开wifi或者关闭wifi
- java 系统资源不足_atn 编译java提示资源不足
- 爱站和站长之家的SEO综合查询书签工具