(最终)1602显示的计算器

(最终)1602显示的计算器
(最终)1602显示的计算器

基于单片机的1602显示的简易计算器

刘哲

电子121 学号2012131017

摘要:单片机是一个单芯片形式、面向控制对象的嵌入式应用计算机系统。他的出现及发展是计算机技术从通用型数值计算领域进入到智能化的控制领域。从此,计算机技术在两个重要领域——通用计算机领域和嵌入式计算机领域都得到了极其重要的发展,并正在深深地改变我们的社会。本设计是基于51单片机来进行的数值计算器系统的设计,可以完成计算器的键盘输入,进行加减乘除八位数范围内的基本四则运算,并在LCD上显示出来。涉及电路采用AT89C51单片机为主要控制电路,利用4*4矩阵键盘作为计算器的数字以及运算符的输入,显示采用字符LCD静态显示。软件方面使用C语言编程,并用开发板制作和演示。

关键词:51单片机,矩阵键盘,LCD,运算器

1 引言

本次课程设计,我是基于单片机STC89C51的控制能力,使用包括单片机芯片,1602液晶显示屏,行列式键盘等来设计一个简单的计算器,本计算器因为按键的关系,仅实现了加减乘除四个基本计算法则的运算,初步实现了一个计算器所具有的基本功能。

2 总体架构

2.1 设计预想

本设计使用STC89C52单片机作为主控芯片,利用矩阵键盘输入0~9十个数值和加减乘除四个运算法则,通过芯片的运算,在LCD上显示过程和结果。2.2 设计思路

根据课程设计要求和设计指标,本系统采用STC89C52作为主控芯片,通过拓展必要的外部电路,实现对计算器的设计,具体设计思路如下:由于要显示的运算式和结果,为了达到良好的显示效果,本系统采用LCD1602液晶显示屛作为显示模块。计算器一般包括数字键(0~9),符号键(+、—、*、/),清零按键,等号按键,故采用4*4矩阵键盘结合键盘扫描技术容易达到要求,并且电路和程序也比较简单。

鉴于本设计的计算器的难度和功能上的要求,在本设计中决定使用语言功能丰富,表达能力强,使用方便灵活,可移植性好的C语言编程,这样有利于减少工作量和代码量,提高设计效率。

2.3 设计图

图1 系统总体设计图

3 硬件系统设计

3.1 主控芯片STC89C52单片机

STC89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

其主要的功能特性有:

1、兼容MCS51指令系统

2、8k可反复擦写(大于1000次)Flash ROM;

3、32个双向I/O口;

4、256x8bit内部RAM;

5、3个16位可编程定时/计数器中断;

6、时钟频率0-24MHz;

7、2个串行中断,可编程UART串行通道;

8、2个外部中断源,共8个中断源;

9、2个读写中断口线,3级加密位;

10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;

11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。

图2 主控芯片STC89C52单片机

3.2 矩阵键盘

矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。

3.2.1 矩阵键盘的结构和工作原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,

列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。

3.2.2 矩阵式键盘的按键识别方法

<1>确定矩阵式键盘上何键被按下介绍一种“行扫描法”。

行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。

1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。

2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

<2>确定矩阵式键盘上何键被按下介绍一种“高低电平翻转法”。

首先让P3口高四位为1,低四位为0,。若有按键按下,则高四位中会有一个1翻转为0,低四位不会变,此时即可确定被按下的键的行位置。

然后让P3口高四位为0,低四位为1,。若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。最后将上述两者进行或运算即可确定被按下的键的位置。

图3 矩阵键盘仿真结构

3.3 LCD1602液晶显示屏

1602LCD 分为带背光和不带背光两种,基控制器大部分为 HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。

3.3.1 1602LCD 主要技术参数:

显示容量:16×2 个字符

芯片工作电压:4.5—5.5V

工作电流:2.0mA(5.0V)

模块最佳工作电压:5.0V

字符尺寸:2.95×4.35(W×H)mm

3.3.2 引脚功能说明

1602LCD 采用标准的 14脚(无背光)或 16脚(带背光)接口,各引脚接口说明如表 10-13

所示:

编号符号引脚说明编号符号引脚说明

1 VSS 电源地 9 D

2 数据

2 VDD 电源正极 10 D

3 数据

3 VL 液晶显示偏压 11 D

4 数据

4 RS 数据/命令选择 12 D

5 数据

5 R/W 读/写选择 13 D

6 数据

6 E 使能信号 14 D

7 数据

7 D0 数据 15 BLA 背光源正极

8 D1 数据 16 BLK 背光源负极

3.3.3 引脚接口说明

第 1 脚:VSS 为地电源。

第 2 脚:VDD接 5V正电源。

第 3 脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。

第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS和 R/W共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W为低电平时可以写入数据。

第 6 脚:E端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。

第 7~14脚:D0~D7为 8 位双向数据线。

第 15脚:背光源正极。

第 16脚:背光源负极。

3.3.4 显示屏显示的说明以及执行流程图、原理图

图4 1602LCD 内部显示地址

例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平 1 所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 1602 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个不同的点阵字符图形,

如图5所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是 01000001B (41H),显示时模块把地址 41H中的点阵字符图形显示出来,我们就能看到字母“A”。

图5 显示器模块地址

图表 6 写数据流程图表 7 写命令流程

图表 8 判断LCD 是否忙碌,忙则返回1 图9 液晶屏电路

图10 显示器引脚和芯片引脚

3.4 电源模块设计

由于ATC89C52和LCD1602都采用5V 供电,而且其他模块功能也使用5V 电平,本系统采用USB 数据线供电,最终得到稳定的5V 电平供给系统使用,其电路如下:

图11 电源模块电路图

3.5 蜂鸣器/流水灯模块设计

3.5.1 蜂鸣器模块

如下图所示,用一个Speaker和三极管、4.7k电阻接到单片机的P2.3引脚

上,构成声音提示音电路,如图所示为按键提示音电路。

图12 蜂鸣器模块LED电路

3.5.2 流水灯模块

LED流水灯是运用单片机原理和一些芯片功能,结合C语言或者汇编语言,实现灯的亮灭方式。本设计中采用8个LED发光二极管并有4种流水灯变化花样,电路图如下图所示;

图13 8为LED指示电路

3.6 系统总体电路原理图

图14 系统总体电路原理图

4 系统软件设计

本设计采用大笑循环嵌套方式的软件设计思想,大循环一直在运行,使计算器一直处在工作状态,并不断扫描键盘,小循环用于识别数字是否输入完成,一旦检测到输入的是运算符,则转换输入数值并储存起来,最后按下等于号则根据运算符计算两个数值,并通过LCD显示出来。

图表15 软件系统总框图

5 系统功能调试

5.1 总体实物测试

图16 制作出来的系统实物图5.2 LCD1602初始状态显示

图17 LCD1602初始状态显示

5.3 各项功能测试

图18 加法运算图19 减法运算

图20 乘法运算图21 除法运算由于以上测试结果可知,计算器的各项功能正常,基本达到了设计要求。5.4 不足之处

此次设计尚有许多不足之处,比如:只实现了加减乘除四个运算法则;没有实现小数部分的运算;没有删除功能键,当输入错误时,只能通过系统重启来复位。

6 小结

经过一番努力,本系统基本实现了设计之初的预想,实现了设计要求中的功能,基本完成了此次课程设计的要求和目地。在设计的过程中,也遇到了不少的困难,例如在LCD上显示任意位整数,显示任意位小数点,在输入小数的时候小数点的处理问题等等,最后通过不断的查阅资料,请教别人,修改程序,下载调试等过程,终于把遇到的问题逐一解决了,尽管有些问题解决得不是太令人满意,但也从中通过自己的努力和思考来解决的,得了很多,也学习到了很多。例如LCD1602的显示与接口技术,矩阵键盘的扫描程序等等,这些技术对熟练掌握单片机技术和以后单片机开发都是非常有用的。在设计的过程中的思考,用自己的智慧来解决问题,这对于我以后的生活工作都是十分有帮助的。

附录1 源程序清单

/**************************

| 7 | 8 | 9 | + |

- - - - - - - - - - - - -

| 4 | 5 | 6 | - |

- - - - - - - - - - - - -

| 1 | 2 | 3 | * |

- - - - - - - - - - - - -

| 0 | = | C | / |

*/

#include

#define uint unsigned int

#define uchar unsigned char

/******************LCD1602**********************/

#define LCD_RS P2_4

#define LCD_RW P2_5

#define LCD_EN P2_6

#define LCD_DA P0

#define KEY P3

#define Speak P2_3

#define LED P2_2

#define KEY_1 P2_0

#define LED1 P1

/**************************/

uchar code table[]= {" "};

/*****************************/

uchar code table1[]={" Welcome to "};

uchar code table2[]={" 51 MCU Counter "};

/*************************/

