单片机显示与按键项目报告 - 图文

更新时间:2024-06-25 04:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

电子信息工程技术专业《外围电路模块设计》 显示与按键

宜宾职业技术学院

《外围电路模块设计》

项目设计报告

项目设计题目:显示与按键模块项目报告 系 部:电子信息与控制工程系 班 级: 电子11201班 指 导 教 师 : 张 一 小 组 成 员: 蒲 东 邓 明 辉 何 培 杉 郭 琴

2013年10月31日

电子信息工程技术专业《外围电路模块设计》 显示与按键

目录

一、引言??????????????????????????????3

二、学习目的????????????????????????????4

三、学习内容????????????????????????????4 1、显示???????????????????????????????4 2、按键???????????????????????????????7

四、基本原理????????????????????????????8

五、软件部分????????????????????????????9

1、编程技巧????????????????????????????10

2、程序流程图???????????????????????????10

六、程序编写???????????????????????????11

1、1602LCD程序编写????????????????????????11

2、12864与按键程序编写??????????????????????14

七、仿真过程综述?????????????????????????25

结????????????????????????????????26

附录

附录1 调试照片

附录2小组成员本次项目成绩

2

电子信息工程技术专业《外围电路模块设计》 显示与按键

一、 引言

在设计各种单片机应用系统中,还需扩展很多外部接口器件才能充分发挥单片机的智能控制功能。如扩展键盘与显示器件接口,可实现人机对话功能;扩展A/D转换接口,可实现对外部各种模拟信号的检测与转换;扩展D/A转换接口可将数字信号转换为模拟信号,从而完成对控制对象的驱动。

在单片机系统设计中,LED显示方式由于具有显示清晰、成本低廉、配置灵活、与单片机接口简单易行的特点,在单片机应用系统中得到了广泛的应用。在采用并行显示方式时,显示电路电路的段码与位控码要占用单片机的较多口线,虽然有些接口芯片可以进行扩展,但口线利用率仍较低,不能满足大型控制系统的要求。所以,采用串行显示方式则只需占用2至3根口线,节约单片机大量的I/O线,且使用效果很好。

键盘是计算机最常用的输入设备,是实现人机对话的纽带。按其结构形式可分为非编码键盘和编码键盘。编码键盘采用硬件方法产生键码。每按下一个键,键盘能自动生成键盘代码,键数较多,且具有去抖动功能。这种键盘使用方便,但硬件较复杂,PC机所用键盘即为编码键盘。非编码键盘仅提供按键开关工作状态,其键码由软件确定,这种键盘键数较少。硬件简单,广泛应用于各种单片机应用系统,本书主要介绍非编码键盘的设计与应用。

3

电子信息工程技术专业《外围电路模块设计》 显示与按键

二、 学习目的

目前,各种类型的单片机在国内外获得了广泛应用,人们对单片机外围电路的设计也提出了更高的要求。近年来,随着微电子技术、系统集成技术和电子技术的飞速发展,一大批新颖、独特、高集成度、高性价比的单片机外围电路器件如雨后春笋般竞相问世,这对于提高单片机测控系统的可靠性、安全性和性价比起到了重要作用。

所以,我们要做一部具备多功能的智能小车。

三、 学习内容

设计并实现4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。即将AT89C52单元与键盘及数码管显示单元连接,编写实验程序扫描键盘输入,并将扫描结果送数码显示,键盘采用4×4键盘,每个数码管值可以为0到F,16个数。将键盘进行编号记作0---F,当按下其中一个按键时将该按键对应的编号在一个数码管上显示出来,当按下下一个按键时便将这个按键的编号在下一个数码管上显示出来,且数码管上可以显示最近几次按下按键的编号。 1、显示

液晶是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示器上。

液晶显示器的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。为了叙述简便,通常把各种液晶显示器都直接叫做液晶。

