标准(standard),实现(implementation)

本文解释了标准和实现的概念,如C++98标准及其不同实现(cl.exe和g++),强调了标准的重要性,即确保不同产品和服务之间的兼容性和互操作性。
标准一般是由某个组织发布的一组规范。这个组织一般是标准化组织或某个大公司,或是一些大公司的联合。比如C++就是一个标准。C++一般指1998年由 ISO(国际标准化组织)发布的ISO/IEC 14882:1998。这个文件规定了C++语言应该遵循那些规范。比如函数必须有返回类型(与之对应C语言可以省略返回值),规定了vector的用法 等等。写程序的人最好按照标准写程序,写编译程序的人也最好按照标准写编译程序,以便使得按照标准写的程序能编译通过。
    各种标准的作用就是给大家一个规范,符合这个规范生产的产品可以集成在一起。比如,GB(国家标准)规定了插座提供220V,50HZ的交流电,于是供电 公司,和各种电器生产厂商都遵循标准。这样你才可以在任意一个商店买任意一种电器都能插到任意一个插座中,两者还能配合的很好。同理,大家都遵循C++标 准时,任意一个人写的遵循C++标准的C++程序就可以和任意遵循C++标准的程序库连接在一起,才能拿到任意一个编译器上都能通过编译,并且编译得到的 程序有一致的运行结果。
    实现就是遵循标准生产出的实际的产品。比如微软VS2005带的C++编译器cl.exe,就是一个C++标准的编译器实现。同样GNU组织的g++也是。
   
    实际上好多名词都是标准:
  1.     MPI, Message Passing Interface,这个标准是为了使按标准编写的消息传递的并行程序有广泛的移植性。 官方网站是http://www.mpi-forum.org/。 它有非常多的实现,各种大型并行机器都有商业的MPI库,Intel也有自己的MPI库,还有诸多开源版本。(列这个在这,是因为刚刚上了并行计算课)
  2. C++, 最近的标准是ISO 1998年发布的,简称C++98。这个标准直到最近才有完全符合标准的编译器。下一个版本的标准可能是2007
  3. C,最早的标准是C89,是1989年ANSI标准化的,后来被ISO采纳。最近的标准是C99,1999年ISO发布。C99标准给C语言添加了许多新特性,比如const。
  4. JavaScript, EMCAScript。原来由Netscape公司开发的脚本语言,后来标准化。
    这里说一下这两个概念的原因是,好多人对这两个概念搞不清楚。经常以为某个实现就是全部,比如++就是VC, Java就是JBuilder,数据库就是 SQLServer。
    不拘泥某个具体实现,才能看的更远。 
