Zigbee网关 CC2530驱动1602显示屏
2015-11-16 13:55
429 查看
根据文章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核的,加上一些初始化函数,很容易就能实现
上电测试
成功了
目前开发板可用的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*255us void 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=0 LCD_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=1 LCD_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); }
上电测试
成功了
相关文章推荐
- 程序员该有的艺术气质—SOLID原则
- cxf webservice例子
- svn日常笔记总结
- C++中四种强制类型转换区别详解
- struts2基于注解的文件下载
- [LeetCode]题解(python):053-Maximum Subarray
- 数组--简单的排序
- HDU ACM 1800 Flying to the Mars
- jQuery初学知识点总结(二)
- VMware PXE Linux 网络启动搭建
- 有关vim的使用
- 第三方库总结
- JAVA 初始化顺序
- 深入理解JVM之五:类文件结构
- sqlserver 数据分页 多个主键
- iOS代码格式
- css3:user-select属性
- android layout_weight的使用注意点
- sicily 1006. Team Rankings
- LeetCode:Invert Binary Tree