液晶体积小、功耗低、显示操作简单,但是它有一个致命的弱点,其使用的温度范围很窄,通用型液晶正常工作温度范围为0℃~+55℃,存储温度范围为-20℃~+60℃,即使是宽温级液晶,其正常工作范围也仅为-20℃~+70℃,存储温度范围为-30℃~+80℃,因此在设计相应产品时,务必要考虑周全,选取合适的液晶。

4

电子信息工程技术专业《外围电路模块设计》 显示与按键

⑴ 1602LCD

1602LCD 分为带背光和不带背光两种,带背光的比不带背光的厚,是否带背光在应用中并无差别。 ①1602LCD 主要技术参数:

显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm

②1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表所示: 第 1 脚 第 2 脚 第 3 脚 VSS 为地电源。 VDD接5V正电源。 VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚 R/W 为读/写信号线,高电平时进行读操作,低电平时进行写操作。当 RS和 R/W共同为低电平时可以写入指令或者显示地址,当 RS 为低电平,R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W为低电平时可以写入数据。 E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第 7~14脚 D0~D7为 8 位双向数据线。 第 15脚 第 16脚

第 4 脚 第 6 脚 背光源正极。 背光源负极。 图1 引脚接口表

5

电子信息工程技术专业《外围电路模块设计》 显示与按键

⑵ 12864(128×64的分辨率) ①综述

12864为带中文字库图形点阵液晶显示模块其液晶屏幕为128*64,可显示四行,每行可显示8个汉字。其背光为蓝色,字符为白色。

中文液晶显示模块12864的字型ROM内含8192个16*16点中文字型和128个16*8半宽的字母符号型;另外绘图画面提供一个64*256点的绘图区域GDRAM;而且内含CGRAM提供4组软件可编程的16*16点阵造字功能。 ②电气特性

编号 1 2 3 名称 模块电压(VDD) 模块电流 背光参数 单位 V mA V/mA 参数 5V 2mA 3.1V,75mA 图2 12864电气特征

③引脚定义

管脚号 管脚名称 管脚功能描述 1 2 3 4 VSS VCC V0 RS(CS) 电源地 电源正 LCD亮度调整,外接电阻端 并行:RS=“H”,表示DB0-DB7为数据 RS=“L”,表示DB0-DB7为指令数据 串行:为CS片选信号 CS=“H”允许 CS=“L”禁止 5 R/W(SID) 并行:R/W=”H”,读出数据 R/W=“L”,写入数据 串行:输入串行数据 6 E(SCLK) 并行:使能信号 串行:出入串行脉冲 7

DBO-DB7 三态数据线 6

电子信息工程技术专业《外围电路模块设计》 显示与按键

8 PSB 串并行工作选择端 H:8位或4位并口方式,L:串口方式 通过改接模块背光短路电阻改变PSB引脚电平,默认接高电平。不可在不改接短路电阻的情况下将此引脚直接引线接低电平 9 10 11 12 13 NC RESET VODT A X 空脚 复位端,低电平有效 背光亮度调整,外接电阻端 背光源正端(+5V) 背光源负端 图3 引脚定义表

2、按键

独立键盘与单片机连接时,每一个按键都需要单片机的一个I/O口,若某单片机系统需较多按键,如果用独立按键便会占用过多的I/O口资源。单片机系统中I/O口资源往往比较宝贵,当用到多个按键时,为了节省I/O口线,我们引入矩阵键盘。

我们以4×4矩阵键盘为例讲解其工作原理和检测方法。将16个按键排成4行4列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有4行4列共8根线,我们将8根线连接到单片机的8个I/O口上,通过程序扫描键盘就可检测16个键。用这种方法我们也可以实现3行3列9个键、5行5列25个键、6行6列36个键等。

无论是独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,也就是检测与该按键对应的I/O口是否为低电平。独立按键有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机I/O口相连,因此在检测时需人为通过单片机I/O口送出低电平。检测时,先送一列为低电平,其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行那一列的,用同样的方法轮流送各列一次低电平,再

7

电子信息工程技术专业《外围电路模块设计》 显示与按键

