AT89s52LCD12864多页菜单按键选择操作
06 12864LCD显示计算器键盘按键实验

目录1 课程设计概述和要求 (1)1.1 课程设计要求与任务 (2)1.2 课程设计思路 (2)1.3 课程设计需要配置的环境 (3)2 系统设计 (3)2.1 设计框图 (3)2.2 元件解析 (3)2.2.1 LCD12864芯片……………………………………………………………42.2.2 AT89C51芯片 (5)2.2.3 其他部件 (6)2.2.4 电路分析 (7)3 软件设计 (12)3.1 程序流程图 (12)3.2 程序代码 (12)4 系统的仿真与调试 (13)4.1 硬件调试 (13)4.2 软件调试 (14)4.3 软硬件调试 (14)5 总结 (14)附录1:程序代码附录2:12864LCD显示计算器键盘按键实验Proteus仿真图1 课程设计概述和要求1.1 课程设计任务与要求设计任务:利用AT89C51单片机结合12864LCD显示器设计计算器键盘按键。
设计要求1:本设计实现一个12864LCD显示12864LCD显示器设计计算器键盘按键2.利用AT89C51控制整个电路来实现. 显示12864LCD显示器设计计算器键盘按键,系统主要包括硬件和软件两部分。
重点就是各部分硬件的连接设计以及程序的编写。
本章讲述的就是系统硬件的设计,其中包括各模块的器件选择和电路设计。
将计算器按键上的信息传送至AT89C51主芯片之中,利用P2端口使之显示于12864LCD液晶显示屏上。
1.2 课程设计目的思路1、先把与题目有关的芯片资料找到,熟悉一下芯片资料2、把此程序的电路图看懂,了解一下它的实现原理,以及实现的功能。
3、分析一下此程序的各部分的功能,各零件的工作原理。
4、对程序进行调试,分析调试结果,观察并得出结论。
1.3 课程设计需要配置的环境1、一台主机,一台显示器2、Keil uVision3/Keil uVision4 应用程序软件3、ISIS 7 Professional 仿真软件4、老师交给的仿真电路图,及案例5、纸张,以及一些参考资料2 系统设计2.1.设计框图框图设计是为了能够从整体上把握系统的各个大的模块以及各个模块之间的联系。
宠物定时喂食器设计论文

方案三:若采用LCD液晶显示器显示,LCD液晶显示不但耗能少,而且能够显示年、月、日和星期等汉字,在显示方面变得更加灵活,当需要改变显示时,只要改变软件设计就可以,不用改变硬件电路的设计,电路的功能很容易扩展,另外,这种设计硬件也很简洁。当显示位数很少时采用LCD液晶显示的方案,价格显得昂贵。
专业班级:应电0811
学生姓名:岳阿娜
指导教师:丁学文副教授
系 别:电子工程学院
2013年06月
摘要
本文设计的是宠物定时喂食器,即先将宠物饲料放入其中,通过设定喂食时间点,当到达这一时间点后,系统发出喂食信号吸引宠物,自动进行喂食。本设计主要研究如何设定时间点并发出喂食信号。宠物自动喂食器主要包括单片机AT89S52、电源电路、电机控阀门、按键电路、显示模块、照明灯、DS1302电路模块、DS18B20温度测试模块和蜂鸣器模块。其中单片机为核心单元,对各个模块的工作进行控制。喂食器的喂食过程是,通过键盘设定倒计时间,当依次到达设定时间时,单片机驱动发光二极管发光,蜂鸣器发出响声,吸引宠物过来进食并自动投放食物。设计中加入的万年历和温度传感器,方便记录宠物的生长周期。倒计时和日期等信息通过LCD12864液晶显示。本设计解决了工作日或节假日由于主人不在不能对宠物喂食和宠物饮食不规律的问题,系统操作简单,电路运行稳定,具有一定的推广价值。
2系统方案设计
2.1总体设计方案构思
设计一个宠物自动喂食器要想实现自动控制、正常显示时间、温度测试和闹钟提示的功能,就要细分到各个模块去实现。首先要具备一个主控系统控制整个电路正常工作,可以由通过单片机担任这样的任务,还要有显示时间的模块电路,闹钟的设置可以通过按键随意更改,电机控制门阀自动投放食物。电源电路的模块给整个电路供电,喂食过程中伴随照明灯的点亮。
计算器说明书

