对于一些状态的集合,尽可能使用enum而不是#define 来定义。
如:
enum {OFF = 0, ON = 1};
远比
#define OFF 0
#define ON 1
好。
两种写法编译的效果是一样的,但是写程序及看程序的人员来说感觉就不一样了。用enum定义时,可以觉得OFF与ON是一个集合,有相关性(且可减少程序中#define的定义)。但用#define定义时,完全可认为OFF与ON不相干。特别是在程序中#define定义过多时,查找并理解它的意思都是一个痛苦。(如:uc/os,看见它的一大堆#define都头大,要完全明白那一堆定义都得花不少时间)
第二,程序中少用
#if
#ifdef
等条件编译。不符合条件的程序段是不被编译的,都不检查语法错误,当在某些情况下打开了条件开关时,也许一堆错误就出现了。而且程序并不利于阅读,当读程序时突然得去查找某东东是否#define真是痛苦。
好了,下面是我的习惯
1、I/O口输出电平定义一下,以后万一I/O电平驱动取反,一改就好。
//I/O Port Stutes
enum {OFF = 0, ON = 1};
//Led Stutes
enum {LED_ON = 0, LED_OFF = 1};
eg. LED = LED _ON; //低电平驱动LED亮。
2、I/O口与任何的其它IC接口,I/O口都要定义,不能直接使用I/O口。(方便以后用于其它的应用中)
如93C46:
#define CS93C46 P1_0 //片选信号
#define SK93C46 P1_1 //时钟信号
#define DI93C46 P1_2 //数据输入,相对93C46而言 (即93C46的数据输入)
#define DO93C46 P1_3 //数据输出
如字符型LCD:
#define LCDPORT P0 //lcd数据口
#define RS P1_7 //数据指令选择。低--ins ; 高--data
#define RW P1_6 //读写选择。 低--w ; 高--r
#define EN P1_5 //使能。 高到低--使能。
3、键盘口要定义输入口及屏蔽字
如:
#define KEYMASK 0x0f
#define KEYPORT P2
4、串口用中断驱动,要带Buf。
5、取按键的程序及串口的程序编2个,一个为非阻塞式,一个为阻塞式(不按键或不收到数据不返回)。
6、晶振频率要定义
#define FOSC 11059200ul //频率
7、波特律定义
#define BAUD 4800 //波特率4800
#define SMODX 0 //是否倍频 0-NO or 1-YES
#define T1H_VAL (256 - (UINT8)(FOSC * (1<
#define T1L_VAL T1H_VAL
8、延时程序赋值时写成FOSC函数,编译器会预先算,不占用MCU资源
以后移植方便
9、液晶程序一定要定义长宽
如点阵型:
#define ROW 64
#define CLUM 128
字符型:
#define ROW 4
#define CLUM 20
#define ROW1_ADDR (0x80 + 0) //第一行地址
#define ROW2_ADDR (ROW1_ADDR + 0x40) //第二行地址
#define ROW3_ADDR (ROW1_ADDR + CLUM) //第三行地址
#define ROW4_ADDR (ROW2_ADDR + CLUM) //第四行地址
然后所有的和液晶地址有关的计算全部引用这2个量。
换用任何屏直接一改,高层不变
10、驱动层与应用接口层分在不同的文件,移植方便。
如:键盘、LCD、串口等。
关键字:单片机程序 习惯
引用地址:
单片机程序的一些习惯
推荐阅读最新更新时间:2024-03-16 15:10
PIC单片机 读/写 MMC/SD 卡的简单小程序
这里介绍一个简单的PIC单片机 读/写 MMC/SD 卡的小程序 // MMC module connections sbit Mmc_Chip_Select at LATC0_bit; // for writing to output pin always use latch (PIC18 family) sbit Mmc_Chip_Select_Direction at TRISC0_bit; // eof MMC module connections const LINE_LEN = 43; char err_txt = FAT16 not found ; char file_contents = X
[单片机]
51单片机8乘8点阵LED显示原理及程序
在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。 1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。 2. 硬件电路 3.汇编源程序 ORG 00
[单片机]
PIC单片机程序设计的基本格式
为了快速掌握PIC单片机源程序的基本结构,这里给出一个典型的程序结构框架。建立源程序时首先用伪指令TITLE提供程序的标题,接着给出整个程序的总说明,并用列表伪指令LIST指定所用单片机型号和文件输出格式,再利用INCLUDE伪指令读入MPASM中提供的定义文件如《P16F84INC》,然后对片内常用资源进行定义,再给出一般程序的基本结构框架。现举例如下。 TITLE“This is……”;程序标题 ;程序说明 LIST P="16F84",F=1NHX8M ; include -config_RC_Qsc &_WDT_0FF… ;资源定义和变量定义 STATUS EQU 03 FSR EQU
[单片机]
用PComm开发PC机与单片机的通信程序
摘要:介绍了分布式控制系统中上位PC机与下位单片机异步串行通信的通信协议;同时介绍了在VC++6.0环境下用PComm编写的PC机通信程序来实现上位机和下位机异步串行通信的方法,给出了PComm编程实例和下位机程序模块流程图。
关键词:分布式控制系统;异步;串行通信;PComm
在由一台PC机(上位机)和多台单片机(下位机)构成的分布式控制系统中,单片机主要负责实时数据采集,并将初步处理后的数据通过串行口传送给PC机以便由PC机串行口的命令对单片机进行控制,同时通过打印机或显示器向用户随时提供各种统计报表和整个控制过程的具体数据。在这样的分布式控制系统中,单片机与微机之间的多路通信是整个系统的关键,本文将介绍在提高通信的准
[单片机]
AT89C52单片机八路电压表C程序
/*********************************************************************/ // 八路电压表C程序 /*********************************************************************/ /*使用AT89C52单片机,12MHz晶振,P0口读入AD值,P2口作AD控制,用共阳LED数码管 P1口输出段码,P3口扫描,最高位指示通道(0-7)。*/ #include reg52.h //52系列单片机定义文件 #include intrins.h //调用_nop_();延时函
[单片机]
51单片机LED管显示子程序实例
;DISP显示子程序 PORT_A EQU 0CF01H PORT_B EQU 0CF02H PORT_C EQU 0CF03H ;功能:将显示缓冲区39-3FH内容显示一遍 ;3FH对应八个LED管 ;3E-39H自左到右对应数码 ;占用:PSW,ACC,DPTR,R0,R3,R6,R7 内 ; ORG 0DE00H DISP1: MOV R0,#3FH DISP_0: MOV R3,#01000000B ;位选字 MOV A,@R0 ;取显示数据 SJMP DISP_2 DISP_1: MOV DPTR,#LED_TB MOV A,@R0 MOVC A,@A
[单片机]
PIC单片机人机接口模块4×4行列式键盘的程序设计
程序的主流程如图1所示。
图1 程序的主流程
程序主要分为两个部分:一个部分不停地监测是否有按键按下,另一个部分查看哪一个键按下。
在初始状态下,4个列输出端口输出低电平,即RD0~RD3输出低电平,然后持续监测4个行输入端口RD4~RD7的状态是不是高电平。
如果没有按键按下,则RD4~RD7的状态是高电平;如果有按键按下,则被按下的键对应的行输入端口的电平就会被拉低,RD4~RD7会有低电平出现,对4个行输入端口RD4~RD7的电平的监测即为对按键的监测。
在4个行输入端口RD4~RD7上出现低电平时,就转到查询程序SEE。 键盘 扫描子程序流程如图2所示,按键查询子程序流程如图
[嵌入式]
51单片机IIC通信底层程序
#include IIC.H #include intrins.h unsigned char ask; void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } void IICinit() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0; } void IICstart() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0; } void IICrespon
[单片机]