资讯详情

pic单片机两个IO口四线驱动LCD1602

经过多天调式,优化程序。只用两个IO端口驱动74LS164扩展成并口驱动1602(四线模式),这是个完整简单的例子,可实现字符串左移200次,右移200次,不停的循环。现上传与大家共享成果!//引入头文件********************************************************* #include <pic.h> #include <pic12f6x.h> #include "delay.h" #include "delay.c"

//熔丝配置*********************************************************** __CFIG(PROCT & CPD & BOREN & MCLRDIS & PWRTEN & WDTDIS & IIO);

//端口定义*********************************************************** #define Port GPIO //端口址址 #define Tris SIO //方向设置

//脚位定义*********************************************************** #define Dat GPIO4 //数据引脚 #define Clk GPIO5 //时钟引脚

//显示字符*********************************************************** unsigned char TopChar[] = {"www.pic16.com "}; // unsigned char BotChar[] = {"ivws "}; //

//******************************************************************* //函数名称:PortInit(); //输入参数:无 //输出参数:无 //功能描述:端口设置 //建造日期:2008.12.08 //******************************************************************** void PortInit(void) { Port = 0x00; //端口设置 Tris = 0x00; }

//******************************************************************* //函数名称:ConInit(); //输入参数:无 //输出参数:无 //功能描述:定时器设置 //建造日期:2008.12.08 //******************************************************************* void ConInit(void) { ION = 0x00; //允许上拉 CMCON = 0x07; //关比较器 }

//******************************************************************* //函数名称: TxLs164(data); //输入参数:串行数据 //输出参数:无 //功能描述:串行发送数据 //建造日期:2008.12.08 //******************************************************************* void TxLs164(unsigned char data) { unsigned char i; i = 6; //送出六位 do { Dat = 0; //数据清零 Clk = 1; //时钟置位 Clk = 0; //时钟清零 } while (--i); //循环发送

i = 6; //送出六位

do { Dat = 0; //先高后低

if (data & 0x20) Dat = 1;

Clk = 1; //时钟置位 data <<= 1; //数据左移 Clk = 0; //时钟清零 } while (--i); //循环发送 } //******************************************************************* //函数名称: WriteData(data, rs); //输入参数:待写数据, 0 = 指令,1 = 数据 //输出参数:无 //功能描述:数据写入LCD //建造日期:2008.12.08 //******************************************************************* void WriteData(unsigned char data, unsigned char rs) { unsigned char temp;

temp = data >> 4; //取高四位 temp |= 1 << 5; //使用置位

if (rs & 0x01) temp |= 1 << 4; //数据选择

TxLs164(temp); //写高四位 Dat = 1; //使能下沿 Dat = 0; DelayUs(50); //延时等待

temp = data & 0x0f; //取低四位 temp |= 1 << 5; //使用置位

if (rs & 0x01) temp |= 1 << 4; //数据选择

TxLs164(temp); //写高四位 Dat = 1; //使能下沿 Dat = 0; DelayUs(50); //延时等待 }

//******************************************************************* //函数名称:AddrSite(x, y); //输入参数:坐标参数 //输出参数:无 //功能描述:设置显示地址 //建造日期:2008.12.08 //******************************************************************* void AddrSite(unsigned char x, unsigned char y) { x &= 0x3f; //截取地址

if (y == 0) { WriteData((0x80 | x), 0); //首行地址 }

else { WriteData((0xc0 | x), 0); //次行地址 } }

//******************************************************************* //函数名称:PrintChar(*s); //输入参数:缓冲区首址 //输出参数:无 //功能描述:字符串输出显示 //建造日期:2008.12.08 //******************************************************************* void PrintChar(unsigned char *s) { while(*s) { WriteData(*s, 1); //字符数据 s++; //下个字符 } }

//******************************************************************* //函数名称:LcdInit(); //输入参数:无 //输出参数:无 //功能描述:液晶初始化 //建造日期:2008.12.08 //******************************************************************* void LcdInit(void) { unsigned char i = 3;

TxLs164(0x23); //设置 do { Dat = 1; //使能下沿 Dat = 0; DelayUs(50); //延时等待 } while (--i);

TxLs164(0x22); //四线模式

Dat = 1; //使能下沿 Dat = 0; DelayUs(50); //延时等待

WriteData(0x28, 0); //接口设置 WriteData(0x0c, 0); //显示打开 WriteData(0x01, 0); //显示清屏 WriteData(0x06, 0); //光标右移 }

//******************************************************************* //函数名称:ShiftChar(*buff); //输入参数:缓冲区首址, 0 = 左移 1 = 右移 //输出参数:无 //功能描述:移动字符 //建造日期:2008.12.08 //******************************************************************* void ShiftChar(unsigned char *buff, unsigned char rl) { unsigned char temp, i; if (rl & 0x01) //字符右移 { temp = buff[15]; //取尾字符 for (i = 15; i > 0; i--) { buff[i] = buff[i - 1]; //数据右移 } buff[0] = temp; //首尾交换 } else //字符左移 { temp = buff[0]; //取首字符

for (i = 0; i < 15; i++) { buff[i] = buff[i + 1]; //数据左移 } buff[15] = temp; //字符交换 } }

//******************************************************************* //函数名称:main(); //输入参数:无 //输出参数:无 //功能描述:主要程序 //建造日期:2008.12.08 //******************************************************************* void main(void) { unsigned char i, rl;

PortInit(); //脚位设置 ConInit(); //配置设置 LcdInit(); //液晶设置 DelayMs(50); //短暂延时 AddrSite(0, 0); //坐标设置 PrintChar(TopChar); //发送字符 i = 0; //移动记数 rl = 0; //左右移动

while (1) { if (i++ > 200) //移动记数 { i = 0; //记数清零 rl ^= 0x01; //移动取反 }

DelayMs(250); //延时显示 ShiftChar(BotChar, rl); //移动字符

AddrSite(0, 1); //坐标设置 PrintChar(BotChar); //发送字符 } }

源代码下载:http://www.ruidan.com/f/1602ym.rar 仿真文件下载:http://www.ruidan.com/f/1602fz.rar

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台