<think>我们正在为LCD1602显示屏驱动编写标准实现代码示例。LCD1602是一种常见的字符型液晶显示模块,每行可显示16个字符,共2行。通常使用并行接口,包括数据线(8位或4位模式)和控制线(RS, RW, E)。 我们将使用4位数据模式(节省IO口)进行示例。需要连接以下引脚: - VSS, VDD, VEE(电源和对比度调节) - RS(寄存器选择:0-命令寄存器,1-数据寄存器) - RW(读写:0-写,1-读。通常我们只写不读,所以可以接地) - E(使能信号,下降沿触发) - D4-D7(4位数据线) - 背光电源(如果有) 步骤: 1. 初始化:按照LCD1602的初始化序列进行初始化,设置4位模式,显示模式等。 2. 发送命令:将命令发送到命令寄存器。 3. 发送数据:将字符数据发送到数据寄存器。 注意:由于使用4位模式,每次发送一个字节(8位)需要分两次发送(先高4位,后低4位)。 以下是一个基于C语言的示例代码(假设我们使用某个微控制器,如51单片机或STM32,但这里我们使用伪代码,重点在逻辑):</think>以下是LCD1602显示屏的标准驱动实现代码示例(基于4位数据模式),包含初始化、写命令和写数据操作: ```c #include <stdint.h> // 引脚定义(根据实际硬件连接修改) #define LCD_RS_PIN 0 // 寄存器选择引脚 #define LCD_RW_PIN 1 // 读写选择引脚(通常接地) #define LCD_EN_PIN 2 // 使能引脚 #define LCD_D4_PIN 3 // 数据线D4 #define LCD_D5_PIN 4 // 数据线D5 #define LCD_D6_PIN 5 // 数据线D6 #define LCD_D7_PIN 6 // 数据线D7 // 延时函数(需根据实际时钟频率调整) void delay_ms(uint32_t ms) { // 实现毫秒级延时 } // 发送半字节(4位数据) void lcd_send_nibble(uint8_t data) { // 设置数据线 digitalWrite(LCD_D4_PIN, (data >> 0) & 0x01); digitalWrite(LCD_D5_PIN, (data >> 1) & 0x01); digitalWrite(LCD_D6_PIN, (data >> 2) & 0x01); digitalWrite(LCD_D7_PIN, (data >> 3) & 0x01); // 产生使能脉冲 digitalWrite(LCD_EN_PIN, 1); delay_ms(1); digitalWrite(LCD_EN_PIN, 0); delay_ms(1); } // 发送命令 void lcd_send_cmd(uint8_t cmd) { digitalWrite(LCD_RS_PIN, 0); // RS=0 选择命令寄存器 // 先发送高4位 lcd_send_nibble(cmd >> 4); // 再发送低4位 lcd_send_nibble(cmd & 0x0F); delay_ms(2); // 命令执行需要时间 } // 发送数据 void lcd_send_data(uint8_t data) { digitalWrite(LCD_RS_PIN, 1); // RS=1 选择数据寄存器 // 先发送高4位 lcd_send_nibble(data >> 4); // 再发送低4位 lcd_send_nibble(data & 0x0F); delay_ms(1); } // LCD初始化 void lcd_init(void) { delay_ms(50); // 上电等待 // 初始化序列(4位模式) lcd_send_nibble(0x03); // 尝试设置8位模式 delay_ms(5); lcd_send_nibble(0x03); delay_ms(1); lcd_send_nibble(0x03); delay_ms(1); lcd_send_nibble(0x02); // 切换到4位模式 // 功能设置:4位模式,2行显示,5x8点阵 lcd_send_cmd(0x28); // 显示控制:开显示,关光标,不闪烁 lcd_send_cmd(0x0C); // 清屏 lcd_send_cmd(0x01); delay_ms(2); // 输入模式:光标右移,文字不移动 lcd_send_cmd(0x06); } // 设置光标位置 void lcd_set_cursor(uint8_t row, uint8_t col) { uint8_t address; if (row == 0) address = 0x80 + col; // 第一行起始地址0x80 else address = 0xC0 + col; // 第二行起始地址0xC0 lcd_send_cmd(address); } // 打印字符串 void lcd_print(char *str) { while (*str) { lcd_send_data(*str++); } } // 示例使用 int main(void) { // 初始化GPIO(根据具体平台实现) gpio_init(); lcd_init(); lcd_set_cursor(0, 3); lcd_print("Hello World!"); lcd_set_cursor(1, 0); lcd_print("LCD1602 Demo"); while(1); return 0; } ``` ### 关键点说明: 1. **4位模式**:使用D4-D7传输数据,分两次发送一个字节(先高4位后低4位) 2. **初始化序列**:包含三次$8$位模式设置尝试(实际发送半字节$0x03$),最后切换到$4$位模式 3. **时序要求**: - 命令执行需要$2ms$延时(清屏命令需要$1.52ms$) - 使能脉冲宽度需$>450ns$,代码中$1ms$是安全值 4. **显示地址**: - 第一行:$0x80$ - $0x8F$ - 第二行:$0xC0$ - $0xCF$ > 注意:实际使用需根据硬件平台实现`digitalWrite()`和`delay_ms()`函数,并正确连接VSS(GND)、VDD(+5V)、VEE(对比度调节)和背光引脚[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值