轮流检测一次各行是否变为低电平,这样既可检测完所有按键,当有键被按下时便可判断出按下的键是哪一个键。当然我们也可以将行线置低电平,扫描列是否有低电平。这就是矩阵键盘检测的原理和方法。

四、 基本原理

图4 显示部分原理图

图5 按键原理图

8

电子信息工程技术专业《外围电路模块设计》 显示与按键

图6 显示与按键PCB图

五、 软件部分

1、编程技巧

⑴、在按键扫描中,通过for循环语句实现被按下的按键行值的确定,用switch

语句实现列值。0xEX(X表示任意一个十六进制数)表示4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7则分别表示键盘的第一列、第二列、第三列和第四列。

⑵、uc-Row+ucLine+1即为被按下的按键的行列值。

⑶、用十六个switch语句实现对单片机P0端口和P2端口的I/O数据线的

控制,来控制数码管显示被按下按键的行值和列值。

9

电子信息工程技术专业《外围电路模块设计》 显示与按键

2、程序流程图

开始

初始地址化参数

输入列扫描信号

列扫描信号移位

读入行信号

是 该列有键输入?

6 列扫描完? 否 返回

按照行列计算键值

查表得键码

等待按键释

返回

图7 程序流程图

10

电子信息工程技术专业《外围电路模块设计》 显示与按键

六、程序编程

1、1602LCD程序编写:

/******************************************************************** * 文件名 : 液晶1602显示.c

* 描述 : 该程序实现了对液晶1602的控制

***********************************************************************/ #include

#define uchar unsigned char #define uint unsigned int

//这三个引脚参考资料 sbit E =P2^2; //1602使能引脚 sbit RW=P2^1; //1602读写引脚 sbit RS=P2^0; //1602数据/命令选择引脚

/******************************************************************** * 名称 : delay()

* 功能 : 延时,延时时间大概为140US。

***********************************************************************/ void delay() { int i,j; for(i=0; i<=100; i++); for(j=0; j<=20; j++); }

/******************************************************************** * 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值

***********************************************************************/ void enable(uchar del) { P0 = del; RS = 0; RW = 0; E = 0; delay(); E = 1; delay(); }

/******************************************************************** * 名称 : write(uchar del)

11

电子信息工程技术专业《外围电路模块设计》 显示与按键

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据 * 输出 : 无

***********************************************************************/ void write(uchar del) { P0 = del; RS = 1; RW = 0; E = 0; delay(); E = 1; delay(); }

