根据文章zigbee网关 CC2530网关开发板之终端开发板可用的IO点击打开链接

目前开发板可用的IO为

P0_4,P0_5,P0_6,P0_7 -- 空

P1_0,P1_1,P1_2 -- 空

而1602的管脚为

明显IO不够用,为了能够驱动决定采用4线驱动

为了尽可能的减少杜邦线的数量,我对我对1602进行的改造

  • 偏压信号用电阻分压的形式直接在1602上焊好
  • 插针上把没用使用的IO全部折断
  • RW信号直接接地,对1602不使用读的方法
  • 将背光直接接到1602电源上
这样一弄1602对外的接口只有8个,除去2个电源,只需要6个IO口就可以取得了
参考http://blog.csdn.net/zzwdkxx/article/details/8296077写的程序,简单的改了改,因为参考的1602的程序就是C语言驱动51单片机,而CC2530本身就是51核的,加上一些初始化函数,很容易就能实现
/*--------------------------------------------------------------*///Name:   LCD1602四线驱动程序//File:    1602.c//Date:   15-11-16//Ver:  0.1/*--------------------------------------------------------------*/#include <ioCC2530.h>//LCD1602接口定义             #define   LCD_DATA    P0  //P0口(P0_4~P0_7)与LCD高四位(D4~D7)对应相接#define   LCD1602_RS  P1_0    #define LCD1602_EN  P1_1//延时函数,12mhz 6t延迟时间10*255usvoid System_init(void); void LCD_init(void);void LCD_en_write(void);void LCD_write_command(unsigned char command) ;void LCD_write_data(unsigned char Recdata);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata);void delay_nus(unsigned int n);void delay_nms(unsigned int n);//以下函数用于输出字符串和数字int LCD_PutNum(unsigned long num,int XS,int pos);int LCD_PutStr(unsigned char *DData,int pos);void System_init(void)  {CLKCONCMD &= ~0x40;      // 设置系统时钟源为 32MHZ晶振while(CLKCONSTA & 0x40); // 等待晶振稳定 CLKCONCMD &= ~0x47; P0DIR |= 1<<4|1<<5|1<<6|1<<7;P1DIR |= 1<<0|1<<1|1<<2;}void main(void) {System_init();LCD_init();LCD_PutStr("Hello,World!",0);while(1);}//-------------------------1us延时函数---------------------------------void delay_1us(void) {int i = 0;for(i=0;i<33;i++);}//------------------------N us延时函数---------------------------------void delay_nus(unsigned int n) {unsigned int i=0;for (i=0;i<n;i++)delay_1us();}//-----------------------1ms延时函数----------------------------------void delay_1ms(void){unsigned int i;for (i=0;i<1140;i++);}//-----------------------N ms延时函数---------------------------------void delay_nms(unsigned int n){unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}//------------------------液晶初始化-----------------------------------void LCD_init(void){LCD_write_command(0x28);delay_nus(40); LCD_en_write();delay_nus(40);LCD_write_command(0x28); //4位显示LCD_write_command(0x0c); //显示开LCD_write_command(0x01); //清屏delay_nms(2);}//----------------------液晶使能函数-------------------------------------void LCD_en_write(void){                       //EN由高电平跳变到低电平时液晶使能LCD1602_EN=1;delay_nus(1);LCD1602_EN=0;}//------------------------写指令函数--------------------------------------void LCD_write_command(unsigned char command) {delay_nus(16);LCD1602_RS=0; //RS=0LCD_DATA &=0X0f; //清高四位LCD_DATA|=command&0xf0; //写高四位LCD_en_write();command=command<<4; //低四位移到高四位LCD_DATA&=0x0f; //清高四位LCD_DATA|=command&0xf0; //写低四位LCD_en_write();}//------------------------写数据函数--------------------------------------void LCD_write_data(unsigned char Recdata) {delay_nus(16);LCD1602_RS=1; //RS=1LCD_DATA&=0X0f; //清高四位LCD_DATA|=Recdata&0xf0; //写高四位LCD_en_write();Recdata=Recdata<<4; //低四位移到高四位LCD_DATA&=0X0f; //清高四位LCD_DATA|=Recdata&0xf0; //写低四位LCD_en_write();                                                                                                                                                                                                                                                                                                                                                                                            }//-----------------------地址定位函数-------------------------------------void LCD_set_xy( unsigned char x, unsigned char y ) {unsigned char address;if (y == 0) address = 0x80 + x;else address = 0xc0 + x;LCD_write_command(address);}//----------------------在某个地址处,写一个字符----------------------------void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1{LCD_set_xy(X, Y); //写地址LCD_write_data(Recdata);}//----------------------------输出字符串-------------------------------------int LCD_PutStr(unsigned char *DData,int pos)  //pos表示字符显示位置,0~31{ unsigned char i; if(pos==-1){LCD_write_command(0x01); //清屏delay_nms(2);pos=0; } while((*DData)!='\0'){   switch(*DData){ case '\n': //如果是\n,则换行 { if(pos<17){for(i=pos;i<16;i++) LCD_write_char(i%16, i/16,' ');pos=16;}else{ for(i=pos;i<32;i++) LCD_write_char(i%16, i/16,' ');pos=0;} break; }case '\b': //如果是\b,则退格{if(pos>0) pos--;LCD_write_char(pos%16, pos/16, ' '); break; }default: { if((*DData)<0x20)  //小于0x20的显示不了?{*DData=' ';}LCD_write_char(pos%16, pos/16,*DData);pos++; break; } } DData++; }return(pos);}//----------------------------输出数字---------------------------------//这段程序写法我的理解大致是这样:num为去掉小数点之后的数字,XS为小数点//从左数第几位,pos为显示的位置//---------------------------------------------------------------------int LCD_PutNum(unsigned long num,int XS,int pos){ unsigned long tmp=0; unsigned char numbits=0; //总数字位数if(pos==-1){ LCD_write_command(0x01);delay_nms(2); pos=0; } if(num==0){LCD_write_char(pos%16, pos/16, '0');pos++;}else{if(num<0){ LCD_write_char(pos%16, pos/16, '-'); num*=(-1); pos++; } while(num)   //例如数字1234,经过这个运算变成了4321{ tmp=tmp*10+(num%10); num=num/10; numbits++;} while(tmp){ LCD_write_char(pos%16, pos/16, (tmp%10)+48);tmp=tmp/10;pos++;numbits--;if(numbits==XS) pos=LCD_PutStr(".",pos); //插入小数点}while(numbits--){LCD_write_char(pos%16, pos/16, '0');pos++;}}return(pos);}
上电测试
成功了