1 设计课题任务、功能要求说明及总体方案介绍1.1 设计课题任务课题:简易计算器任务:设计一个具有特定功能的计算器。
该计算器上电或按键复位后能自动显示系统提示界面,进入准备工作状态。
能实现基本的加、减、乘、除四则运算。
1.2 功能要求说明在本次工程实践中,主要完成如下方面的设计任务:(1)计算器上电或按键复位后能显示初始化界面(2)2秒后进入计算器界面(3)按键能进行加、减、乘、除运算并显示结果(4)按清零键后能进行下一次计算1.3 设计课题总体方案介绍及工作原理说明计算器的总体功能原理是以AT89S52单片机为主要控制核心,通过外接4*4行列式键盘作为控制信号输入源,一块12864液晶作为显示器件,通过按键控制,单片机实时地去执行,在12864液晶上显示界面。
系统控制原理图如图1所示。
液晶显示电路AT89S52电源电路复位电路下载电路键盘电路图1系统控制原理图2 设计课题硬件系统的设计2.1 设计课题硬件系统各模块功能简要介绍2.1.1 AT89S52控制模块考虑到设计功能需要,控制器的功能用于外部键盘信号的接收和识别、液晶模块的显示控制、复位电路等,我们选择了AT89S52系列单片机,具有反应速度极快,工作效率特高的特点。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
12864液晶按键菜单程序

write_dat(dis3[i]);
}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
}
if(count1==2) //按下选择按钮2次
uchar code dis1_[] = {"系统初始化. "};
uchar code dis2_[] = {"系统初始化.. "};
uchar code dis3_[] = {"系统初始化.. "};
uchar code dis4_[] = {"按选择键开始! "};
uchar code dis1_6[] = {" 摄像头 "};
uchar code dis2_6[] = {" "};
uchar code dis3_6[] = {" "};
uchar code dis4_6[] = {"保存拍照——返回 "};
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis3_[i]);
}
delay_1ms(500);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis4_[i]);
}
write_cmd(0x30); //基本指令操作
delay_1ms(2);
write_cmd(0x0C); //显示开,关光标
任务八 LCD12864液晶显示

• (7) Z地址计数器
• Z地址计数器是一个6位计数器,此计数器具备循环记数功能, 它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动 加1,指向下一行扫描数据,RST复位后Z地址计数器为0。Z地址 计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起 始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕 的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
00 1 0 1 1 1
页号(0~7)
功能:显示RAM共64行,分8页,每页8行。从DB3到 DB7的值可 以看出,用指令“0xb8+add”表示,该指令设置后面续写得页地址, LCD12864一个字节数据对应纵向8个点,因此页号(add)为0~7。
④ 列地址(Y Address)设置指令
R/W RS 00
表8-3 RAM地址映像表
⑤ 读状态指令
R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 BUSY 0 ON/OFF REST 0 0
00
功能:该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
BUSY:1-内部在工作0-正常状态 ON/OFF:1-显示关闭0-显示打开 RESET:1-复位状态0-正常状态 在BUSY和RESET状态时,除读状态指令外,其它指令均不对液晶显 示模块产生作用。在对液晶显示模块操作之前要查询BUSY状态,以确定是 否可以对液晶显示模块进行操作。
0
0
0
0
DB5 DB4 DB3 DB2 DB1 DB0
1
1
1
1
1 1/0
功能:当DB0=1时,LCD显示RAM中的内容,即指令0X3F,开显示;DB0=0 时, 关闭显示[不影响显示RAM(DD RAM)中的内容],即指令‘‘0x3E”。
汽车多功能语音监控系统设计

汽车多功能语音监控系统设计摘要:基于单片机(AT89S52)和语音芯片(ISD4004)研发了一套汽车多功能语音监控系统。
利用速度、温度、压力以及气敏(酒精)等检测传感器,实时采集汽车的各项参数,处理后输入单片机中,与正常参数进行比较,并通过语音输出比较结果,提示驾驶员做出正确的操作,提高驾驶安全性。
实际测试表明,该语音监控系统可对运行中的汽车各项参数进行实时采集,采集精度较高,并可输出高质量的语音提醒,对安全行车有一定的实际价值。
关键词:单片机;传感器;语音监控1 引言随着时代的飞速发展,人们的生活节奏越来越快,汽车已经成为人类最普遍的交通工具。
由于目前驾照考核制度的缺陷以及驾驶员本身素质的欠缺,大部分驾驶员不懂得行车过程中汽车各参数的意义以及参数变化后应采取何种措施,并且有些驾驶员甚至酒后驾车,这些都增加了行车的危险系数,使交通事故频频发生。
因此,如何提高汽车的行车安全性,特别是将安全行车因素实时地直观地呈现给驾驶员,将成为未来汽车的研究重点和发展方向。
2 系统总体方案系统要求驾驶员在启动汽车前先进行酒精测试,低于交通法规定的酒精浓度时,驾驶员才能启动汽车,否则无法启动汽车。
启动后,首先进入初始化设置(初次使用时,所有参数都是根据正常情况下安全行使时的数据进行设置,如无特殊要求可以跳过设置,也可根据特殊要求进行手动设置),汽车在运行中,各类传感器进行实时数据采集和处理,通过与设置值进行比较,输出比较结果,经过语音芯片把信号传输给扬声器发出语音提示。
为了方便驾驶员操作,系统采用矩阵键盘输入和LCD12864液晶屏显示,使系统的使用更加简单和人性化。
语音芯片(ISD4004)采用CMOS技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存储阵列,同时片内信息存于闪烁存储器中,可在断电情况下保存100年以上(典型值),反复录音10万次以上,因此,驾驶员还可以自己录制提示语音或选择通用普通话语音,也可设置每个部件选择不同的报警提示,可以让驾驶员快速了解提示报警的问题所在。
LCD显示矩阵键盘输入的任意两位数