/******************************************************************** * 名称 : L1602_init() * 功能 : 1602初始化,

***********************************************************************/ void L1602_init(void) { enable(0x01); enable(0x38); //设置16*2显示,5*7点阵,8位数据接口 enable(0x0c); //设置开关显示,不显示光标 enable(0x06); //写一个字符后地址指针自动加1 enable(0xd0); //显示清0,数据指针清0 }

/******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示\,调用该函数如下 L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); //写符号 }

/******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

12

电子信息工程技术专业《外围电路模块设计》 显示与按键

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示\,调用该函数如下 L1602_string(1,5,\* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/ void L1602_string(uchar hang,uchar lie,uchar *p) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { if(*p == '\\0') break; write(*p); p++; } }

/******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无

* 输出 : 显示第一行“2”,第二行“b”

***********************************************************************/ void Main() { uchar i = 48; L1602_init(); L1602_char(1,5,'b'); L1602_string(1,1,\ L1602_string(2,1,\ while(1); }

最后的显示结果图如下:

13

电子信息工程技术专业《外围电路模块设计》 显示与按键

图8 1602LCD显示结果

2、12864与按键程序编写:

#include #include

sbit lcd_sclk=P3^2; /*接口定义:lcd_sclk 就是 LCD 的 sclk*/ sbit lcd_sid=P3^1; /*接口定义:lcd_sid 就是 LCD 的 sid*/ sbit lcd_rs=P3^0; /*接口定义:lcd_rs 就是 LCD 的 rs*/ sbit lcd_reset=P1^0; /*接口定义:lcd_reset 就是 LCD 的 reset*/ sbit lcd_cs1=P1^1; /*接口定义:lcd_cs1 就是 LCD 的 cs1*/

sbit Rom_IN=P1^2; /*字库 IC 接口定义:Rom_IN 就是字库 IC 的 SI*/ sbit Rom_OUT=P1^3; /*字库 IC 接口定义:Rom_OUT 就是字库 IC 的 SO*/ sbit Rom_SCK=P1^4; /*字库 IC 接口定义:Rom_SCK 就是字库 IC 的 SCK*/ sbit Rom_CS=P1^5; /*字库 IC 接口定义 Rom_CS 就是字库 IC 的 CS#*/ #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar code bmp1[]; uchar code bmp2[];

void transfer_command_lcd(int data1) {

char i; lcd_rs=0;

for(i=0;i<8;i++) {

lcd_sclk=0;

if(data1&0x80) lcd_sid=1; else lcd_sid=0;

14

电子信息工程技术专业《外围电路模块设计》 显示与按键

lcd_sclk=1;

data1=data1<<=1; } }

/*写数据到LCD 模块*/

void transfer_data_lcd(int data1) {

char i; lcd_rs=1;

for(i=0;i<8;i++) {

lcd_sclk=0;

if(data1&0x80) lcd_sid=1; else lcd_sid=0; lcd_sclk=1;

data1=data1<<=1; } }

/*延时*/

void delay(int n_ms) {

int j,k;

for(j=0;j

unsigned char Key_Scan(void)//键盘扫描函数如果有键按下返回键ASC 值若无返回 0 {

P2=0XF0;

if(P2!=0XF0)//先确定是否有键按下 {

//--------------1------------------------------------ P2=0XFE;

switch (P2)//测P1^0~~~P1^3 有没有低的 {

case 0xee: return '0';//P1^3 低返回'0' case 0xde: return '1';//P1^2 低返回'1' case 0xbe: return '2';//P1^1 低返回'2' case 0x7e: return '3';//P1^0 低返回'3'

default: break;//没有本行的键按下继续下面扫描 }

//---------------------------------------------------- //-------------2-------------------------------------- P2=0XFD;

switch (P2)//测P1^0~~~P1^3 有没有低的

15

电子信息工程技术专业《外围电路模块设计》 显示与按键

{

case 0xed: return '4';//P1^3 低返回'4' case 0xdd: return '5';//P1^2 低返回'5' case 0xbd: return '6';//P1^1 低返回'6' case 0x7d: return '7';//P1^0 低返回'7'

default: break;//没有本行的键按下继续下面扫描 }

//---------------------------------------------------- //-------------3-------------------------------------- P2=0XFB;

switch (P2)//测P1^0~~~P1^3 有没有低的 {

case 0xeb: return '8';//P1^3 低返回'8' case 0xdb: return '9';//P1^2 低返回'9' case 0xbb: return 'A';//P1^1 低返回'A' case 0x7b: return 'B';//P1^0 低返回'B'

default: break;//没有本行的键按下继续下面扫描 }

//---------------------------------------------------- //-------------4-------------------------------------- P2=0XF7;

switch (P2)//测P1^0~~~P1^3 有没有低的 {

case 0xe7: return 'C';//P1^3 低返回'C' case 0xd7: return 'D';//P1^2 低返回'D' case 0xb7: return 'E';//P1^1 低返回'E' case 0x77: return 'F';//P1^0 低返回'F' default: break;//没有键按下继续下面 } }

return 0; }

/*LCD 模块初始化*/ void initial_lcd() {

lcd_cs1=0; Rom_CS = 1;

lcd_reset=0; /*低电平复位*/ delay(20);

lcd_reset=1; /*复位完毕*/ delay(20);

transfer_command_lcd(0xe2); /*软复位*/ delay(5);

transfer_command_lcd(0x2c); /*升压步聚 1*/

16

电子信息工程技术专业《外围电路模块设计》 显示与按键

delay(5);

transfer_command_lcd(0x2e); /*升压步聚 2*/ delay(5);

transfer_command_lcd(0x2f); /*升压步聚 3*/ delay(5);

transfer_command_lcd(0x23); /*粗调对比度,可设置范围 0x20~0x27*/ transfer_command_lcd(0x81); /*微调对比度*/

transfer_command_lcd(0x1f); /*0x28,微调对比度的值,可设置范围 0x00~0x3f*/ transfer_command_lcd(0xa2); /*1/9 偏压比(bias)*/ transfer_command_lcd(0xc8); /*行扫描顺序:从上到下*/ transfer_command_lcd(0xa0); /*列扫描顺序:从左到右*/ transfer_command_lcd(0x40); /*起始行:第一行开始*/ transfer_command_lcd(0xaf); /*开显示*/ lcd_cs1=1; }

void lcd_address(uint page,uint column) {

column=column-0x01;

transfer_command_lcd(0xb0+page-1); /*设置页地址*/

transfer_command_lcd(0x10+(column>>4&0x0f)); /*设置列地址的高4 位*/ transfer_command_lcd(column&0x0f); /*设置列地址的低4 位*/ }

/*全屏清屏*/

void clear_screen() {

uchar i,j; lcd_cs1=0; Rom_CS = 1; for(i=0;i<9;i++) {

transfer_command_lcd(0xb0+i); transfer_command_lcd(0x10); transfer_command_lcd(0x00); for(j=0;j<132;j++) {

transfer_data_lcd(0x00); } }

lcd_cs1=1; }

/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/

17

电子信息工程技术专业《外围电路模块设计》 显示与按键

void display_graphic_16x16(uint page,uint column,uchar *dp) {

uint i,j; lcd_cs1=0; Rom_CS = 1; for(j=0;j<2;j++) {

lcd_address(page+j,column); for (i=0;i<16;i++) {

transfer_data_lcd(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/ dp++; } }

lcd_cs1=1; }

/*显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标*/ void display_graphic_8x16(uint page,uchar column,uchar *dp) {

uint i,j; lcd_cs1=0;

for(j=0;j<2;j++) {

lcd_address(page+j,column); for (i=0;i<8;i++) {

transfer_data_lcd(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/ dp++; } }

lcd_cs1=1; }

/*显示 5*7 点阵图像、ASCII, 或 5x7 点阵的自造字符、其他图标*/ void display_graphic_5x7(uint page,uchar column,uchar *dp) {

uint col_cnt;

uchar page_address;

uchar column_address_L,column_address_H; page_address = 0xb0+page-1; lcd_cs1=0;

column_address_L =(column&0x0f)-1;

column_address_H =((column>>4)&0x0f)+0x10;

transfer_command_lcd(page_address); /*Set Page Address*/

transfer_command_lcd(column_address_H); /*Set MSB of column Address*/

18

电子信息工程技术专业《外围电路模块设计》 显示与按键

transfer_command_lcd(column_address_L); /*Set LSB of column Address*/ for (col_cnt=0;col_cnt<6;col_cnt++) {

transfer_data_lcd(*dp); dp++; }

lcd_cs1=1; }

/****送指令到晶联讯字库 IC***/

void send_command_to_ROM( uchar datu ) {

uchar i;

for(i=0;i<8;i++ ) {

if(datu&0x80) Rom_IN = 1; else

Rom_IN = 0; datu = datu<<1; Rom_SCK=0; Rom_SCK=1; } }

/****从晶联讯字库 IC 中取汉字或字符数据(1 个字节)***/ static uchar get_data_from_ROM( ) {

uchar i;

uchar ret_data=0; Rom_SCK=1; for(i=0;i<8;i++) {

Rom_OUT=1; Rom_SCK=0;

ret_data=ret_data<<1; if( Rom_OUT )

ret_data=ret_data+1; else

ret_data=ret_data+0; Rom_SCK=1; }

return(ret_data); }

/*从相关地址(addrHigh:地址高字节,addrMid:地址中字节,addrLow:地址低字节)中连续读出 DataLen 个字节的数据到 pBuff 的地

19

电子信息工程技术专业《外围电路模块设计》 显示与按键

址*/

/*连续读取*/

void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen ) {

uchar i;

Rom_CS = 0; lcd_cs1=1; Rom_SCK=0;

send_command_to_ROM(0x03); send_command_to_ROM(addrHigh); send_command_to_ROM(addrMid); send_command_to_ROM(addrLow); for(i = 0; i < DataLen; i++ )

*(pBuff+i) =get_data_from_ROM(); Rom_CS = 1; }

/******************************************************************/ ulong fontaddr=0;

void display_GB2312_string(uchar y,uchar x,uchar *text) {

uchar i= 0;

uchar addrHigh,addrMid,addrLow ; uchar fontbuf[32]; while((text[i]>0x00)) {

if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1)) {

/*国标简体(GB2312)汉字在晶联讯字库 IC 中的地址由以下公式来计算:*/ /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/ /*由于担心 8 位单片机有乘法溢出问题,所以分三部取地址*/ fontaddr = (text[i]- 0xb0)*94; fontaddr += (text[i+1]-0xa1)+846; fontaddr = (ulong)(fontaddr*32);

addrHigh = (fontaddr&0xff0000)>>16; /*地址的高 8 位,共 24 位*/ addrMid = (fontaddr&0xff00)>>8; /*地址的中 8 位,共 24 位*/ addrLow = fontaddr&0xff; /*地址的低 8 位,共 24 位*/

get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取 32 个字节的数据,存到\

display_graphic_16x16(y,x,fontbuf);/*显示汉字到 LCD 上,y 为页地址,x 为列地址,fontbuf[]为数据*/ i+=2; x+=16; }

20

电子信息工程技术专业《外围电路模块设计》 显示与按键

else if((text[i]>=0x20) &&(text[i]<=0x7e)) {

unsigned char fontbuf[16]; fontaddr = (text[i]- 0x20);

fontaddr = (unsigned long)(fontaddr*16);

fontaddr = (unsigned long)(fontaddr+0x3cf80); addrHigh = (fontaddr&0xff0000)>>16; addrMid = (fontaddr&0xff00)>>8; addrLow = fontaddr&0xff;

get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*取 16 个字节的数据,存到\

display_graphic_8x16(y,x,fontbuf); /*显示 8x16 的 ASCII 字到 LCD 上,y 为页地址,x 为列地址,fontbuf[]为数据*/ i+=1; x+=8; } else i++; } }

void display_string_5x7(uchar y,uchar x,uchar *text) {

unsigned char i= 0;

unsigned char addrHigh,addrMid,addrLow ; while((text[i]>0x00)) {

if((text[i]>=0x20) &&(text[i]<=0x7e)) {

unsigned char fontbuf[8]; fontaddr = (text[i]- 0x20);

fontaddr = (unsigned long)(fontaddr*8);

fontaddr = (unsigned long)(fontaddr+0x3bfc0); addrHigh = (fontaddr&0xff0000)>>16; addrMid = (fontaddr&0xff00)>>8; addrLow = fontaddr&0xff;

get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);/*取 8 个字节的数据,存到\

display_graphic_5x7(y,x,fontbuf);/*显示 5x7 的 ASCII 字到 LCD 上,y 为页地址,x 为列地址,fontbuf[]为数据*/ i+=1; x+=6; } else i++;

21

电子信息工程技术专业《外围电路模块设计》 显示与按键

} }

//===============main program=================== void main(void) {

uchar a;

Rom_CS=1; lcd_cs1=0; initial_lcd(); clear_screen(); //clear al

display_GB2312_string(1,1,\ 好好学习 \在第 1 页,第 1 列,显示一串 16x16 点阵汉字或 8x16 的 ASCII 字*/

display_GB2312_string(3,1,\ 天天向上 \/*显示一串 16x16 点阵汉字或 8x16 的 ASCII 字.以下雷同*/

display_GB2312_string(5,1,\ 第3组成员 \ display_GB2312_string(7,1,\何培杉.郭琴.小灰\ delay(1100); clear_screen(); while(1) {

a=Key_Scan(); if(a!=0) { clear_screen(); if(a=='0') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\}

if(a=='1') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\ }

if(a=='2') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\

22

电子信息工程技术专业《外围电路模块设计》 显示与按键

}

if(a=='3') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\}

if(a=='4') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\ if(a=='5') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\ if(a=='6') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\ if(a=='7') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\ if(a=='8') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\ if(a=='9') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(5,1,\display_GB2312_string(7,1,\

23

电子信息工程技术专业《外围电路模块设计》 显示与按键

}

if(a=='A') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(3,1,\display_GB2312_string(7,1,\}

if(a=='B') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(3,1,\display_GB2312_string(7,1,\}

if(a=='C') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(3,1,\display_GB2312_string(7,1,\}

if(a=='D') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(3,1,\display_GB2312_string(7,1,\}

if(a=='E') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(3,1,\display_GB2312_string(7,1,\}

if(a=='F') {

display_GB2312_string(1,1,\display_GB2312_string(3,1,\display_GB2312_string(3,1,\display_GB2312_string(7,1,\} }

24

电子信息工程技术专业《外围电路模块设计》 显示与按键

} }

12864LCD结果显示图如下:

图9 12864与按键显示结果

七、仿真过程综述

1、按照设计思路在proteus软件中找到相元器件,按照正确的连线方法将各个元器件连起来。再用proteus软件仿真时,为避免连线的复杂性,可以使用在要连线的引脚上标注相同的符号的方法。这样可以使proteus软件窗口中的连线少一些,使电路图更加清晰。

2、按照硬件电路在keil c软件中编写程序,对编写的程序进行翻译,在确定没有错误后生成十六进制文件加载到proteus软件中原理图AT89S52芯片中。

3、在proteus软件中点击运行按钮,实现仿真,按下键盘上的按键,观察数码管显示的是否正确。

25

电子信息工程技术专业《外围电路模块设计》 显示与按键

总结

通过这次项目的设计,我们小组基本上完成了题目中所给出的要求,设计除了4×4键盘的接口,并且在两个数码管上能够显示键盘所在的行值与列值。同时深刻体会到理论与实践相结合的重要性。

首先我们小组要想出合适的方案,当原理图完成后,我们小组还要一起工作来完成PCB的设计。然后将老师给我们准备的物料,完成板的贴装。在烧录程序和调试的过程中我们小组还要配合测试的那个组员一起解决测试中发现的问题,等到产品完成,如果出现问题,还需要做到及时检查和修改。所以我们小组锻炼出了良好的沟通能力,面对压力的调节能力,同一时间处理多个事务的协调和决断能力和良好平和的心态等等。

更重要的是,使我们明白了无论是设计硬件电路还是编写相应的软件程序,我们应该时刻都要仔细认真。因为在这个过程中,哪怕是出现一个小小的错误,都会导致不能仿真出正确的结果甚至根本不会出结果。

课程设计的过程是一个不断学习的过程,我们需要充分利用好网络资源和身边的资料来解决我们在设计过程中遇到的问题,只有将遇到的问题解决好,才能真正的学到一些知识。才能使我们学到的东西从感性认识升华到理性知识。

26

电子信息工程技术专业《外围电路模块设计》 显示与按键

附录1 调试照片

27

电子信息工程技术专业《外围电路模块设计》 显示与按键

附录2 小组成员本次项目成绩

姓名 蒲东 邓明辉 何培杉 郭琴

学号 201219019 201213333 201217515 201218820 成绩 28

本文来源:https://www.bwwdw.com/article/ojx3.html

Top