您的位置:首页 > 其它

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核的,加上一些初始化函数,很容易就能实现
/*--------------------------------------------------------------*/
//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);
}


上电测试



成功了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: