智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

PIC单片机驱动LCD1602(4位总线模式)
[电子技术] 2008-06-26

 LCD1602的驱动程序早已传遍天下~~~,各位大虾,小虾以及虾米早已烂熟于胸,但大多数情况下都是以8位总线驱动该LCD。很多人忽略了其还有另一种驱动方式,即4位总线模式。这在IO资源比较紧张的情况下犹为好使,可以节省4个IO口。

    搜遍网络,只有一位好同志以AVR单片机以4位总线方式驱动。本虾米也来凑一热闹,以PIC驱动LCD1602。

    其实4位总线模式就是将8位总线的数据分为两次传输。驱动思路都差不多,关键在于初使化部份的时序要求比较严格。本虾米小做了几次实验,稍稍修改时序就无法成功。但这只是匆忙之举,作不得数。偶在此只是抛砖引玉,各位大虾,小虾以及虾米有空可以试试,提出更好的方案。

/*************************************************
* File: Lcd.C
* Function: Lcd1602驱动
* Data: 2006-02-17
**************************************************/

#i nclude <p18f452.h>

#define uint8  unsigned char
#define uint16 unsigned int

#define  LCD_EN    PORTAbits.RA1
#define  LCD_RW    PORTAbits.RA2
#define  LCD_CD    PORTAbits.RA3
#define  LCD_DATA_BUS PORTD   // 数据总线,只用到RD0~RD3

#define ON 1 
#define OFF 0
#define W  0
#define R  1
#define C  0
#define D  1

void Ini_Lcd( void);      // Lcd初使化
void ChkBusy( void);       // 忙检测
uint8 Rcmd( void );       // 读指令寄存器
void Wcmd( uint8 command );   // 写指令寄存器
void Wdata( uint8 lcddata);   // 写数据寄存器  
void SetXY( uint8 X ,uint8 Y ); // 设置显示坐标 
void Wchar( uint8 x ,uint8 y ,uint8 data );   // 显示一个字符
void Wstring( uint8 x ,uint8 y ,uint8 *data ); // 显示一串字符


/***************** 写指令寄存器*******************/

void Wcmd( uint8 command )

 LCD_RW = W;   // 写
 LCD_CD = C;   // 指令
 LCD_EN = ON;  
 LCD_DATA_BUS = ( command & 0xf0 )>> 4; // 传送高4位 
 Nop();
 Nop();  
 LCD_EN = OFF;  // 产生下降沿,写时序

 LCD_EN = ON;
 LCD_DATA_BUS = ( command & 0x0f ); // 传送低4位 
 Nop();
 Nop();
 LCD_EN = OFF;  // 产生下降沿,写时序
}

/***************** 写数据寄存器********************/

void Wdata( uint8 lcddata)
{
 LCD_RW = W;   // 写
 LCD_CD = D;   // 数据
 LCD_EN = ON;
 LCD_DATA_BUS = ( lcddata & 0xf0 )>> 4; // 传送高4位
 Nop();
 Nop();
 LCD_EN = OFF;  // 产生下降沿,写时序

 LCD_EN = ON;
 LCD_DATA_BUS = ( lcddata & 0x0f );   // 传送低4位
 Nop();
 Nop();
 LCD_EN = OFF;  // 产生下降沿,写时序
}

/**************** 读指令寄存器 *******************/

uint8 Rcmd( void )
{
 uint8 tempH , tempL;
 LCD_EN = OFF;
 TRISD |= 0x0f;      // RD口设为输入口
 LCD_RW = R;        // 读
 LCD_CD = C;        // 指令寄存器
 LCD_EN = ON;   
 tempH = LCD_DATA_BUS;   // 读数据总线
 LCD_EN = OFF;
 Nop();
 Nop();
 LCD_EN = ON;   
 tempL = LCD_DATA_BUS;   // 读AC值
 LCD_EN = OFF;
 tempH = ( tempH << 4 )|( tempL & 0x0f );
 TRISD &= 0xf0;      // RD口设为输出口
 return (tempH);       // 返回读到的8位值
}

/**************** 忙状态检测***********************/

void ChkBusy( void)
{
 while( ( Rcmd() & 0x80 )  == 1); 
}

/*****************************************************
* NAME: SetXY( uint8 X ,uint8 Y )
* 功能: 设置显示坐标
******************************************************/
void SetXY( uint8 X ,uint8 Y )
{
 uint8 temp;
 if ( Y == 0 )temp = X + 0x80;  
 else
  temp = X + 0xc0;
 Wcmd( temp);
 ChkBusy();    
}

/******************************************************
* NAME:Wstring( uint8 x ,uint8 y ,uint8 *data )
* 功能:在指定位置起显示字符串
*******************************************************/

void Wstring( uint8 x ,uint8 y ,uint8 *data )
{
 SetXY(x,y);     // 设置显示坐标
 while(*data)   
 {
  Wdata( *data); 
  data++;
  delay5ms();
 }   
}

/*******************************************************
* NAME:Wchar( uint8 x ,uint8 y ,uint8 data )
* 功能:在指定位置显示一个字符
********************************************************/
void Wchar( uint8 x ,uint8 y ,uint8 data )
{
 SetXY(x,y);     // 显示定位
 Wdata( data);    // 写数据
 delay5ms();
}

/*******************************************************
* NAME: Ini_Lcd( void)
* 功能:LCD初使化
********************************************************/
void Ini_Lcd( void)
{
 TRISA &= 0xf1;   // RA3~RA1设为输出
 TRISD &= 0xf0;    // RD3~RD0设为输出
 ADCON1 = 0b00001110;// 除RA0外,关闭RA口引脚模拟功能
 Wcmd(0x30) ;    // 前三次写 0x30 不检测忙状态
 delay5ms() ;
 delay5ms() ;
 delay5ms() ;    // 延时15ms,切记否则会初使化不成功
 Wcmd(0x30) ;    
 delay5ms() ;
 Wcmd(0x30) ;  
 delay5ms() ;  

 Wcmd(0x20) ;    // 显示模式设置:4位总线,2行显示,5*10点阵
 ChkBusy();
 Wcmd(0x28) ;  
 Wcmd(0x01) ;    // 显示清屏
 Wcmd(0x06) ;    // 显示光标移动设置:光标右移
 Wcmd(0x0d) ;    // 开显示:开显示,开光标,光标闪烁
 Wcmd(0x80) ;    // 清DDRAM
}

[电子技术添加评论 | 评论/阅读(0/527)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1