资源预览内容
第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
第9页 / 共21页
第10页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第9讲 多文件联编,青岛科技大学 王泽华 13969742518,多文件联编,多文件联编 将相关的一组函数放在一个C文件中,并为该C文件制作可供其它功能模块调用的头文件(*.h)。在其它功能模块中复用这组函数时,只需要在工程文件中添加进包含这组函数的源文件和对应头文件即可。 多文件联编的优点 1、代码的可复用性 2、限定错误范围,便于查找调试错误 3、团队开发,相互协作。,预处理指令,源代码中预处理指令叫做指示字(directive)。以#开头,在每行都是第一个非空字符。通常#都在第一列,后面紧跟着指示关键字。Gcc预处理程序能够理解的指示字如下 定义宏名字 #define ,预处理程序会把这个宏扩展到使用该名字的位置 包含 #include 查找指示字列表,直到找到指定的文件,然后将文件内容插入,就好像在文本编辑器中插入一样 判断1 #if /为真,执行该段代码 #elif /为真,执行该段代码 #else /都不满足,执行该段代码 #endif,判断2 #ifdef /若定义过某一宏,执行该段代码 #else /没定已过,执行该段代码 #endif 判断3 #if defined /若定义过某一宏,执行该段代码 #elif defined /定义过另一宏,执行该段代码 #else /否则执行该段代码 #endif,判断4 #ifndef /若没定义过某一宏,执行该段代码 #else /否则,执行该段代码 #endif 判断5 #if !defined /若没定义过该宏,执行该段代码 #elif !defined /若没定义过该宏,执行该段代码 #else /否则,执行该段代码 #endif,液晶显示头文件lcd.h,#ifndef _LCD_H_ #define _LCD_H_ 1 #include #ifndef _NOP # define _NOP() _asm_ _volatile_(“nop“:) #endif /*/ / LCD定义 /*/ /LCD1602 写指令; #define clear_scr 0x01 /清屏 #define cursor_return 0x02 /光标回左上角 #define data_cur_right 0x06 /数据写入光标右移,AC+1 #define disp_on 0x0C /显示开 #define disp_off 0x08 /显示关 #define cursor_right 0x14 /整体显示,光标右移,AC+1 #define disp_line 0x38 /两行显示,5*7点阵,/LCD控制端口定义 #define LCD_CTRL_PORT PORTC #define LCD_CTRL_DDR DDRC /LCD控制端口针定义 #define PIN_RS PC0 /RS针连接定义 #define PIN_RW PC1 /RW针连接定义 #define PIN_EN PC2 /EN针连接定义 /LCD数据端口定义 #define LCD_PORT PORTB /发送LCD数据端口 #define LCD_PIN PINB /读取LCD数据端口 #define LCD_DDR DDRB /LCD数据端口方向 / LCD控制功能定义 #define RS_0() LCD_CTRL_PORT &= (1PIN_RS)/0xFE #define RS_1() LCD_CTRL_PORT |= (1PIN_RS)/0x01 #define RW_0() LCD_CTRL_PORT &= (1PIN_RW)/0xFD #define RW_1() LCD_CTRL_PORT |= (1PIN_RW)/0x02 #define EN_0() LCD_CTRL_PORT &= (1PIN_EN)/0xFB #define EN_1() LCD_CTRL_PORT |= (1PIN_EN)/0x04,extern void LCD_BUSY_WAIT(); extern void Write_LCD_Comm(unsigned char cmd); extern void Write_LCD_Data(unsigned char dat); extern void initLcd(); extern unsigned char LCD_ShowChar(char s,unsigned char cDDRAM); extern void LCD_ShowStr(char *str,unsigned char cDDRAM); extern void divData(int x,int iPoint, char *cDisp_Buff, int iLen_Buff); #endif /_LCD_H_ 结束,液晶显示源文件lcd.c,#include #include #include #include #include “lcd.h“ /*/ /-LCD程序- /*/ / LCD忙等待 void LCD_BUSY_WAIT() LCD_CTRL_DDR |= (1PIN_RS)|(1PIN_RW)|(1PIN_EN);/设定控制端三引脚为出 LCD_PORT = 0xFF; LCD_DDR = 0x00;/上拉输出 RS_0(); RW_1(); EN_1(); _NOP(); _NOP(); _NOP(); while(LCD_PIN ,/ 写LCD命令寄存器 void Write_LCD_Comm(unsigned char cmd) LCD_BUSY_WAIT(); LCD_CTRL_DDR |= (1PIN_RS)|(1PIN_RW)|(1PIN_EN);/设定控制端为cpu出 LCD_DDR = 0xFF; /lcd数据引脚输入 RS_0(); RW_0(); EN_1(); LCD_PORT = cmd; _NOP(); _NOP(); EN_0(); / 写LCD数据寄存器 void Write_LCD_Data(unsigned char dat) LCD_BUSY_WAIT(); LCD_CTRL_DDR |= (1PIN_RS)|(1PIN_RW)|(1PIN_EN);/设定控制端为cpu出 LCD_DDR = 0xFF; /lcd数据引脚输入 RS_1(); RW_0(); EN_1(); LCD_PORT = dat; _NOP(); _NOP(); EN_0(); ,/ LCD初始化 void initLcd() Write_LCD_Comm(disp_line); Write_LCD_Comm(clear_scr); Write_LCD_Comm(data_cur_right); Write_LCD_Comm(disp_on); /写字符到cDDRAM指定的地址,并返回下一个地址。 unsigned char LCD_ShowChar(char s,unsigned char cDDRAM) cDDRAM += 0x80; if(cDDRAM 0x8F ,/*/ / 显示字符串,cDDRAM取值为0x00-0x0F,0x40-0x4F void LCD_ShowStr(char *str,unsigned char cDDRAM) unsigned int i; for(i=0; stri!=0; i+) cDDRAM = LCD_ShowChar(stri,cDDRAM); /*数位分解*/ void divData(int x,int iPoint, char *cDisp_Buff, int iLen_Buff) int i = 0; /abs(x)+0中的字符数 int j; /计数器 int k; /小数点位置 char siLen_Buff; /abs(x)分解后字符串 char disp_buffiLen_Buff; /abs(x)添加小数点后的字符串,/清空显示缓冲区 for(j=0; jiLen_Buff-1; j+) cDisp_Buffi = 0; itoa(abs(x),s,10); /10进制分解字符串 /计算位数 while(si != 0) i+; k = i- iPoint; if(k1) /若x=36,保留3位小数,则应显示0.036,其前应添加0.0三个字符 for(j=0;j=abs(k)+1;j+) if(j=1) disp_buffj = .; else disp_buffj = 0; disp_buffj=0; strcat(disp_buff,s); ,else if(k = i) /保留0位小数,直接显示sj for(j=0;j=k;j+) disp_buffj=sj; else / 若x=36,保留1为小数,中间应添加小数点.一个字符。 for(j = 0; j k; j+) disp_buffj = sj; disp_buffj=.;,for(j = k; j = i; j+) if(sj = 0) disp_buffj+1 = sj; else disp_buffj+1 = sj; if(x0) /x0,将负号置于其前 cDisp_Buff0 = -; cDisp_Buff1 = 0; strcat(cDisp_Buff,disp_buff); ,else /x0,将直接显示 strcpy(cDisp_Buff,disp_buff); /搜索小数点最后的0删除 for(k=0; cDisp_Buffk!=0; k+) if(cDisp_Buffk = .) j = k; for(i=k-1; cDisp_Buffi=0 ,多文件联编例子,任务描述 利用lcd1602对led闪烁次数进行技术,液晶每1秒闪烁一次。Led接到PD0. 建立新文件blinkCoun.c如下 #define F_CPU 8000000UL #include #include #include “lcd.h” #define buff
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号