#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineNOP_nop_();
sbitLCD_CS=P1^0;//片选,高电平有效(RS)
sbitLCD_SID=P1^1;//串行数据输入端(R/W)
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
i_dat=cmd_dat;
i_dat<<=4;
for(i=0;i<8;i++)
{
LCD_SID=(bit)(i_dat&0x80);
LCD_SCLK=0;
while(1)
{
key_dispos();
}
}
voiddisplay()
{
uinti;
send_cmd(0x80);//第一行显示
i=0;
while(dis1[i]!='\0')
{
send_dat(dis1[i]);
i++;
}
send_cmd(0x90);//第二行显示数据
send_dat(dis2[dis_buf[1]]);
{
if(!(P2&k))//如果有键按下
return(row*4+col);//返回按键位置
k<<=1;
LCD12864 多级菜单

首先定义一个菜单结构typedef struct menu//定义一个菜单{u8 range_from,range_to; //当前显示的项开始及结束序号 u8 itemCount;//项目总数u8 selected;//当前选择项u8 *menuItems[17];//菜单项目struct menu **subMenus;//子菜单struct menu *parent;//上级菜单,如果是顶级则为null void (**func)();//选择相应项按确定键后执行的函数}Menu;Menu MainMenu = { //定义主菜单0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项 {"设置1 \x10","设置2 \x10","输入指令发送","查询\x10"}};Menu searchMenu = {//查询菜单0,3,6,0,{"记帐记录明细","未采集记录数","设备机号","本机IP地址","记录空间大小","软件版本"}};Menu *currentMenu;//当前的菜单用于显示菜单项void display(u8 line) //显示菜单项并设置选中的项反白{int i;line = 3-(currentMenu->range_to-line);Lcd_Fill(0x00);for(i = 0;i<4;i++){Lcd_Disp(i+1,0,currentMenu->menuItems[i+currentMenu->range_from]);}highlight(0,line,8,255);//反白显示指定行}void func(void){printf("hello\r\n");}初始化菜单:void initMenu(){MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);MainMenu.subMenus[0] = NULL;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数MainMenu.subMenus[1] = NULL;MainMenu.subMenus[2] = NULL;MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单MainMenu.func = malloc(sizeof(&func)*4);MainMenu.func[0] = NULL;MainMenu.func[1] = NULL;MainMenu.func[2] = &func;//当选择了并按了确定,会执行func函数MainMenu.func[3] = NULL;MainMenu.parent = NULL;//表示是顶级菜单searchMenu.subMenus = malloc(sizeof(&searchMenu)*6);searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL;searchMenu.func = malloc(sizeof(&printf)*6);searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL;searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项currentMenu = &MainMenu;}mainint main(void){delay_init();uart_init(9600);Lcd_Init();KEY_Init();initMenu();display(currentMenu->selected);while(1){key = KEY_Scan();if(key == 0){delay_ms(10);continue;}printf("key %d is press\r\n",key);switch(key){case 12://向上if(currentMenu->selected == 0)//到了第一项break;else{currentMenu->selected--;if(currentMenu->selected < currentMenu->range_from)//更新显示的区域 {currentMenu->range_from = currentMenu->selected;currentMenu->range_to = currentMenu->range_from+3;}display(currentMenu->selected);break;}case 8://向下if(currentMenu->selected == currentMenu->itemCount-1)break;else{currentMenu->selected++;if(currentMenu->selected>currentMenu->range_to){currentMenu->range_to = currentMenu->selected;currentMenu->range_from = currentMenu->range_to-3;}display(currentMenu->selected);break;}case 4://Enter键{if(currentMenu->subMenus[currentMenu->selected] !=NULL){currentMenu = currentMenu->subMenus[currentMenu->selected]; display(0);}else{if(currentMenu->func[currentMenu->selected] != NULL){currentMenu->func[currentMenu->selected]();//执行相应的函数 display(currentMenu->selected);//返回后恢复原来的菜单状态}}break;}case 3://返回键{if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单{currentMenu = currentMenu->parent;display(currentMenu->selected);}break;}default:break;}delay_ms(10);}}void Lcd_Disp(unsigned char x,unsigned char y,unsigned char *s) {Lcd_Write_Cmd(0x30); //进入标准模式LCD_Set_XY(x,y);while (*s){Lcd_Write_Data(*s);s++;}Lcd_Write_Cmd(0x36); //返回图形模式}void highlight(uchar x,uchar y,uchar width,u8 mode) //反白,X值为0-7,Y值为0-3,width为行反白格数{uchar i,j,flag=0x00;if(y>1){flag=0x08;y=y-2;}Lcd_Write_Cmd(0x34); //写数据时,关闭图形显示,且打开扩展指令集for(i=0;i<16;i++){Lcd_Write_Cmd(0x80+(y<<4)+i);Lcd_Write_Cmd(0x80+flag+x);for(j=0;j<width;j++){Lcd_Write_Data(mode);Lcd_Write_Data(mode);}}Lcd_Write_Cmd(0x36); //写完数据,开图形显示}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ RS=0; //写命令 RW=1; //读状态 E=1; DataPort=0xff; while((DataPort&0x80)==0x80);//忙则等待 E=0;
用户自定义字符 ***********************************************/ void CGRAM() {
int i; Write_Cmd(0x30); Write_Cmd(0ite_Data(*s); s++; DelayUs2x(50); } } /***********************************************
液晶屏初始化 ***********************************************/ void Init_ST7920() {
DelayMs(40); //大于 40MS 的延时程序 PSB=1; //设置为 8BIT 并口工作模式 DelayMs(1); //延时
Write_Cmd(0x30); //选择基本指令集 DelayUs2x(50); //延时大于 100us Write_Cmd(0x30); //选择 8bit 数据流 DelayUs2x(20); //延时大于 37us Write_Cmd(0x0c); //开显示(无游标、不反白) DelayUs2x(50); //延时大于 100us Write_Cmd(0x01); //清除显示,并且设定地址指 针为 00H DelayMs(15); //延时大于 10ms Write_Cmd(0x06); //指定在资料的读取及写入时, 设定游标的移动方向及指定显示的移位,光标从右向左 加 1 位移动 DelayUs2x(50); //延时大于 100us } /***********************************************
{" 1.设置 1"}, {" 2.设置 2"}, {" 3.设置 3"}, {" 4.设置 4"}, {" 5.设置 5"}, {" 6.设置 6"}, {" 7.设置 7"}, {" 8.设置 8"}, {" 9.设置 9"},
{" 0.设置 0"}, }; /***********************************************
清屏 ***********************************************/ void ClrScreen() {
Write_Cmd(0x01); DelayMs(15); }
/*********************************************** 调用显示更新
/*********************************************** 写入数据
***********************************************/ void Write_Data(unsigned char Data) {
Check_Busy(); RS=1; //写数据 RW=0; //write E=1; DataPort=Data; DelayUs2x(5); E=0; DelayUs2x(5); } /***********************************************
{ curr--; } } } } } }
这篇程序还是没有涉及到变量,需要再去另外找一篇有 涉及变量的程序。
***********************************************/ void DisplayUpdata(void) {
unsigned char num;
ClrScreen(); num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判断 数组中数值个数 if((0+(curr/4)*4)0)
#include #include sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; sbit PSB= P2^1; //串并口选择端 并高串低
#define DataPort P0 sbit KEY_ADD=P3^3; //按键 sbit KEY_DEC=P3^4; unsigned char curr,currold;//全局变量,当前箭头位 置 unsigned char code user16x16[]={ //箭头图片 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00 ,0x3E,0x00,0x3F,0x00,0x3F,0x80, 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00 ,0x38,0x00,0x30,0x00,0x20,0x00, }; unsigned char code *MainMenu[]= {
AT89s52-LCD12864 多页菜单按键选择操 作
这篇程序的代码还未理解清楚,再一次深刻发现自 己的算法水平不行。今天学到的东西还行,就是那些 C 文件的一些知识。反正都是些优化的东西,以后肯定也 用的着,过几天有兴趣的话,再去学习一下 AVR 单片机。
程序代码:硬件上与前面一样,有点变化就是多了 两个翻页的按键。到现在一整天的饭都还没吃,该去吃 了,干这个果然不会困。
延时函数 ***********************************************/ void DelayUs2x(unsigned char t) {
while(--t); } void DelayMs(unsigned char t) {
while(t--) {
DelayUs2x(245); DelayUs2x(245); } } /***********************************************
} /***********************************************
写入命令 ***********************************************/ void Write_Cmd(unsigned char Cmd) {
Check_Busy(); RS=0; //写命令 RW=0; //write E=1; DataPort=Cmd; DelayUs2x(5); E=0; DelayUs2x(5); }