uchar code table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code table4[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table5[]={0x7e,0xbd,0xdb,0xe7}; uchar code table6[]={0xe7,0xdb,0xbd,0x7e};

/************************/

long int data_a=0;

long int data_b=0;

long int data_c=0;

uchar dispaly[10];

uchar i,j;

uchar flag=1;

uchar n=1;

uchar k=0;

uchar num=0;

uchar key=0xff;

uchar a=0;

uchar b=5;

uchar x=0;

/****************************/

void delay(uint time)

{

uint i,j;

for(i=time;i>0;i--)

for(j=110;j>0;j--);

}

/************************/

void delay_fmq(uint time)

{

uint x,y;

for(x=time;x>0;x--)

for(y=5;y>0;y--);

}

/*********************/

void spk()

{

LED=0;

for(j=0;j<100;j++)

{

Speak=0;

delay_fmq(5);

Speak=1;

delay_fmq(5);

}

LED=1;

}

/*************

***************/

void write_com(uchar com) {

LCD_RS=0;

LCD_RW=0;

LCD_DA=com;

delay(2);

LCD_EN=1;

delay(2);

LCD_EN=0;

}

/***************************/ void write_date(uchar date)

{

LCD_RS=1;

LCD_RW=0;

LCD_DA=date;

delay(2);

LCD_EN=1;

delay(2);

LCD_EN=0;

}

/**********************/

void W_lcd(unsigned char x,unsigned char y,unsigned char Data)

{

if(y==0)

{

write_com(0x80 + x);

}

else

{

write_com(0xc0 + x);

}

write_date(Data);

}

/*****************/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {

if(y==0) {

write_com(0x80 + x);

}

else

{

write_com(0xC0 + x);

}

while(*s)

{

write_date(*s);

s++;

}

}

/*******************************/ void LCD_init()

{

write_com(0x38);

write_com(0x0c);

write_com(0x01);

}

/********************************/ void cartoon()

{

spk();

write_com(0x80);

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

{

write_date(table1[i]);

delay(100);

}

write_com(0xc0);

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

{

write_date(table2[i]);

delay(100);

}

spk();

delay(200);

}

/**************************/

short keycheckdown()

{

short temp1,temp2,temp,a=0xff;

KEY=0xf0;

delay(20);

temp1=KEY;

KEY=0xff;

delay(20);

KEY=0x0f;

delay(20);

temp2=KEY;

KEY=0xff;

temp=(temp1&0xf0)|(temp2&0xf); switch(temp)

{

/******************/

case 0xee :a=7;

if(flag==1)

{

spk();

}

break;

case 0xed :a=8;

if(flag==1)

{

spk();

}

break;

case 0xeb :a=9;

if(flag==1)

{

spk();

}

break;

case 0xe7 :a=0x0a;

if(flag==1)

{

spk();

}

break;

/******************/

case 0xde :a=4;

if(flag==1)

{

spk();

}

break;

case 0xdd :a=5;

if(flag==1)

{

spk();

}

break;

case 0xdb :a=6;

if(flag==1)

{

spk();

}

break;

case 0xd7 :a=0x0b;

if(flag==1)

{

spk();

}

break;

/*********** *********/

case 0xbe :a=1;

if(flag==1)

{

spk();

}

break;

case 0xbd :a=2;

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

基于51单片机1602液晶显示简易计算器设计

#include #include #define uint unsigned int #define uchar unsigned char #define PI 3.141592 sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; sbit led=P2^4; sbit speek=P3^7; uchar table0[]={"Welcome to use"}; uchar table1[]={"made by Ms. Li"}; uchar table2[]={"error"}; uchar count; void main(void) { uchar error=0,i,first=0,dot1,dot2,dot1_num,dot2_num,minus1,minus2;//错误标志、第一次清屏标志、小数点标志以及小数点个数负号标志、负号个数 uchar Sin,Cos,Tan,ln; uchar Key_num,last_key_num; //键号 uchar flag=0,equal_flag; //运算符、等于符 double num1=0,num2=0,num=0,result=0,save_result; //第一个数、第二个数、计算结果

uchar first_num=0,Ans=0,second_num=0; InitLcd(); EA=1; ET0=1; TMOD=0X01; TH0=(65536-500)/256; TL0=(65536-500)%256; write_com(0x80+0x40+15); write_Dat('0'); write_com(0x80); while(1) { while(key_scan()==0xff); TR0=1; if(first==0) { first=1; write_com(0x01); } Key_num=key_scan(); switch(key_scan()) { case 1: if(last_key_num!=Key_num) { write_Dat('l'); write_Dat('n'); ln=1; }break; case 2: if(last_key_num!=Key_num) { write_Dat('s'); write_Dat('i'); write_Dat('n'); Sin=1; }break; case 3: if(last_key_num!=Key_num) { write_Dat('c'); write_Dat('o'); write_Dat('s'); Cos=1;

LED显示屏控制软件操纵使用说明(灵信V3.3)

第一章概述 1.1 功能特点 《LED Player V3.3》是本公司新推出的一套专为LED显示屏设计的功能强大,使用方便,简单易学的节目制作、播放软件,支持多种文件格式:文本文件,WORD文件,图片文件(BMP/JPG/GIF/JPEG...),动画文件(SWF /Gif)。 2.2 运行环境 操作系统 中英文Windows/7/NT/XP 硬件配置 CPU: 奔腾600MHz以上 内存:128M 相关软件 OFFICE2000--如需WORD文件必须安装

第二章安装与卸载 2.1 安装 《LED Player》软件安装很简单,操作如下:将LED Player播放软件的安装光盘插入电脑光驱,即可显示LED Player播放软件的安装文件,双击LED Player,即可实现轻松安装。 《LED Player》软件安装成功后,在【开始】/【程序】里将出现“LED软件”程序组,然后进入该程序组下的“LED Player”,单击即可运行,如图所示, opyright ? 2005-2007 Listen tech. All Rights Reserved 灵感设计诚信 同时,桌面上也出现“LED Player”快捷方式:如右图所示,双击它同样可以启动程序。

2.2 卸载 《LED Player》软件提供了自动卸载功能,使您可以方便地删除《LED Player》的所有文件、程序组和快捷方式,用户可以在“LED软件”组中选择“卸载LED Player”,也可在【控制面板】中选择【添加/删除程序】快速卸载. 第三章使用详解 3.1 节目组成 每块显示屏由一个或多个节目页组成。节目页是用来显示用户所要播放的文本、图片、动画等内容。区域窗口有十一种:图文窗、文本窗、单行文本窗、静止文本窗、时间窗、正计时窗、倒计时窗、模拟时钟窗、表格窗、动画窗、温度窗。 文件窗:可以播放各种文字、图片、动画、表格等几十种文件。 文本窗:用于快速输入简短文字,例如通知等文字。 单行文本窗:用于播放单行文本,例如通知、广告等文字。 静止文本窗:用于播放静止文本,例如公司名称、标题等文字。 时间窗:用于显示数字时间。 计时窗:用于计时,支持正/倒计时显示。

DSP课程设计---液晶显示器控制显示

一、设计题目:液晶显示器控制显示 (1) 二、设计目的与步骤: (1) 2.1、 (1) 2.2、 (1) 三、设计原理: (2) 3.1、扩展IO接口: (2) 3.2、液晶显示模块的访问、控制是由VC5416 DSP对扩展接口的操作完成.. 2 3.3、液晶显示模块编程控制: (2) 3.4、控制I/O口的寻址: (2) 3.5、显示控制方法: (2) 3.6.液晶显示器与DSP的连接: (4) 3.7、数据信号的传送: (4) 四、 CCS开发环境 (5) 4.1、 (5) 4.2、 (6) 五、C语言程序 (8) 六、实验结果和分析 (15) 6.1、 (15) 6.2、 (16) 6.3、 (16) 6.4、 (16) 七、设计收获及体会 (17)

一、设计题目:液晶显示器控制显示 二、设计目的与步骤: 2.1、设计目的 通过实验学习使用VC5416 DSP的扩展I/O端口控制外围设备的方法,了解液晶显示器的显示控制原理及编程方法。 2.2、设计步骤 1.实验准备: ⑴连接实验设备:请参看本书第三部分、第一章、二。 2.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21: 选择菜单Debug→Reset CPU。 4.打开工程文件:浏览LCD.c文件的内容,理解各语句作用 工程目录:C:\ICETEK\VC5416AES61\VC5416AES61\Lab0403-LCD\LCD.pjt。5.编译、下载程序。 6.运行程序观察结果: 7将内层循环中的 “CTRLCDLCR=( nBW==0 )?(ledkey[nCount][i]):(~ledkey[nCount][i]);”语句改为“CTRLCDRCR=( nBW==0 )?(ledkey[nCount][i]):(~ledkey[nCount][i]);”,重复步骤5-6,实现在屏幕右侧显示。 8.更改程序中对页、列的设置,实现不同位置的显示。

基于单片机的lcd1602的多功能计算器

单片机原理与应用技术 课程设计 基于51单片机的多功能计算器 院系:机电工程学院 专业(班级):电子信息工程1班 姓名: 学号: 20134081006 指导教师:邵海龙 职称:讲师 完成日期:2015 年9月22日

评定成绩: 关键词:单片机;液晶显示;计算器; 目录 引言 (3) 1 单片机及其应用……………………………………………………………………...3. 1.1单片机介绍 (3) 1.2单片机的应用 (4) 1.3 STC89C52单片机 (4) 2 液晶屏LCD1602原理及应用 (5) 2.1液晶屏LCD1602介绍及工作原理 (5) 2.2 液晶屏LCD1602的功能及应用 (5) 3 设计思路、仿真及调试 (7) 3.1设计方法 (7) 3.2硬件设计............................................................................... . (7) 3.2.1复位电路 (7) 3.2.2 液晶屏LCD1602显示电路 (8) 3.2.3 4*4键盘的设计 (9) 3.2.5 多功能计算器的总电路 (10) 3.3软件设计 (10) 3.4软件仿真 (17) 3.5硬件调试 (18) 4 结束语.............................................................. .. (18) 谢辞 (18) 参考文献 (19) 1 单片机及其应用 1.1单片机介绍

单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能 1.2单片机的应用 STC89C52 是STC公司推出的一款超强抗干扰,加密性强,在线可编程,高速,低功耗CMOS 8位单片机。片内含 8k bytes 的可反复擦写Flash只读程序存储器和256 bytes 的随机数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash 存储单元,功能强大的STC89C52单片机适合于许多较为复杂控制应用场合。 1.3 STC89C52单片机 3.2 STC89C52外部结构及特性 其外形封装有两种方式:双列直插式40脚封装(DIP)和方形44脚封装(PLCC),直插式40 脚封装(DIP)和外部总线结构如图2和图3所示:

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

简易计算器

单片机课程设计题目:简易计算器的设计 专业:06电子信息科学与技术 姓名:倪耀兴 学号:060303008 指导老师:蔡植善 理工学院电信系 设计日期:2009年5月 12日

简易计算器的设计 1.引言------------------------------------------------2 2. 设计任务和要求-------------------------------------2 2.1设计要求-------------------------------------------0 2.2设计方案的确定-------------------------------------2 2.3主要元器件介绍--------------------------------------------------------3 3.简易计算器的硬件设计--------------------------------4 3.1键盘电路的设计----------------------------------4 3.2显示电路的设计---------------------------------4 4.简易计算器的软件设计-------------------------------6 4.1简易计算器的软件规则--------------------------------6 4.2中断查键的按键程序设计-------------------------------7 4.3显示模块程序的设计----------------------------7 4.4主程序的设计---------------------------------------7 5.调试及性能分析--------------------------------------7 5.1硬件调试--------------------------------------------7 5.2软件调试--------------------------------------------7 5.3相关可靠性软件设计----------------------------------7 5.4完整的源程序---------------------------------------------------------8- 6.关键程序的流程图-------------------------------------17 7.设计心得------------------------------------------19 8. 参考文献-----------------------------------------19

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

dsp实验报告 哈工大实验三 液晶显示器控制显示实验

实验三液晶显示器控制显示实验 一. 实验目的 通过实验学习使用2407ADSP 的扩展I/O 端口控制外围设备的方法,了解液晶显示器的显示控制原理及编程方法。 二. 实验设备 计算机,ICETEK-LF2407-EDU 实验箱。 三.实验原理 ICETEK-LF2407-A 是一块以TMS320LF2407ADSP 为核心的DSP 扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。 液晶显示模块的访问、控制是由2407ADSP 对扩展I/O 接口的操作完成。 控制I/O 口的寻址:命令控制I/O 接口的地址为0x8001,数据控制I/O 接口的地址为0x8003 和0x8004,辅助控制I/O 接口的地址为0x8002。 显示控制方法: ◆液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数 值将改变显示,写入“1”则显示一点,写入“0”则不显示。其地址与象素的对应 方式如下: ◆发送控制命令:向液晶显示模块发送控制命令的方法是通过向命令控制I/O 接口 写入命令控制字,然后再向辅助控制接口写入0。下面给出的是基本命令字、解释 和 C 语言控制语句举例。 ?显示开关:0x3f 打开显示;0x3e 关闭显示; ?设置显示起始行:0x0c0+起始行取值,其中起始行取值为0 至63; ?设置操作页:0x0b8+页号,其中页号取值为0-7; ?设置操作列:0x40+列号,其中列号为取值为0-63; ◆写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的 数据写入液晶显示模块的缓存。将数据发送到相应数据控制I/O 接口即可。

Lcd1602简易计算器

Lcd1602显示实现千位数加减乘除用4*4矩阵按键输入0~9 +,-,*,/,=,和清除建 #include #define temp P3 sbit RS=P0^0; sbit RW=P0^1; sbit E =P0^2; unsigned char key_num; unsigned char lcd_tab3[16]=" "; unsigned char code lcd_tab4[]="0123456789+-*/="; unsigned char lcd_tab5[16]=" "; unsigned char lcd_tab6[]=" "; unsigned char lcd_tab7[]="."; int a,b,c,d,m,i; void decide(); long int key_cnt=0,key_number,key_number1; unsigned char flag1=0,flag2=0,flag3=0,flag4=0,flag5=0; long int result, result1, result2, result3, result4,result5, result6, result7, result8; int decimal0,decimal1; delay_nms(unsigned int i) { unsigned int j; for(;i!=0;i--) { for(j=0;j<61;j++); }

} key_scan(void) { unsigned char a; temp=0xf0; if(temp!=0xf0) { delay_nms(10); { if(temp!=0xf0) switch(temp) { case 0xe0 :key_num= 0; break; case 0xd0 :key_num= 1; break; case 0xb0 :key_num= 2; break; case 0x70 :key_num= 3; break; } temp=0x0f; switch(temp) { case 0x0e :key_num=key_num; break; case 0x0d :key_num= key_num+4; break; case 0x0b :key_num= key_num+8; break; case 0x07 : key_num=key_num+12; break; default :break; } while((a<50)&&( temp!=0x0f)) { delay_nms(1); a++; } temp=0xf0; } } return (key_num); } void write_com(char cod) { E=0; RS=0; RW=0; E=1; delay_nms(1); P2=cod;

利用拨码开关控制液晶显示器进行ASIC字符显示

中北大学 课程设计说明书 学生姓名:甘世伟学号:04 学院: 电子与计算机科学技术学院 专业: 微电子学 题目: 利用拨码开关控制液晶显示器进行ASIC字符显示 指导教师:王红亮职称: 讲师 2010 年 6 月 25 日 目录

表—1:OCMJ2X8(128X32)引脚说明....................- 12 -硬件接口 ..................................................................................................................................................................... - 13 -四、电性能参数 ......................................................................................................................................................... - 13 -1)表—1模块时间参数表.........................- 13 -2)表—2模块主要电气参数表.......................- 14 -用户命令 ..................................................................................................................................................................... - 14 -外型尺寸图(图11) .............................................................................................................................................. - 15 -6.附录:液晶显示器简介 (13) 1、课程设计目的 (1)学习操作数字电路设计实验开发系统,掌握液晶显示器的工作原理及应用。 (2)掌握组合逻辑电路、时序逻辑电路的设计方法。 (3)学习掌握可编程器件设计的全过程。 2、课程设计内容和要求: 、设计内容 用VHDL语言编写程序,利用拔码开头控制液晶显示器进行ASIC字符显示。 、设计要求 (1)学习掌握拔码开头控制模块、液晶显示模块的工作原理及应用; (2)熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;

单片机计算器

#include "reg52.h" #include "math.h" //#include "lcd1602_8.h" #define uint unsigned int #define uchar unsigned char uint temp , num; //键盘扫描数值 uchar keynum1=0,keynum2=0,sign=0,i=0,j=0; //按键计数,符号标示uchar num1[8]={0},num2[8]={0}; //按键存储数组 float ans1=0,ans2=0,ans=0,point=0; //运算数据 bit conflag=0; //继续运算标志位 bit newcalc=0; //新运算标志位 bit ac=0; //清零标志,1为清零 bit beepflag=0; //蜂鸣器标志位 bit sqrtflag1=0; //开方1标志位 bit sqrtflag2=0; //开方2标志位 sbit keybeep=P3^3; //蜂鸣器开关按键 sbit beep=P2^7; //蜂鸣器控制口 sbit keysqrt=P3^4; //开方按键 sbit keypow=P3^5; //任意次方按键 sbit LCDRS=P2^0; sbit LCDRW=P2^1; sbit LCDEN=P2^2; uchar keyscan(); void maininit(void); //附4:LCD1602显示程序 //#include //#include"lcd1602_8.h" //#include //延时1ms程序 void delayms(uint x) //12M延时1ms { unsigned int TempMS=x*110; while(TempMS--); } //写命令 void lcdwrite_com(uchar i) { P0=i; LCDRS=0; LCDRW=0; LCDEN=0;

LCD1602驱动详解

一.接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。刚开始接触它的大多是单片机的初学者。由于对它的不了解,不能随心所欲地对它进行驱动。经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD16 02的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。如图1所示:

图1 再来一张它的背面的,如图2所示:

图2它的16条引脚定义如下:

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。或同样阻值的RM065/RM063蓝白可调电阻。见图3。 图3 4. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电 平时,选择命令;当RS为高电平时,选择数据。 5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态 或数据。如果不需要进行读取操作,可以直接将其接VSS。 6. E,执行命令的使能引脚,接单片机的一个I/O。 7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意 的8个I/O口。如果接P0口,P0口应该接4.7K—10K的上拉电阻。如果是4线并行驱动,只须接4个I/O口。 8. A背光正极,可接一个10—47欧的限流电阻到VDD。 9. K背光负极,接VSS。见图4所示。

led显示屏控制卡-LED显示屏控制器原理

目录 第一章 801型、802型卡功能简介 (1) 第二章硬件参数 (5) 第二章第8代控制系统使用手册 (6) 第三章国标网线制作方法 (25) Index Chapter I Model 801 and 802 functions and features (27) Chapter II Model 801 and 802 manual (30) Chapter III Communication cable making method (49) 深圳三鑫维科技是一家专业生产制造LED显示屏的知名企业,20年的led行业研究经验,如还有不理解的请咨询电话:9

第一章 801型、802型卡功能简介 一、完全兼容第七代 基于第七代升级开发,原功能不少,新功能更多更强大,系统更稳定更可靠。可与七代系统混合使用。 二、支持10位颜色 旧系统的8位颜色只能显示256X256X256=1677216种颜色,新系统颜色数为1024X1024X1024=1073741824种颜色,新系统颜色数是旧系统的64倍。 三、智能连接功能 同一块显示屏的多块接收卡/箱体(含备用的)可以任意交换而不需重新设置,接收卡能智能地动识别需显示的内容。 四、智能监控 每块接收卡均有温度检测和四路风扇监控输出,可根据用户设定的温度上限智能地控制四路风扇转速。 五、公司图标显示 当发送卡电源没开启时显示屏自动显示设定的公司图片,图片像素为128X128,颜色数为16K色。 六、支持16以内的任意扫描方式 原系统只支持1、2、4、8、16扫描,新系统为1、2、3、4、5、6、 7、8、9、10、11、12、13、14、15、16扫描。 七、支持模块宽度为64以内的任意数

LCD1602高手使用详解

LCD1602高手使用详解 前面总算走完了对AVR MEGA16这块单片机的一些基本的应用方式了,这时候大家对AVR的一些内部资源比如定时器,ADC,最主要的IO口的使用方式应该有了一个虽比较粗浅但是却比较形象的认识了。这节我们来看使用单片机的另外一大主题,就是用单片机来实现芯片控制。 在前面的数码管显示一文中,就已经涉及到了用单片机来控制芯片为我们工作,CEPARK AVR开发板,为了达到增强驱动能力和节省IO口的作用,运用了移位寄存器74HC595来驱动两个四位八段数码管,是一个十分有创意的设计。但是前面的内容重心还是集中于对AVR的IO口的控制,所以,我们从这节开始要正式逐渐深入的接触各种芯片了。 先做个引子。单片机是一种微控制器,本身内部集成了数种资源比如CPU、内存、内部和外部总线系统,目前大部分还会具有外存。他的主要任务是利用各种资源实现电平控制,可以以此控制与它相连的下级系统,广泛用于工业自动控制领域。 我们就从这句话出发,首先单片机用来做控制用的,而且是利用的是本身的内部资源。但是,它的功能再强大,资源再丰富也总有一个上限,总有枯竭的一天。所以我们常常利用单片机外接芯片来弥补或者增强单片机的功能来完成我们所需功能的电路。比如程序存储器不足,可以外接外部存储器,比如单片机内部中断级不足,可以外接中断控制器等等。大家可以从这个角度来理解芯片控制的意义罢。 今天我们用AVR单片机来实现对LCD1602液晶显示芯片的控制。 首先从这个名字讲起,LCD:英文全称为Liquid Crystal Display,即为液态晶体显示,也就是我们常说的液晶显示了。(平时老说LCDLCD,可能大家也都不怎么注意过这个全称吧,呵呵,当增加词汇量了)1602则是表示这个液晶一共能显示2行数据,每一行显示16个字符。这个就是LCD1602的全部来由。 液晶显示的使用有多广泛我就不多说了,LCD1602好像10元左右就可以拿到了的,不算贵。我们来看看现在市面都有哪些样子的1602,下面从网上搜罗了几个(我手上的这个是蓝色背光白色字体的):

lcd1602液晶封装函数

//端口定义 #define DBPort P0 //LCD数据端口 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sbit Lcdbf = P0^7; //LCD忙标志Busy Flag void delay(unsigned int t) //延时 { while(t--); } void LCD_Wait(void) //读忙状态 { LcdRs=0; LcdRw=1; LcdEn=1;delay(10);LcdEn=0; //下降沿 while(Lcdbf) { LcdEn=0;LcdEn=1; //仿真才需要此语句,实际硬件中不需要} } void LCD_Write(bit style, unsigned char input) //写数据1/命令0 { LcdRs=style; LcdRw=0; DBPort=input; LcdEn=1;delay(10);LcdEn=0; LCD_Wait(); } void LCD_Initial(void) //初始化LCD { LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵 delay(300); LCD_Write(0,0x0c); //显示模式 LCD_Write(0,0x01); //清屏 LCD_Write(0,0x06); //输入模式 } void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置{ if(y==0) LCD_Write(0,0x80|x);

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

LED显示屏控制系统方案

LED显示屏控制系统的分析与设计 摘要 本文根据LED图文显示屏系统的具体要求,通过查阅资料,分析并归纳出具体设计方案。即系统体系结构、系统整体工作流程、软件控制系统的设计以及串行通信设计。这个系统的工作流程是:通过软件控制系统提供的编辑工具完成图文编辑工作,对编辑的信息实现字模提取,然后可以根据系统提供的显示模式加载显示效果,确认为欲显示信息后保存文件,然后通过程序调用Windows函数,并采用RS-232C串口通信,实现数据到无线发射机的传输。 本文具体设计了三个模块:编辑功能模块,字模提取模块,效果添加及预览模块。系统是否需要更新以及现有设计是否能够满足要求都有待于进一步的研究。 关键词:LED 字模串行通信

目录 1 绪论 1.1 LED显示屏的研究背景及意义 (5) 1.2 软件开发工具C++概述 (6) 2 LED显示屏控制系统的系统分析 2.1 整体分析 (8) 2.2 计算机软件模块分析与设计 (8) 3 串行接口 3.1 串行通信的工作原理 (10) 3.2 RS-232C串行通信简介 (10) 3.3 RS-232C引脚及使用 (11) 3.4 MAX-232介绍 (12) 4 软件控制系统设计与实现 4.1编辑功能设计与实现 (14) 4.2字模提取 (16) 4.3效果添加与预览功能的设计与实现 (18) 4.4控制系统软件设计 (20) 5 总结 26 参考文献 (27)

致 (28) 1 绪论 1.1 LED显示屏的研究背景及意义 在当今现代信息化社会的高速发展过程中,大屏幕显示已经从公共信息展示等商业应用向消费类多媒体应用渗透。随着宽带网络的发展,数字化的多媒体容将在信息世界中占据主流,新型的大屏幕显示设备将代替传统电视机成为人们享受信息和多媒体容的中心。 与传统的显示设备相比,这种未来的巨大需求让大屏幕显示技术成为众人目光的焦点: (1) LED显示屏色彩丰富,显示方式变化多样(图形、文字、三维、二维动画、电视画 面等)、亮度高、寿命长,是信息传播设施划时代的产品。 (2) LED显示屏是集光电子技术、微电子技术、计算机技术、信息处理技术于一体的 高技术产品,可用来显示文字、计算机屏幕同步的图形。它以其超大画面、超强视觉、灵活多变的显示方式等独居一格的优势,是目前国际上使用广泛的显示系统。 (3) LED显示屏应用广泛,金融证券、银行利率、商业广告、文化娱乐等方面,有巨 大的社会效益和丰厚的经济效益。 在其历史的演变过程中,出现了多种信息传播媒体:但就其性能看:如阴级管(crt)或石英管(dv)大型电视,成本非常昂贵,在不需要超大画面且在室使用时效果尚可;彩色液晶显示同样成本昂贵、电路复杂,面积有限,受视频角的影响非常大,可视角度很小;影象投影设备亮度小、清晰度差(画面受光不均匀);电视墙表面有分割线,视觉上有异物感,室外应用时亮度效果差。而LED显示屏以其受空间限制较小,并可以根据用户要求设计屏的大小,具有全彩色效果,视角大,可以用于显示文字、图案、图象、动画、视频、录象信号等各种信息的特点得到了突飞猛进的发展。 LED显示屏的发展主要经历了三个阶段: 1、1990年以前LED显示屏的成长时期。一方面,受LED材料器件的限制,LED显示屏的应用领域没有广泛开展;另一方面,显示屏控制技术基本上是通讯控制方式,客观上影响了显示效果。这一时期的LED显示屏在国外应用较广,国很少,产品以红、绿双基色为主,控制方式为通讯控制,灰度等级为单点4级调灰,成本较高。 2、1990-1995年,这一段是LED显示屏迅速发展的时期。进入九十年代,全球信息产业高速增长,信息技术各个领域不断突破,LED显示屏在LED材料和控制技术方面也不断出现新的成果。蓝色LED晶片研制成功,全彩色LED显示屏进入市场;电子计算机及微电子领域的技术发展,在显示屏控制技术领域出现了视频控制技术,显示屏灰度等级实现16

相关文档
最新文档