Zigbee网关 CC2530驱动1602显示屏相关推荐

  1. 单片机显示屏c语言程序,51单片机驱动1602液晶显示器c程序

    51单片机驱动1602液晶显示器c程序 /* 程序效果:单片机控制液晶显示器1602显示字母数字,用户自行更改io 程序版权:http://www.51hei.com */ #include //头文 ...

  2. linux zigbee开发板,基于嵌入式Linux的ZigBee网关设计与实现

    摘要: 从ZigBee联盟诞生以来,随着ZigBee协议的相关标准不断完善,协议栈持续改进等因素,基于 ZigBee无线传感网络的开发与应用也越来越多.由于其低功耗,低成本,低延时,安全可靠以及自组网 ...

  3. arduino下载库出错_arduino的I2C通讯 3:驱动1602液晶屏

    上个推送,我们学习了I2C功能的基础知识.而且知道了使用很多器件都需要安装库.本次,我们一起来做一个实例,用arduino驱动1602液晶屏 1602代表屏幕有16列,2行.传统的驱动方式占用了大量的 ...

  4. Zigbee网络架构+ZigBee的体系结构+理解zigbee节点的实现的案例+“51单片机” 和 “zigbee” 、 “cc2530芯片” 之间的关系+芯片cc2530

    ZigBee技术具有强大的组网能力,可以形成星型.树型和网状网,可以根据实际项目需要来选择合适的网络结构: 以下拓扑结构的节点,均是指支持zigbee协议的并以其通信技术手段,实现节点处所需要功能的产 ...

  5. 使用8080并口协议驱动NT35510LCD显示屏

    使用8080并口协议驱动NT35510LCD显示屏   本文记录如何使用8080协议驱动LCD显示屏,其中LCD显示屏驱动为NT35510芯片,正点原子的4.3寸显示屏,像素480X800,基于正点原 ...

  6. 51单片机的仿真实验——1602显示屏显示万年历与温度

    实验内容: 1:数字钟设计 2:基于DS18B20的温度测量模块设计 问题描述: 之前笔者写过一篇用数码管显示日历与温度的实验记录(51单片机的仿真实验--数码管显示日历与温度).但是数码管在仿真软件 ...

  7. 玩转树莓派之ZigBee网关

    *参考文档:ug129-zigbee-gateway-ref-design-guide>> 1.树莓派ZigBee网关架构: ZigBee Host应用程序运行在树莓派系统上,EM3588 ...

  8. ZigBee——在CC2530的ZStack中添加定时任务

    在使用CC2530芯片进行ZigBee协议的开发时,我们往往使用TI公司提供的带有ZigBee协议栈的ZStack工程,接下来以其中的SampleApp为例,向其中添加自己需要的定时任务并设置周期和处 ...

  9. 易灵思T35 FPGA驱动LVDS显示屏

    易灵思FPGA,天生适合MIPI/LVDS等相关应用,加上硬核DDR3控制器,简直就是完美. T35F324开发板支持LVDS LCD显示与HDMI显示,具体框图如下.这里,我将就花一定的篇幅,讲讲T ...

最新文章

  1. Oracle用户被锁定解决方法
  2. Android中的context
  3. Java数据结构和算法:HashMap,哈希表,哈希函数
  4. python获取当前文件夹下所有文件名
  5. 光流 | MATLAB实现HS Optical Flow(代码类)
  6. mfc 饼图绘画_绘画技能干货 | 【人体头颈】的绘画技巧(三)(内含母亲节抽奖公布)...
  7. LeetCode OJ - Convert Sorted List to Binary Search Tree
  8. 如何用Java创建不可变的Map
  9. 从客户端...中检测到有潜在危险的 Request.Form 值
  10. Linux cpu亲和力
  11. 查看.Net Framework版本的方法
  12. 关闭vue中的eslint校验
  13. LeetCode-210 Course Schedule II
  14. [转载] Python 递归函数
  15. 四、Linux常用命令——文件搜索命令
  16. Matlab Coder优缺点、使用介绍、使用注意
  17. ipv4网络无访问权限
  18. 知乎,挣钱?果然具有长尾效应
  19. 北京首都国际机场1号航站楼、2号航站楼、3号航站楼航空公司名单
  20. mysql bug frash_MySQL Flush导致的等待问题

热门文章

  1. Android App内截屏监控及涂鸦功能实现
  2. 禁止APP录屏和截屏
  3. gitee 上删除远程仓库
  4. JSP网站开发之HTML入门知识及常用标记符 (一)
  5. FINN(二)CNN,BNN及其硬件实现的背景知识
  6. iOS音视频开发七:视频采集
  7. 4.python 系统批量运维管理器之paramiko模块
  8. HIS软件项目布置的学习day01
  9. 使用按键精灵自动截图并保存重命名
  10. 前后端分离项目,请求头中包含Authorizaton:XX,但是后端getHeader(Authorizaton) 获取不到