从单片机到嵌入式开发 |
您所在的位置:网站首页 › 单片机常用显示器 › 从单片机到嵌入式开发 |
此前我们已经对单片机的基本功能有了一定的了解,接下来我们介绍一下几款常见的单片机外部设备。首先是常用的LCD显示屏模块,此处选用LCD1602(器件名LM016L)进行介绍。然后是AD转换的部分,这里选择并行的ADC0808和DAC0808进行介绍。最后介绍一个使用I2C通信协议的AT24C1024外置EEPROM模块。 以上几种模块都是比较常见的外设组件。在此仅对各个模块做一个简单的介绍,并给出一套简单的例程示范。详细的使用方法请参考相应器件的数据手册。 LCD显示屏![]() 具体使用流程如下: 首先,进行LCD1602初始化。 void Init() { Write(0, 0x38); // 按照数据手册,发送38H delay5ms(); // 延时5ms Write(0, 0x38); // 按照数据手册,发送38H delay5ms(); // 延时5ms Write(0, 0x38); // 按照数据手册,发送38H delay5ms(); // 延时5ms Write(0, 0x38); // 显示模式设置 Write(0, 0x08); // 关闭显示 Write(0, 0x01); // 清屏(同时清数据指针) Write(0, 0x06); // 读写后指针自动加1 Write(0, 0x0c); // 开显示,不显示光标 }此部分主要是按照初始化时序输入指令进行初始化,以及模式设置,然后就可以进行字符串显示了。 void SetCursor(unsigned char x, unsigned char y) //设置坐标,LCD1602的坐标地址为第一行0x80-0x8f,第二行0xc0-0xcf { Write(0, 0x80 + 0x40*y + x); } void ShowStr(unsigned char x, unsigned char y, unsigned char *pStr) //在指定坐标显示字符串 { SetCursor(x, y); //设置起点的坐标 while (*pStr != '\0'){ Write(1, *pStr++);//自增写数据 } }带字库的LCD12864使用方法与之类同,基本硬件操作部分与上述代码可以复用。LCD12864多一个串/并控制口PSB。 LCD12864初始化、光标控制、写数据指令如下: void Init() { psb = 1; Write(0, 0x34); // 扩充指令操作 delay5ms(); // 延时5ms Write(0, 0x30); // 基本指令操作 delay5ms(); // 延时5ms Write(0, 0x0c); // 开显示,不显示光标 delay5ms(); // 延时5ms Write(0, 0x01); // 清屏(同时清数据指针) } void SetCursor(unsigned char x, unsigned char y) //设置坐标,LCD12864的坐标地址为0x80 0x90 0x88 0x98 { Write(0, 0x80 + y>1?0x08:0x00 + y%2?0x10:0x00 + x); } void ShowStr(unsigned char x, unsigned char y, unsigned char *pStr) //在指定坐标显示字符串 英文字符占半位 汉字占整位 自增 { SetCursor(x, y); //设置起点的坐标 while (*pStr != '\0'){ Write(1, *pStr++);//自增写数据 } }2.AD/DA转换 将读取的数据通过P3端口送到DAC0808,经运算放大器处理后可以看见输出电压,因为输出电压范围为0-10V,故可看见输出电压约为输入电压值的两倍。 I2C+EEPROM![]() 以上就是I2C总线通讯的基本操作函数,_Nop()为空指令函数,表示延时一个周期。使用时遵循启动-发送-结束或者启动-接收-应答函数-结束即可。 下面是AT24C1024使用I2C的处理函数。AT24C1024使用到的函数如下: 数据发送函数bit mcu_sendByte( unsigned char add, unsigned char dat); 参数add:地址,dat:数据;返回值:成功/失败。字符串发送函数bit mcu_send_string( unsigned char add, unsigned char rom_add_h, unsigned char rom_add_l, unsigned char *s, unsigned char num); 参数add:地址,rom_add:rom高/低地址,s:字符串,num:字符位数;返回值:成功/失败。数据接收函数bit mcu_RcvByte( unsigned char add, unsigned char *c); 参数add:地址,c:接收数据地址;返回值:成功/失败。字符串接收函数bit mcu_receive_string( unsigned char add, unsigned char rom_add_h, unsigned char rom_add_l, unsigned char *s, unsigned char num); 参数add:地址,rom_add:rom高/低地址,s:字符串,num:字符位数;返回值:成功/失败。 //器件当前地址写字节数据 bit mcu_sendByte(unsigned char add, unsigned char dat) { Start_I2c(); //I2C开始 sendByte(add); //写器件地址 if(ack==0) return 0; sendByte(dat); //如果应答,则发送数据 if(ack==0) return 0; Stop_I2c(); //正常结束,返回1 return 1; } //向器件指定地址写字符串 bit mcu_send_string(unsigned char add,unsigned char rom_add_h,unsigned char rom_add_l,unsigned char *s,unsigned char num) { unsigned char i; Start_I2c(); //I2C开始 sendByte(add); //写器件地址 if(ack==0) return 0; sendByte(rom_add_h); //如果应答,发地址高8位 if(ack==0) return 0; sendByte(rom_add_l); //如果应答,发地址低8位 if(ack==0) return 0; for(i=0;i Start_I2c(); //I2C开始 sendByte(add); //写器件地址 if(ack==0) return 0; *c=RcvByte(); //如果应答,则读取数据 NoAck_I2c(); //送非应答信号 Stop_I2c(); //正常结束,返回1 return 1; } //从器件指定地址读字符串 bit mcu_receive_string(unsigned char add,unsigned char rom_add_h,unsigned char rom_add_l,unsigned char *s,unsigned char num) { unsigned char i; Start_I2c(); //I2C开始 sendByte(add); //写器件地址 if(ack==0) return 0; sendByte(rom_add_h); //如果应答,发地址高8位 if(ack==0) return 0; sendByte(rom_add_l); //如果应答,发地址低8位 if(ack==0) return 0; Start_I2c(); //I2C重新开始 sendByte(add+1); //写器件地址,方式为读 if(ack==0) return 0; for(i=0;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |