当前位置:文档之家› 合泰单片机的段码液晶显示程序

合泰单片机的段码液晶显示程序

合泰单片机的段码液晶显示程序
合泰单片机的段码液晶显示程序

合泰单片机的段码液晶显示程序

//======================================================// // 煜日升电子(深圳)有限公司//

// 产品名称: 全自动胶带机//

// 产品型号: RS7001 Ver2.00 //

// 微控制器: HT49R30A-1 //

// 软件版本: 1.00 f or RC (2.8MHz) //

// [ 2006-07-29 16:34:50 | Author: zmli ] //

//======================================================//

#include <ht49r30a-1.h>

#include "RS7001RC.h"

void main()

{

initial();

DispLCD(Length);

while (1)

{

_clrwdt();

ScanKey();

ScanStart();

LengthSetup();

Start_End();

}

}

/* ============================ Delay ========================== */

void delay(unsigned char cnt)

{

unsigned char i,j;

for (i=0;i<=cnt;i++)

{

for (j=0;j<=100;j++){ _clrwdt(); }

_clrwdt();

}

}

/* ========================== Initial ========================== */

void initial(void)

C_MT1 = 0; C_MT2Z = 0; C_MT2F = 0;

delay(20);

SwitchStart=0; KeyDown=0; KeySetup=0; KeyUp=0; StartFlag=1; StopFlag=0;

CutFlag=0; SetupFlag=0; ResendFlag=0;

BusyFlag=0; InitFlag=0; ResetFlag=0;

LCD_count=0; Cut_count=0; LC_Str=1;

if(!_to) { Length = 45; }

_tmrc = 0xb0; _tmr = 0x38;

_tmrc = 0xa0; _tmrc = 0xb0;

_eti = 1; // Timer0 interrupt

_eei0 = 1; // INT0 interrupt

_emi = 1; // Total interrupt

if(End) { CutFlag=1; Cut_count=5100; }

}

/* ========================= ScanKey =========================== */ void ScanKey(void)

{

if(Start){ StartFlag=1; }

if( Down==0 | Setup==0 | Up==0 )

{

delay(5);

if( Down==0 | Setup==0 | Up==0 )

{

if(Down==0)

{

if(SetupFlag)

{

while(!Down) { _clrwdt(); }

KeyDown = 1;

}

else

{

if(Up==0)

{

while(!Up) { _clrwdt(); }

InitFlag = 1;

}

}

if(Setup==0)

{

while(!Setup) { _clrwdt(); }

KeySetup = 1;

}

if(Up==0)

{

if(SetupFlag)

{

while(!Up) { _clrwdt(); }

KeyUp = 1;

}

}

}

else

{

KeyDown=0; KeySetup=0; KeyUp=0; InitFlag=0; }

}

}

void LengthSetup(void)

{

if(KeySetup)

{

KeySetup = 0;

SetupFlag = !SetupFlag;

}

if(KeyDown)

{

KeyDown = 0;

if(Length==45) Length = 255;

else Length--;

}

if(KeyUp)

{

KeyUp = 0;

if(Length>245) Length = 45;

else Length += 10;

}

if(!SetupFlag) { DispLCD(Length); }

if(ON_Flag) { ON_Flag=0; DispLCD(Length);}

if(OFF_Flag){ OFF_Flag=0; LCD_Off(); }

}

/* ===================== Start & End Motor ===================== */ void ScanStart(void)

{

if(Start==0)

{

delay(5);

if(!SetupFlag & !BusyFlag)

{

if(StartFlag) { SwitchStart = 1; }

}

}

}

void Start_End(void)

{

if (SwitchStart)

{

SwitchStart = 0;

StartFlag =

0;

BusyFlag = 1;

Length_count = Length-35;

Length_count = 2*Length_count;

ResetFlag = 1;

_nop(); _nop();

Start_SendPaper();

}

if (InitFlag) { initial(); }

Hand = 1; Kee = Hand;

if(!Kee)

{

if(!SetupFlag)

{

_emi = 0; C_MT1 = 1;

StartFlag = 0;

while(!Kee)

{

_clrwdt(); Hand =1; Kee = Hand;

C_MT1 = 1;

C_MT2F = 0; C_MT2Z = 0;

}

C_MT1 = 0; _emi = 1;

CutFlag=1;

Cut_count=0;

ResetFlag = 1;

}

}

}

/* ======================= Display LCD ========================= */ void DispDigit(unsigned char Digit)

{

switch(Digit)

{

case 0: LCD_H = DIGIT[0]&0x0f;

LCD_L = DIGIT[0]&0xf0; LCD_L >>= 4;

break;

case 1: LCD_H = DIGIT[1]&0x0f;

LCD_L = DIGIT[1]&0xf0; LCD_L >>= 4;

break;

case 2: LCD_H = DIGIT[2]&0x0f;

LCD_L = DIGIT[2]&0xf0; LCD_L >>= 4;

break;

case 3: LCD_H = DIGIT[3]&0x0f;

LCD_L = DIGIT[3]&0xf0; LCD_L >>= 4;

break;

case 4: LCD_H = DIGIT[4]&0x0f;

LCD_L = DIGIT[4]&0xf0; LCD_L >>= 4;

break;

case 5: LCD_H = DIGIT[5]&0x0f;

LCD_L = DIGIT[5]&0xf0; LCD_L >>= 4;

break;

case 6: LCD_H = DIGIT[6]&0x0f;

LCD_L = DIGIT[6]&0xf0; LCD_L >>= 4;

break;

case 7: LCD_H = DIGIT[7]&0x0f;

LCD_L = DIGIT[7]&0xf0; LCD_L >>= 4;

break;

case 8: LCD_H = DIGIT[8]&0x0f;

LCD_L = DIGIT[8]&0xf0; LCD_L >>= 4;

break;

case 9: LCD_H = DIGIT[9]&0x0f;

LCD_L = DIGIT[9]&0xf0; LCD_L >>= 4;

break;

default: LCD_H = 0x00; LCD_L = 0x00; break;

}

}

void DispLCD(unsigned char data)

{

unsigned char digit1,digit2,digit3,temp,i;

_bp = 0x01;

temp = data%100;

digit1 = data/100;

digit2 = temp/10;

digit3 = temp%10;

DispDigit(digit1);

LCD[0] = LCD_H; LCD[1] = LCD_L;

DispDigit(digit2);

LCD[2] = LCD_H; LCD[3] = LCD_L;

DispDigit(digit3);

LCD[4] = LCD_H; LCD[5] = LCD_L;

for(i=8;i<20;i++){ LCD[i] = 0x00; }

}

void LCD_Off(void)

{

unsigned char i;

_bp = 0x01;

for(i=0;i<18;i++){ LCD[i] = 0x00; }

}

/* ==================== Interrupt Processor ==================== */ void INT0_isr(void)

{

dat0 = PulseInput;

if(!dat0)

{ Length_count--;

if(Length_count==0)

{

Stop_SendPaper();

if(ResetFlag)

{

CutFlag=1; // 初始化切纸电机

Cut_count=0;

}

else

{

Stop_count = 2000; //2000

StopFlag = 1;

if(Start) { StartFlag = 1; }

else { StartFlag = 0; }

}

}

}

}

void INT1_isr(void)

{

// dat1 = End;

// if(!dat1 && Cut_count>800)

if(Cut_count>800)

{

Stop_CutPaper();

_nop(); _nop();

_eei1 = 0;

CutFlag = 0;

Cut_count = 0;

if(ResetFlag)

{

Length_count = INIT_LENGTH;

ResetFlag = 0;

ResendFlag = 1;

ResendCount = 2000; //500

}

else

{ Stop_count = 2000; StopFlag = 1; } //2000 }

}

void Time

r0_isr(void)

{

if(SetupFlag) // LCD setup {

LCD_count++;

if(LCD_count==600) { ON_Flag = 1; } else if(LCD_count==2400)

{ LCD_count=0; OFF_Flag=1; } }

if(StopFlag)

{

Stop_count--;

if(Stop_count==0)

{ StopFlag=0; BusyFlag=0; }

}

if(ResendFlag)

{

ResendCount--;

if(ResendCount==0)

{

Start_SendPaper();

ResendFlag = 0;

}

}

if(CutFlag) {Cut_count++; }

if(Cut_count==1000) //800 {

Start_CutPaper();

_eei1 = 1;

}

else if(Cut_count==1010) //810 {

Start_CutPaper();

_eei1 = 1;

}

else if (Cut_count==5000) //5000 { Stop_CutPaper(); }

else if (Cut_count==5500) //5500 {

ResetFlag = 0;

_eei1 = 1;

_nop(); _nop();

Exit_CutPaper();

}

else if (Cut_count==9500) //9500

{

Cut_count = 0;

ResetFlag = 0;

BusyFlag = 0;

Stop_CutPaper();

_nop(); _nop();

_eei1 = 0;

}

}

/* =========================== END ============================= */

编码器详细介绍与编程指导

增量型编码器与绝对型编码器的区分 编码器如以信号原理来分,有增量型编码器,绝对型编码器。 增量型编码器 (旋转型) 工作原理: 由一个中心有轴的光电码盘,其上有环形通、暗的刻线,有光电发射和接收器件读取,获得四组正弦波信号组合成A、B、C、D,每个正弦波相差90度相位差(相对于一个周波为360度),将C、D信号反向,叠加在A、B两相上,可增强稳定信号;另每转输出一个Z相脉冲以代表零位参考位。 由于A、B两相相差90度,可通过比较A相在前还是B相在前,以判别编码器的正转与反转,通过零位脉冲,可获得编码器的零位参考位。 编码器码盘的材料有玻璃、金属、塑料,玻璃码盘是在玻璃上沉积很薄的刻线,其热稳定性好,精度高,金属码盘直接以通和不通刻线,不易碎,但由于金属有一定的厚度,精度就有限制,其热稳定性就要比玻璃的差一个数量级,塑料码盘是经济型的,其成本低,但精度、热稳定性、寿命均要差一些。 分辨率—编码器以每旋转360度提供多少的通或暗刻线称为分辨率,也称解析分度、或直接称多少线,一般在每转分度5~10000线。 信号输出: 信号输出有正弦波(电流或电压),方波(TTL、HTL),集电极开路(PNP、NPN),推拉式多种形式,其中TTL为长线差分驱动(对称A,A-;B,B-;Z,Z-),HTL 也称推拉式、推挽式输出,编码器的信号接收设备接口应与编码器对应。 信号连接—编码器的脉冲信号一般连接计数器、PLC、计算机,PLC和计算机连接的模块有低速模块与高速模块之分,开关频率有低有高。 如单相联接,用于单方向计数,单方向测速。 A.B两相联接,用于正反向计数、判断正反向和测速。 A、B、Z三相联接,用于带参考位修正的位置测量。 A、A-, B、B-,Z、Z-连接,由于带有对称负信号的连接,电流对于电缆贡献的电磁场为0,衰减最小,抗干扰最佳,可传输较远的距离。 对于TTL的带有对称负信号输出的编码器,信号传输距离可达150米。 对于HTL的带有对称负信号输出的编码器,信号传输距离可达300米。

基于单片机的液晶显示

滨江学院 学年论文 题目基于单片机的液晶显示 院系自动控制系 专业电气工程与自动化学生姓名 学号 指导教师 二零一三年十二月二十五号

目录 1.引言 (1) 2.现状 (1) 3.主要目的 (2) 4.实现方案和步骤 (2) 4.1 KS0108 (2) 4.1.1 KS0108特点 (2) 4.1.2 KS0108的引脚功能 (3) 4.1.3 KS0108的指令系统 (4) 4.2 图形点阵式液晶显示控制 (5) 4.3汉字编码原则 (8) 4.4程序实现流程 (9) 5.实验结果及结果讨论 (10) 6.结论 (11) 7.参考文献 (11) 8.附件 (12)

南京信息工程大学滨江学院学年论文 基于单片机的液晶显示 南京信息工程大学滨江学院自动控制系,南京 210044 摘要:本文围绕设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机8051,采用的液晶显示控制器的芯片是SED1520,主要实现中文显示、滚屏以及左右移动功能。同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程,并详细阐述了程序的各个模块。 关键字:单片机、液晶显示、8051、SED1520 1、引言 单片机液晶显示系统主要是指单片机以及由单片机驱动的点阵式液晶显示屏所组成的一个显示系统[1]。我们在许多地方可以看到LCD显示屏的应用,例如空调,车内广告,冰箱和显示仪表盘等等,它们都是一个小型的单片机控制液晶显示系统。在日常生活中,我们也可以看到一些类似的由单片机控制的显示系统,如火车站售票大厅的候车信息显示屏,在这些屏幕上,可以显示各种不同的图形、汉字等,并且可以实现上下滚屏与左右移动等。这就是在现代工业控制和一些智能化仪器仪表中,越来越多的场所需要用点阵图形显示器显示汉字,需要能够显示更丰富信息和通用性较强的显示器,便于开发和应用,并要求其体积小、重量轻、功耗小。图形点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线及汉字,并且可以实现屏幕画面滚动等功能,是信息处理、信息输出的重要手段之一,具有广泛的应用前景[2]。我选择的单片机液晶显示系统的开发,是基于KS0108液晶显示控制器,在C8051F020单片机实验系统上实现KS0108是点阵型液晶显示控制器,利用单片机控制液晶显示系统的原理,完成单片机液晶显示系统的设计。 2、现状 液晶显示器具有功耗低、体积小、重量轻、超薄等许多其它显示器无法相比的优点。近年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品当中。液晶显示器分为字符型LCD显示模块和点阵型LCD显示模块。字符型LCD是一种用5×7点阵图形来显示字符的

单片机之LCD显示原理

5.自制单片机之五LCD1602的驱动 LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示: 字符型LCD的引脚定义 HD44780内置了DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表: 也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下: DDRAM地址与显示位置的对应关系 我们知道文本文件中每一个字符都是用一个字节的代码记录的。一个汉字是用两个字节的代码记录。在PC上我们只要打开文本文件就能在屏幕上看到对应的字符是因为在操作系统里和BIOS里都固化有字符字模。什么是字模?就代表了是在点阵屏幕上点亮和熄灭的信息数据。例如“A” 字的字模: 01110 ○■■■○ 10001 ■○○○■ 10001 ■○○○■ 10001 ■○○○■ 11111 ■■■■■ 10001 ■○○○■

10001 ■○○○■ 上图左边的数据就是字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。看出是个“A”字了吗?在文本文件中“A”字的代码是41H,PC收到41H的代码后就去字模文件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字了。 刚才我说了想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码41H就行了,可41H这一个字节的代码如何才能让LCD模块在屏幕的阵点上显示“A”字呢?同样,在LCD模块上也固化了字模存储器,这就是CGROM和CGRAM。 HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。下图说明了CGROM和CGRAM与字符的对应关系。 从上图可以看出,“A”字的对应上面高位代码为0100,对应左边低位代码为0001,合起来就是01000001,也就是41H。可见它的代码与我们PC中的字符代码是基本一致的。因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把“A”先转为41H代码了。 字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。后面我会详细说的。 0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。 那么如何对DDRAM的内容和地址进行具体操作呢,下面先说说HD44780的指令集及其设置说明,请浏览该指令集,并找出对DDRAM的内容和地址进行操作的指令。 共11条指令: 1.清屏指令 功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H; <2> 光标归位,即将光标撤回液晶显示屏的左上方; <3> 将地址计数器(AC)的值设为0。 2.光标归位指令 功能:<1> 把光标撤回到显示器的左上方; <2> 把地址计数器(AC)的值设置为0; <3> 保持DDRAM的内容不变。

ARM单片机简介

电子产业链全程电子商务平台| 旗下网站华强电子网 华强LED网 华强手机制造网 华强电子交易所 华强电子检测中心 外贸通 English | 繁体 | 帮助中心 | 产品服务会员套餐 诚易通 600条 竞价排名 ISCP现货认证 BCP品牌认证 中国制造 委托交易 洽洽 酷管家 旺铺 推介竞标 推广服务 在线交易 诚信保证服务 手机华强电子网 华强手机制造网 超级买家 | 进入互联商务系统上传IC库存参与竞价排名 发布求购信息 查看客户评价 修改企业网站 发布元器件 发布推介信息

管理询报价 查看客户留言 修改注册信息 [当前1041位会员在线] 华强电子网 购物车 精确 首页 供应信息 中国制造 求购信息 诚信交易 技术资料 求职招聘 商情资讯 商友社区 客服热线:400-887-3118 位置: 首页 技术资料 电子维基 arm单片机 电子维基 arm单片机[浏览次数:334次] arm单片机是以ARM处理器为核心的一种单片微型计算机,是近年来随着电子设备智能化和网络化程度不断提高而出现的新兴产物。ARM是一家微处理

器设计公司的名称,ARM既不生产爱心篇也不销售芯片,是专业从事技术研发和授权转让的公司,世界知名的半导体电子公司都与ARM简历了合作伙伴关系,包括国内许多公司也从ARM购买芯核技术用于设计专用芯片。arm单片机以其低功耗和高性价比的优势逐渐步入高端市场,成为了时下的主流产品。 目录 arm单片机的优势 arm单片机的结构特性 arm单片机的工作状态和模式 arm单片机的寄存器结构 arm单片机的常见异常 arm单片机的应用 arm单片机的发展趋势 arm单片机的优势 ARM单片机采用了新型的32位ARM核处理器,使其在指令系统,总线结构,调试技术,功耗以及性价比等方面都超过了传统的51系列单片机,同时arm 单片机在芯片内部集成了大量的片内外设,所以功能和可靠性都大大提高。arm单片机的结构特性 具有统一和固定长度的指令域,使指令集和指令译码都大大简化 具有一个大而统一的寄存器文件,大多数数据操作都在寄存器中完成,使指令执行速度更快 采用加载/存储结构,使数据处理时只对寄存器操作,而不直接对存储器操作 寻址方式简单而灵活,所有加载/存储的地址都只由寄存器的内容和指令域决定,执行效率高 每一条数据处理指令都对算术逻辑单元和移位寄存器进行控制,以最大限度的提高算术逻辑单元和移存器的利用率 采用自动增减地址的寻址方式,有利于优化循环程序的执行 引入多寄存器加载/存储指令,有利于实现数据吞吐量的最大化 arm单片机的工作状态和模式

单片机实验lcd显示实验

实验19 LCD显示实验 一、实验目的: 学习液晶显示的编程方法,了解液晶显示模块的工作原理。 掌握液晶显示模块与单片机的接口方法。 二、所需设备 CPU挂箱、8031CPU模块 三、实验内容 编程实现在液晶显示屏上显示中文汉字“北京理工达盛科技有限公司”。四、实验原理说明 五、实验步骤 1、实验连线 8255的PA0~PA7接DB0~DB7,PC7接BUSY,PC0接REQ,CS8255接CS0。 2、运行实验程序,观察液晶的显示状态。 六、程序框图 七、程序清单

八、附:点阵式LCD模块 点阵式LCD模块由一大一小两块液晶模块组成。两模块均由并行的数据接口和应答信号接口两部分组成,电源由接口总线提供。 (1)OCMJ2×8液晶模块介绍及使用说明 OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实现文本显示。 OCMJ中文模块系列液晶显示器也可用作一般的点阵图形显示器之用。提供有位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。完全兼容一般的点阵模块。 OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。 本系列模块具有上/下/左/右移动当前显示屏幕及清除屏幕的命令。一改传统的使用大量的设置命令进行初始化的方法,OCMJ 中文模块所有的设置初始化工作都是在上电时自动完成的,实现了“即插即用”。同时保留了一条专用的复位线供用户选择使用,可对工作中的模块进行软件或硬件强制复位。规划整齐的10个用户接口命令代码,非常容易记忆。标准用户硬件接口采用REQ/BUSY 握手协议,简单可靠。 1)表—1:OCMJ2X8(128X32)引脚说明 硬件接口 接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1)表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节后才开始执行整个命令的内

Arduino关于旋转编码器程序的介绍资料

Arduino关于旋转编码器程序的介绍介绍 旋转或编码器是一个角度测量装置. 他用作精确测量电机的旋转角度或者用来控制控制轮子(可以无限旋转,而电位器只能旋转到特定位置)。其中有一些还安装了一个可以在轴上按的按钮,就像音乐播放器的控制按钮。Some of them are also equipped with a pushbutton when you press on the axis (like the ones used for navigation on many music controllers). 它们的精度多种多样,有每圈16步到1024步的各种,价格也从2到200欧元不等。 我写了一个小例子去读旋转编码器,并且使将读数通过RS232显示。我们很容易实现当编码器每走一步更新一下计数,并且将它通过串口显示在电脑上(通过串口监视器)。这个程序在ALPS STEC12E08编码器(每圈有24步)上运行良好。但是我认为当它使用在一个有更高精度的编码器上时有可能就会失效或者当电机旋转很快,或者你拓展这个程序以适应多个编码器。请先试试他吧。 我在Arduino distribution(A VRLib的一部分)的encoder.h中学会了怎样操作编码器。谢谢作者:Pascal Stang,感谢他对每一个函数友好而详细的解释。如下: Example 1 /* Read Quadrature Encoder * Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V. * * Sketch by max wolf / https://www.doczj.com/doc/741955009.html, * v. 0.1 - very basic functions - mw 20061220 * */ int val; int encoder0PinA = 3; int encoder0PinB = 4; int encoder0Pos = 0; int encoder0PinALast = LOW; int n = LOW; void setup() { pinMode (encoder0PinA,INPUT); pinMode (encoder0PinB,INPUT); Serial.begin (9600); } void loop() { n = digitalRead(encoder0PinA); if ((encoder0PinALast == LOW) && (n == HIGH)) {//上升沿

根据C51单片机的键盘及LCD显示

基于C51单片机的键盘及LCD显示 一、实验目的 1.掌握矩阵式键盘的数字键和功能键的编程方法。 2.掌握LCD的接口技术和编程方法。 3.掌握仪器监控程序设计和调试方法。 二、预习与参考 1. 结合ST7920 控制器系列中文图形液晶模块有关资料手册,详细了解ST7920接口设计技术。 2. 参考资料 1)实验板说明书 2)ST7920 控制器系列中文图形液晶模块资料手册 三、设计指标 利用实验板上提供的键盘电路,LCD显示电路,设计一人机界面,能实现以下功能: 1.LCD上显示“重庆科技学院” 2.按键至少包括0-9的数字键 3.LCD显示按键值 4.电子钟显示:时,分,秒(选作) 四、实验要求 1.以单片机为核心,设计4*4非编码键盘及LCD的硬件电路,画出电路原理图。 2.设计4*4非编码键盘及LCD的控制软件,画出流程图,编写控制程序。

五、实验仪器设备和材料清单 单片机实验板、连接导线、ST7920图形液晶模块、PC机; Keil c51软件 六、实验设计及实施的指导 1.实验课前布置实验任务,提出实验要求,预习相关资料,完成硬件草图设计和软件流程图备查。 2.经指导教师检查,预习达到要求者进入实验室实验。 3.按照设计的电路连线,构建键盘及显示系统,经检查无误方可进入下一步。 4.在指导教师指导下调试LCD显示程序。 5.在指导教师指导下调试按键程序。 6.综合调试直到满足设计要求。 七、实验成绩评定方法 实验成绩包括预习、实验完成质量、实验报告质量4部分组成,各部分所占比例分别为30%、30%、40%。 八、实验报告要求 1.实验报告格式: 一.实验名称 二.实验目的 三.实验内容 四.设计思想 五.硬件设计 六.程序代码

编码器

旋转编码器的信号线与单片机的接法 悬赏分:20 - 解决时间:2009-3-25 22:29 我直接拿信号线去接t0口,结果烧了两根信号线,就是信号线不能检测处方波了。想问编码器与单片机的正确接法是怎样?是不是需要接口电路呢?拜托高手帮帮小弟,能给出电路图和具体元件的有追加分!! 提问者:cauwhnh - 二级 最佳答案 关键是你要先确定旋转编码器的输出信号是什么电平的,通常单片机只能直接接受0--Vcc 的电平输入,输入电压高的话就很容易烧掉口线。 你的问题大概就是旋转编码器的输出信号电平较高,解决倒也简单,量一下它的高电平是多少,然后用2个电阻分压成0--Vcc就可以了(保险起见还可以再小一点,例如0--0.8Vcc)。另外,最好在分压电阻上再加小电容滤波,然后经施密特触发器(例如7414)整形后再接单片机,这样一来可以减少外部干扰,使计数更可靠,二来可以保护单片机(至多烧坏一片7414) 7 回答者:sd_jack - 六级2009-3-11 09:17 我来评论>>提问者对于答案的评价: 谢谢啊!最近又换了一个,经过放大才能用,又出现了杂波的问题。太头疼了 相关内容 ? 请教,把旋转编码器的A、B两相信号分别倍频组合后做为单片机的计数脉冲,用那些芯片可以实现? 4 2009-9-22 ?为什么我把光电编码器的信号线接到单片机上却不接受呢? 6 2009-3-8 ? 请问各位大虾,直流电机编码器如何把信号反馈给单片机 5 2009-9-12 ? 编码器输出的信号都有哪些类型,可以用单片机接收吗?要是可以怎么弄 呢?? 3 2008-4-25 ? 急求:做过实物的高手请问光电编码器的信号如何让单片机的计数器接收 3 2009-3-29 更多关于单片机编码器的问题>> 等待您来回答

基于51单片机的LCD1602显示程序模块

这个是我自己编写的基于51单片机控制lcd602显示的库函数,请下载我的头文件,在网上本人还分享了很多热门模块的库函数,都是现成的,欢迎下载!!!! /************************************************************************ 1,先初始化1602:lcd_init(); 2,调整显示位置:lcd_pos(hang,lie); 3,送显示:lcd_wdat(uchar dat);显示字符 lcd_show(uchar dis[]);显示字符串 4,清屏为:lcd_wcmd(0x01); //清除lcd内容 delay12_ms(2); 注: 显示的时候必须传送对应的ASK码 显示字符串的时候如果超过本行显示范围不会自动跳到第二行占用了P0和P25,P26,P27 同时包含delay.c文件必须 ************************************************************************/ #include "myconfig.h" #include "delay.h" #define LCD_RS P26 //1602的命令和数据选择端 #define LCD_RW P25 //1602的读写控制端 #define LCD_EP P27 //1602是能信号 #define LCD_DATE P0 //1602的数据传输或命令端口 /****************(外部不操作)测忙程序************************/ uchar lcd_bz() { uchar result; LCD_RS =0; LCD_RW =1; LCD_EP =1; _nop_(); _nop_(); _nop_(); _nop_(); result =(P0 &0x80); LCD_EP =0; return result;//返回结果,1为忙,0位空闲 } /****************(外部不操作)写命令函数************************/ void lcd_wcmd(int cmd) { while(lcd_bz()); LCD_RS =0; LCD_RW =0;

绝对值旋转编码器程序

绝对值旋转编码器程序 #include // 寄存器头文件包含 #include // 寄存器头文件包含 #include // 空操作函数,移位函数头文件包含 #define uchar unsigned char #define uint unsigned int /* sbit SH_CP = P1^1; //移位时钟脉冲端口 sbit DS = P1^2; // 串行数据输入端口 sbit ST_CP = P3^7; //锁存端口 */ int inc_data=0; //每刷新一次的增量值 int jms=0; //累计增量 int m_iPrvSSI = 0; int m_bIsSPI = 0; uchar uPrvState = 0; sbit AA = P3^3;// sbit BB = P3^4;//这个是时钟 sbit ZZ = P3^5;//这个是数据 sbit BEEP=P1^5; //正反判断 bit t_bFang = 1; int a; int iSSI = 0;

int temp,num,j; uchar led_buf[12]; /*定义LED显示缓冲区*/ uchar code table[]="0123456789"; void delay (int t) { int i,j; for(i=1;i for (j=1;j } void GetSSI(void) { uchar ix = 0; // uchar uState = 0; //状态位数据 int iSSI = 0;//当前的角度数据(0-1023) bit bCrc = 0; // 奇数或偶数标志位 int ire = 0; //增量数据,表示上次正确读的数据,和这次正确读的位置差 AA = 0; //CSN _nop_();_nop_(); BB = 0;//CLK _nop_();_nop_(); BB = 1;//CLK _nop_();_nop_(); for(ix = 0; ix { BB = 0;//CLK

单片机实验LCD显示实验

实验19L C D显示实验 一、实验目的: 学习液晶显示的编程方法,了解液晶显示模块的工作原理。 掌握液晶显示模块与单片机的接口方法。 二、所需设备 CPU挂箱、8031CPU模块 三、实验内容 编程实现在液晶显示屏上显示中文汉字“北京理工达盛科技有限公司”。 四、实验原理说明 五、实验步骤 1、实验连线 8255的PA0~PA7接DB0~DB7,PC7接BUSY,PC0接REQ,CS8255接 CS0。 2、运行实验程序,观察液晶的显示状态。 六、程序框图 八、附:点阵式LCD 模块 点阵式LCD模块 由一大一小两块液晶 模块组成。两模块均 由并行的数据接口和 应答信号接口两部分 组成,电源由接口总 线提供。 (1)OCMJ2×8液晶 模块介绍及使 用说明 OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和 ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实现文本显示。 OCMJ中文模块系列液晶显示器也可用作一般的点阵图形显示器之用。

提供有位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。完全兼容一般的点阵模块。 OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。 本系列模块具有上/下/左/右移动当前显示屏幕及清除屏幕的命令。一改传统的使用大量的设置命令进行初始化的方法,OCMJ 中文模块所有的设置初始化工作都是在上电时自动完成的,实现了“即插即用”。同时保留了一条专用的复位线供用户选择使用,可对工作中的模块进行软件或硬件强制复位。规划整齐的10个用户接口命令代码,非常容易记忆。标准用户硬件接口采用REQ/BUSY 握手协议,简单可靠。 硬件接口 接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1)表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节后才开始执行整个命令的内部操作,因此,最后一个字节的应答BUSY 高电平(BUSY =1)持续时间较长,具体的时序图和时间参数说明查阅相关手册。

编码器编程

我用的是三菱PLC的FX2N,这里有A、B、Z相的HK38系列的增量式旋转编码器,将PLC 的X0,X1,X2分别接编码器的A相和B相及Z相,用PLC的双相计数器C252计数,虽然我知道A相超过B相90°为顺时针转,滞后就逆时针转,但不知道如何具体编程,我的目的是达到测旋转轴的角度,从-135°~-30°~-10°~10°~+30°~-135°,正反转旋转 多谢各位,我改了一下,但仍旧没找到问题原因,但测试中发现,接X2和X5都能使C252复位,尽管手册上说只有X2复位,但由于以上提到的Z相接入任何一个输入端都使之ON,所以我就避开了接X2和X5端子,改接其他的端子,比如X3,这并不是因为它是高速输入端的一种才选,其他端也一样,因此我采用了软件复位,也没办法了,效果倒是达到了想要的,

DHSZ D200 K8 C235 M8130 HSZ是高速区间比较指令,前面加D是32位的。运作如下: D200 > C235 M8130 ON D200<=C235>=k8 M8131 ON D200 < C235 M8132 ON

将旋转编码器的A相或B相的输出信号连接至X0~X5,(使用不同的计数器,接不同的输入点)然后用高速计数器对编码器的脉冲信号进行计数。以C235为例,只进行加计数,脉冲编码器的A相或B相需要接入PLC的X0,当设备带动编码器旋转,则X0就有信号输入,C235就会进行计数。使用很简单。 需求一段三菱PLC+旋转编码器+变频器实行多段距离控制,例如:上升总距离为50cm,0-15cm 实行20hz运行、16-25 cm 实行35HZ运行、26-35cm实行40HZ 运行、36-46cm实行20HZ 运行、47-50cm实行10HZ运行;下降反之! 程序中的数字,是按每厘米100个脉冲设计的,在实际中还要经过计算。

实验八单片机液晶显示实验

实验八单片机液晶显示实验 一、实验目的 1、了解液晶显示屏的控制原理及方法。 2、了解点阵汉字的显示原理。 二、实验说明 1、利用实验上的液晶显示屏电路,编写程序控制显示,输出汉字。 2、本实验仪采用的液晶显示屏内置控制器为SED1520,点阵为122x32,需要两片SED1520组成,由E1、E2分别选通,以控制显示屏的左右两半屏。图形液晶显示模块有两 种连接方式。一种为直接访问方式,一种为间接控制方式。本实验仪采用直接控制方式。 三、实验仪器 计算机 伟福实验箱(lab2000P ) 四、实验内容 1、利用实验上的液晶显示屏电路,编写程序控制显示,输出汉字。 2、本实验仪采用的液晶显示屏内置控制器为SED1520,点阵为122x32,需要两片SED1520组成,由E1、E2分别选通,以控制显示屏的左右两半屏。图形液晶显示模块有两 种连接方式。一种为直接访问方式,一种为间接控制方式。本实验仪采用直接控制方式。 3、直接控制方式就是将液晶显示模块的接口作为存储器或I/O设备直接挂在计算机总线上。计算机通过地址译码控制E1和E2的选通;读/写操作信号R/W由地址线A1控制;命令/数据寄存器选择信号AO由地址线A0控制。实际电路如上图所示。地址映射 如下(地址中的X由LCD CS决定,可参见地址译码部分说明) 五、思考题 1、显示自己的班级和姓名; 2、可以动态显示,上下或者左右移动; 六、源程序修改原理及其仿真结果 CWADD1 EQU 08000H ;写指令代码地址(E1) DWADD1 EQU 08001H ;写显示数据地址(E1) CRADD1 EQU 08002H ;读状态字地址(E1) DRADD1 EQU 08003H ;读显示数据地址(E1) CWADD2 EQU 08004H ;写指令代码地址(E2) DWADD2 EQU 08005H ;写显示数进地址(E2) CRADD2 EQU 08006H ;读状态字地址(E2) DRADD2 EQU 08007H ;读显示数据地址(E2) PD1 EQU 3DH ;122/2 分成左右两半屏122x32 COLUMN EQU 30H PAGE_ EQU 31H ;页地址寄存器D1,DO:页地址 CODE_ EQU 32H ;字符代码寄存器 COUNT EQU 33H ;计数器 DIR equ 34h dtp1 equ 35h

旋转编码器工作原理

增量式旋转编码器工作原理 增量式旋转编码器通过内部两个光敏接受管转化其角度码盘的时序和相位关系,得到其角度码盘角度位移量增加(正方向)或减少(负方向)。在接合数字电路特别是plc后,增量式旋转编码器在角度测量和角速度测量较绝对式旋转编码器更具有廉价和简易的优势。增量式编码器是直接利用光电转换原理输出三组方波脉冲A、B和Z相;A、B两组脉冲相位差90o,从而可方便地判断出旋转方向,而Z相为每转一个脉冲,用于基准点定位。它的优点是原理构造简单,机械平均寿命可在几万小时以上,抗干扰能力强,可靠性高,适合于长距离传输。其缺点是无法输出轴转动的绝对位置信息。 增量式旋转编码器的内部工作原理(附图) 增量式编码器是直接利用光电转换原理输出三组方波脉冲A、B和Z相;A、B两组脉冲相位差90o,从而可方便地判断出旋转方向,而Z相为每转一个脉冲,用于基准点定位。它的优点是原理构造简单,机械平均寿命可在几万小时以上,抗干扰能力强,可靠性高,适合于长距离传输。其缺点是无法输出轴转动的绝对位置信息。 A,B两点对应两个光敏接受管,A,B两点间距为 S2 ,角度码盘的光栅间距分别为S0和S1。 当角度码盘以某个速度匀速转动时,那么可知输出波形图中的S0:S1:S2比值与实际图的S0:S1:S2比值相同,同理角度码盘以其他的速度匀速转动时,输出波形图中的S0:S1:S2比值与实际图的S0:S1:S2比值仍相同。如果角度码盘做变速运动,把它看成为多个运动周期(在下面定义)的组合,那么每个运动周期中输出波形图中的S0:S1:S2比值与实际图的S0:S1:S2比值仍相同。 通过输出波形图可知每个运动周期的时序为

单片机LED点阵显示方法与程序代码

单片机LED点阵显示方法与程序代码 点阵的接法有共阴和共阳两种(共阳指的是对每一行LED来讲是共阳)。 由于51单片机驱动能力有限,亮度不够,所以一般需要三极管驱动,下图为一个8X8点阵原理图,仅仅是仿真,如果需要接实物的话,加上三极管才足够亮。 显示的方法有两种: 1、逐列扫描方式。如下图所示,P1口输出列码决定哪一列能亮(相当于位码),P2口输出行码(列数据)决定列上哪些LED亮(相当于段码),能亮的列从左向右扫描完8列(相当于位码循环移位8次)即显示出一帧完整的图像。 2、逐行扫描方式,与逐列扫描调换,即P2口输出位码,P1口输出段码,扫描完8行显示出一帧图像。 以逐行扫描为例,从上图可以很明了的知道点阵的显示原理了(红色表示高电平,绿色表示低电平),当把扫描速度加快,人的视觉停留,看见的就是一幅图或一个字了,如下图所示。

一、行扫描静态显示, 用51单片机实现上图静态显示的程序如下: #include #define uchar unsigned char #define uint unsigned int uchar code TAB[]={0x81,0xFD,0xFD,0xC1,0xBF,0xBF,0xBD,0xC3}; uchar i,t; delay(uchar t) { while (t--) {;} } void main(void) { while(1) { P2=0x01; for(i=0;i<8;i++) { P1=TAB; delay(100); P2=P2<<1|P2>>7; } } } 二、行扫描翻页显示 字码取模方式为逐行 第一次从字码数组中取出第1~8个数据置于列上,行扫描顺序为1~8行,显示一帧,第二次取第9~16个数据,行扫描顺序仍为1~8行,显示第二帧,第三次取第17~24个数据,…… 实现图显示效果的程序如下:

旋转编码器在线速度检测控制中的应用

在电缆生产线上,通常需要检测电缆的走线速度,用来控制收线电机的转速和计算线缆的长度。成缆工艺参数的稳定,直接关系到电线电缆的质量。 该项目是为某电缆厂的技术改造项目,要改造的设备是利用束线原理制造的盘绞式成缆机,改造的内容是更换全部电气控制系统。这种成缆机的放线盘固定,而收线盘固定在盘绞架上同时完成绞合和收线的双重运动。工作时,在线缆盘直流电机的带动下,完成电缆的收线运动,在排线电机的带动下实现电缆在收线盘的整齐排列。在大盘电机的带动下,通过齿轮箱带动盘绞架实现轴向旋转,完成电缆绞合运动,是保证节距的关键。线速度是由收线盘的旋转速度决定的,如果收线电机的转速恒定,收线盘随着收线轴的变粗,线速度会增大,因此,为保证收线速度恒定,要逐渐降低收线电机的转速。 1 系统设计原理 根据电缆的生产工艺要求,不同型号的电缆,其走线速度是恒定的。通常,电缆的运行速度是由电缆带动旋转编码器来检测的。电缆线速度测速示意图如图1所示。 该项目中,采用的旋转编码器的型号是TRDJ1000系列,旋转一周输出1 000个脉冲。因此,根据在一定时间内检测到的脉冲数,就可以计算出电缆的走线速度。实际应用中,将其与一加工精度极高、周长为500 mm的旋转编码器测量主动轮与旋转编码器同轴安装,主动轮与电缆接触。在电缆生产运动过程中,依靠摩擦力拉动测量轮旋转,这样就把电缆的直线位移(长度)转化为旋转编码器的脉冲数字信号输出。

设旋转编码器每旋转一周,其计数脉冲个数为NP(脉冲个数/转),则旋转编码器角分辨率(单位:(°)/个)为: P=360/NP 假定固定在旋转编码器转轴上的主动导向轮半径为r m,则旋转编码器位移分辨率(单位:m/个)为: Ps=27πr/NP 这时,若计数脉冲个数为N(个),则由旋转编码器测量的位移量S(单位:m)为: S=Ps·N 线缆走线速度V(单位:m/s)为: V=S/T 式中:T为接收N个脉冲所用的时间(单位:s)。 2 硬件电路设计原理 该检测电路以AT89C51单片机为控制核心,如图2所示,旋转编码器输出的脉冲,经过电平转换,变成O~5 V的TTL电平脉冲,送到AT89 C51单片机的外部中断INT0端。每收到

单片机电子时钟LCD显示

单片机电子时钟L C D 显示 Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】

单片机综合实验报告 题目:电子时钟(LCD)显示 班级: 0310405班 学号: 学生姓名:张金龙 指导老师:高林 2013年 6 月 17 日 一、实验内容: 以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间: ●使用字符型LCD显示器显示当前时间。 ●显示格式为“时时:分分:秒秒”。 ●用4个功能键操作来设置当前时间,4个功能键接在~引脚上。 功能键K1~K4功能如下。 ●K1—进入设置现在的时间。 ●K2—设置小时。 ●K3—设置分钟。 ●K4—确认完成设置。 程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。

二、实验电路及功能说明 1)单片机主控制模块 以AT89C51单片机为核心进行一系列控制。 2)时钟显示模块 用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,连接后用 初始化程序对其进行简单的功能测试。测试成功后即可为实验所用,如图: 3)时间调整电路 用4个功能键操作来设置当前时间,4个功能键接在~引脚上。功能键K1~ K4功能如下。K1—进入设置现在的时间。K2—设置小时。K3—设置分钟。 K4—确认完成设置。如图: 三、实验程序流程图: 主程序: 时钟主程序流程 子程序:

四、实验结果分析

实验结果及分析:单片机的晶振可以根据要求设定。6MHZ为和现实时间显示相同。实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为 23:59:50 运行后显示 ,K1为进入现在设置时间,当按下K1后显示 ,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;不同之处: 当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。增加功能:进入时间设置并选择设置位置后K2键位数字增加功能,K3键为数字减小功能。根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。 五、心得体会 每次做单片机实验都会有不同的等收获,而这次的实验让我感觉收获更大。这次的实验让我巩固了以往所学,而且锻炼了自己发现问题解决问题的能力。在编程过程,发现自己对C语言很生疏,很多 技巧和函数运用都不会,通过参考资料和询问同学终于让我完成了程序,并实现了程序的功能。这不仅提高了自己动手能力,也培养了自己的思考能力。 这次在编程过程中学到了很多新东西,特别是LCD的显示,在设定的显示字符后,正确编译后显示各种设定值,LCD显示16位字 符,在最初编程时编译正确但是LCD上的显示字符有缺失,显示不 完整,经过不断调试发现空格同样占据字符,只有所有字符不超过 16位且位置正确时才能完整正确显示。时间的显示需要每一个显示 的位子有定义,而且要给“:”留下特定位子。同时编程时发现还可以显示其他如日期。但本实验不需要且很难完成最终没实现。

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ bit Lcd_BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void Lcd_WriteCom (unsigned char dictate) { while(Lcd_BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

相关主题
文本预览
相关文档 最新文档