根据C51单片机的键盘及LCD显示
基于AT89C51单片机键盘控制和LCD显示

}
else if(num==11) //如果按下的是'-'
{
flag=1;
fuhao=2; //2表示减号已按
}
i=table[num];
write_dat(0x30+i);
}
P3=0xfe;
if(P3!=0xfe)
{
delay(5);
if(P3!=0xfe)
{
temp=P3&0xf0;
switch(temp)
系统硬件设计框图如图1
图1
2AT89S52是一种带4kB闪烁可编程课擦除只读存储器的低电压、高性能CMOS型8位微处理器,俗称单片机。它是一个低功耗、高性能的8位CMOS微控制器。由片内可反复
擦拭的FLASH只读程序存储器(ROM)、片外程序存储器内部硬件资源,P0P3 4×8 32位输入\输出总线(I\O)接口,其中P1、P3作为普通的接口,并有第二功能。P0可作为地址数据总线用于外接电路的扩展端口。其引脚如图2
判断被按下键的位置:
依次将所有的行线Y4~Y7置为低电平,在判断4根列线的电平状态,当遇到某一列的电平
键盘扫描流程图
为低时表示此键按下。
5LCD1602液晶显示屏
液晶显示器具有显示质量高、发光恒定、不会刷新亮点和闪烁、体积小、电流小、字迹清晰以及功耗低的特点。本实验才用了16×2个字符,5×7点阵,8位数据接口的液晶显示。
break;
case 0x70:num=7;
break;
}
}
while(P3!=0xfb);
if(num==4||num==5||num==6&&num!=7) //如果按下的是'4','5'或'6'
C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)

switch(SBUF)//根据收到的数据决定模式
{ case 'A':LED1=~LED1,LED2=1;break;
case 'B':LED2=~LED2,LED1=1;break;
case 'C': LED1=~LED1,LED2=~LED2;break;
}
}
else
LED1=LED2=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TI=0;
TR1=1;
while(1)
{ if(K1==0)
{ while(K1==0);
Operation_NO=(Operation_NO+1)%4; //计按键次数决定模式
}
switch(Operation_NO)
{ case 0:LED1=LED2=1;break;
{uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void main()//主函数
{SCON=0x50;//以下为串行口初始化
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
RI=0;
TR1=1;
LED1=LED2=1;
while(1)
{ if(RI)
DelayMS(10);
}}
#include<reg52.h>(LCD1602)
#define uint unsigned int
#define uchar unsigned char
51单片机控制1602LCD显示程序

LCD显示电路#include<reg51.h>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 <string.h>#include<intrins.h> //包含_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<n;i++)Lcd_delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值: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; //将忙碌标志电平赋给resultE=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发生正跳变,所以应先置ぜ? _nop_();_nop_(); //空操作两个机器周期,给硬件反应时间Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址x入口参数:注:此函数已经加上了0x80,故只需写上实际地址就行***************************************************/void Lcd_WriteAddress(unsigned char x){ Lcd_WriteCom(x|0x80); //显示位置的确定方法规定为80H+地址码x/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void Lcd_WriteData(unsigned char y){while(Lcd_BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变所以应先置ぜ?Lcd_Data=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void Lcd_Int(void){Lcd_delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口Lcd_delay(5); //延时5msLcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);设置模式次写9// Lcd_WriteCom(0x38);Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x0C); //显示模式设置:显示开,有光标,光标闪烁Lcd_delay(5);Lcd_WriteCom(0x06); //显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01); //清屏幕指令,将以前的显示内容清零Lcd_delay(5); }void hanying_show(void){unsigned char Lcd_i;Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x00); // 设置显示位置为最左侧Lcd_delay(2);Lcd_i=0;while(string1[Lcd_i]!='\0') //'\0'是数组结束标志需先将字符存入{Lcd_WriteData(string1[Lcd_i]); // 显示字符Lcd_i++;Lcd_delay(4);}}void main(){Lcd_Int(); //1602初始化while(1){hanying_show();}}。
基于51单片机的数字LCD显示

基于51单片机的数字LCD显示摘要:基于89 C51单片机的数字显示标题硬件实现和软件设计,阐述了它的工作原理。
介绍了研制过程中遇到的问题和解决办法。
通过实验和运行,那头性能可靠,满足设计指标参数,LCD显示具有广阔的市场前景,然后是成熟和普及。
在显示领域,LED显示装置系列微电子技术、计算机技术和信息处理于一体,以其色彩鲜艳、动态范围、高亮度、清晰度高,低电压操作,能耗低、使用寿命长、耐冲击、色彩艳丽、工作可靠、稳定的优势,成为新一代的显示媒体,目前,LED显示屏已被广泛应用于大型广场,商业广告、信息传播、新闻发布、证券交易,能满足不同环境的需要。
由单片机外围电路系统,显示电路、单片机、最小的系统构成。
该系统的安装是容易的检测、软件功能完善、工作可靠、精度高的优点。
论述了单片机控制的液晶数字显示系统,阐述了软件的基本原理,实现您的系统使用的设计及模拟和系统的应用领域。
关键词: 单片机AT89C51、液晶数字显示, 凯尔软件ⅰBased on 51 SCM LCD digital displayAbstract Based on the 89 C51 SCM's digital display header hardware realization and the software design, expounds its principle of work. Introduces the developing process of the multiplier encounter problems and solving methods. Through the test and operation, that the header reliable performance, to meet the design index parameters, and has a broad market prospect, and then the mature and popularity. As in the display field, LED display set series microelectronics technology, computer technology and information processing in the integral whole, with its colourful, dynamic range, high brightness, high-definition, low voltage operation, low consumption, long service life, impact resistance, gorgeous colour and stable and reliable work, become the advantage of a new generation of show media, at present, the LED display has been widely used in large square, commercial advertising, information dissemination, press conference, securities trading, can satisfy the need of different environment. By single-chip microcomputer system, peripheral circuit and single-chip microcomputer and show circuit smallest system formed. This system is easy to install detection, software function is perfect, reliable operation, the advantages of high accuracy.This paper discusses the single-chip microcomputer control by the LCD digital display system, and expounds the basic principle of the Keil software to realize the system using design and simulation and the system applied fields.Keywords: single-chip microcomputer AT89C51, LCD digital display, Keil softwareii目录引言 (1)第一章初识系统 (2)1.1设计过程及工艺要求 (2)1.2设计的重点与难点 (2)第二章系统的设计 (3)2.1系统设计 (3)2.2芯片AT89C51介绍 (3)2.3 AT89S51单片机特性 (6)2.4 LCD显示屏介绍 (6)2.4.1 LCD的定义及作用 (6)2.4.2 LCD显示器的工作原理及主要参数 (6)2.4.3 LCD的分类 (10)2.4.4 LCD的特点 (10)第三章系统调试 (11)3.1 硬件的设计 (11)3.2原理分析 (13)3.3程序的调试与运行 (14)3.3.1 HEX文件的生成 (14)3.3.2 调试与仿真 (14)结论 (15)致谢 (16)参考文献 (17)iii引言目前,控制仪表经常使用的显示面板主要有LCD和LED两种类型,其中LCD比较美观,省电,显示方式灵活,但是价格比较昂贵,最重要的是它的醒目程度较低,可视角度也比较小;而LED数码管虽然功耗较大,但它亮度高,用作工业现场指示时更醒目,而且价格低。
51单片机键盘显示

键盘与显示方案
一、简介
键盘与显示实验板有三种显示方式分别为LED显示、数码管显示、LCD1602显示,按键有三种方式分别是直扩按键、164外扩2*8扫描按键、红外遥控,通过硬件设计、制作,软件编程仿真,能够让我们深入理解与学习基本的显示与按键输入,为以后单片机系统的设计打下坚实基础
二、方案
1、方案简介
(1)LED显示简单实用可以用来玩各种花样流水灯,大量的LED灯可以显示字
符、汉字等各种符号,由于本实验板i/o口有限,故在P1口连接八个LED,制作一个简单的跑马灯
(2)数码管显示为静态显示,用两片164外扩(由于i/o较少)protuse仿真连接图如下(数码管为共阳极)
(3)、LCD1602为液晶显示带有字库,可以方便的显示数字、字符、一些特殊符号,故本实验板用1602做一个菜单显示和一个时钟系统,从中熟悉和理解1602的使用,由于1602显示速度较慢故采用数据从P0口并行输入,仿真连接图如下所示
(4)、按键2*8扫描用164扩展,硬件连接如图
二、原理图
1、硬件连接图(由于连线复杂故大多采用标号连接)
1、PCB图
2、软件流程图
(1)、跑马灯(八个LED+四个直扩按键)
(2)、键值显示0~16(数码管+2*8扫描)
(3)、时钟系统(1602+四个直扩按键)
(4)、红外遥控(模拟四个直扩按键)
(5)、菜单显示(1602+三个个直扩)
三、元件列表
名称规格数量备注
89C51 1
LCD1602 1
数码管 2 共阳
74HC164 3
晶振12MHZ 1
按键开关21
电源开关 1
发光二极管 2.2V/1MA 8 白色蓝光电阻若干
电位器1K 1
电容若干。
基于AT89C51单片机键盘控制和LCD显示

(R\S)接P1.0。
系统硬件设计框图如图1
AT89S52单片机
4× 4非 编码行 列式矩 阵
图1
1 AT89S52是一种带4kB闪烁可编程课擦除只读存储器的低电压、高性能CMOS型8位微
处理器,俗称单片机。它是一个低功耗、高性能的8位CMo微控制器。由片内可反复
(一)硬件电路组成及工作原理
该系统采用AT89S52单片机为核心芯片的电路实现,主要由AT89S52芯片、时钟 电路、复位电路、4 × 4行列式键盘电路以及16 × 2字符的LCD1602电路。
4× 4非编码矩阵行线分别接P3.0〜P3.3、列线接单片机的P3.4〜P3.7。LCD显示
接口电路的传送命令和数据的高8位双向并行总线分别接于单片机的输入输出接口
机的外部晶振电路如图3
键盘电路的设计原理
首先行列式键盘中的键实际上就是一个机械开关,该开关位于行线和列线的交点处,通
过按键加以连接。当按下某个键时,该交点的行线和列线接通,相应行线或列线上的的
电平发生变化,从而可以确定被按下的功能键。4行× 4列的行列式键盘如图2.
→ m c-4
CO
⅛⅛
'图5
其次运用线翻转法判断有无键按下:
基于
摘要:提出一种基于单片机AT89S52的键盘输入和液晶显示系统的原理、器件、电路和
编程设计。输入和显示部分是单片机的外围电路,同时也是人机交流的重要接口。从C51
程序上实现键盘的消抖、按键识别、按键内容的液晶显示以及按键功能的液晶显示。
关键词:AT89S524×4行列式键盘 接口电路LCD显示 计算器
擦拭的FLASH只读程序存储器(ROM、片外程序存储器内部硬件资源,POP3 4 × 8 32
C51第液晶滚屏显示

(5)字符发生存储器(CGROM)
在对液晶模块旳初始化中要先设置其显示模式,在液晶模块 显示字符时光标是自动右移旳,无需人工干预。每次输入指 令前都要判断液晶模块是否处于忙旳状态。
1602液晶模块内部旳字符发生存储器(CGROM)已经 存储了128个不同旳点阵字符图形,这些字符有:阿拉伯数 字、英文字母旳大小写、常用旳符号等,每一种字符都有一 种固定旳代码(ASCII字符集字库),例如大写旳英文字母 “A”旳代码是01000001B(41H),显示时模块把地址 41H中旳点阵字符图形显示出来,我们就能看到字母“A”
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表达忙,此时模块不能接受命令或者数据,假如为低电平表达不忙。
指令10:写数据。 指令11:读数据。
(7) 1602LCD旳一般初始化(复位)
过程
延时15mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 后来每次写指令、读/写数据操作均需要检测忙信号 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏 写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置
}
void main() {
。。。。 }
Write_LCD_Command(0x38);
}
DelayMS(1);
void Write_LCD_Command(uchar cmd)
{ RS=0; P0=cmd; EN=1; DelayMS(1); EN=0;
Write_LCD_Command(0x01); DelayMS(1); Write_LCD_Command(0x06); DelayMS(1); Write_LCD_Command(0x0C); DelayMS(1); }
基于C51单片机的智能仪器综合设计实验

基于单片机的智能仪器综合设计实验一、实验目的在实验一~实验三的基础上,完成综合设计实验,学会信号采集、数据处理、键盘控制、LCD或LED显示等功能的智能仪器设计。
二、复习与参考实验一~实验三三、设计指标利用K分度号热电偶进行温度检测,测温范围为500-1200ºC,室温为20ºC,用LCD或LED显示室温和测量温度。
具有4路温度信号循环检测功能,通道切换时间可调;具有任意指定通道显示功能。
四、实验要求1.选择传感器,设计硬件电路,包括检测电路、信号调理电路、AD转换电路、单片机最小系统、LED显示(单号)、LCD显示(双号)、独立式按键,画出电路原理图。
2.画出软件流程图。
3.用Keil C51编写程序。
3.实验结果在LCD或LED上显示出来。
4.实验前完成第1、2项备查。
五、实验仪器设备和材料清单PC机;单片机实验板、连接导线、ST7920图形液晶模块Keil c51软件六、实验成绩评定方法实验成绩包括预习、实验完成质量、实验报告质量3部分组成,各部分所占比例分别为30%、40%、30%。
八、实验报告要求实验报告格式:●实验名称●实验目的●实验内容●硬件设计●软件设计●调试过程●参考文献●附1:电路原理图●附2:程序清单附录:实验程序源代码如下:(陈寅)#include "reg51.h"#define THC0 0xee //5ms时间常数设置#define TLC0 0x00sbit ADWR=P3^6; /***WR*****/sbit ADRD=P3^7; /***RD*****/sbit ADCS=P2^7; /***CS*****/sbit EOC=P3^3; /***EOC****/sbit ADA=P1^3; //通道选择引脚sbit ADB=P1^4;sbit ADC=P1^5;sbit CS =P1^0; /****************/sbit SID=P1^1; /**液晶引脚定义**/sbit SCLK=P1^2; /****************/sbit MODE=P2^0; /*************************/sbit UP=P2^1; /*四个按键接口,0表示按下*/sbit DOWN=P2^2; /*************************/sbit LED1=P2^3; /**4个LED灯引脚定义**/sbit LED2=P2^4; /********************/sbit LED3=P2^5; /********************/sbit LED4=P2^6; /********************//***************500~1200°C范围的K分度表,间隔10*******************/ unsigned int code K_TABLE[71]={20644,21066,21493,21919,22346,22772,23198,23624,24050,24476,24902,25327,25751,26176,26599,27022,27445,27867,28288,28709,29128,29547,29965,30383,30799,31214,31629,32042,32455,32866,33277,33686,34095,34502,34909,35314,35718,36121,36524,36925,37325,37725,38122,38519,38915,39310,39703,40096,40488,40897,41296,41657,42045,42432,42817,43202,43585,43968,44349,44729,45108,45486,45863,46238,46612,46985,47356,47726,48095,48462,48828}; unsigned char GetAdData[10]={0}; //存放获得AD值的数组变量unsigned char ViewTemperature[4]={"0000"}; //显示温度缓冲数组变量unsigned MODESelect=1;int ChangeTime=2; //通道切换时间,单位Sint TongDao=1;void delay(unsigned int j){unsigned char i;do{for(i=0;i<100;i++);}while(j--);}void send_command(unsigned char command_data) //发送命令{unsigned char i;unsigned char i_data;i_data=0xf8; //操作命令,可以查看资料delay(10);CS=1;SCLK=0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data=i_data&0x0f;i_data<<=4;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void send_data(unsigned char command_data) //发送数据{unsigned char i;unsigned char i_data;i_data=0xfa; //操作命令,可以查看资料delay(10);CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data=i_data&0x0f; //取低四位i_data<<=4; //左移四位,从而变成高四位for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void InitLCD() //液晶初始化{send_command(0x30); //功能设置:一次送8位数据,基本指令集send_command(0x06); //点设定:显示字符/光标从左到右移位,DDRAM地址加1send_command(0x0c); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x04); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x01); //清DDRAMsend_command(0x02); //DDRAM地址归位send_command(0x80); //把显示地址设为0X80,即为第一行的首位}/* x,y为起始座标x(0<=x<=3),y(0<=y<=7),x为行座标,y为列座标;how为要显示汉字的个数;style为显示字符的类型,0表汉字,1表字母;str是要显示汉字的地址*/void Display(unsigned char x,unsigned char y,unsigned char how,bit style,unsigned char *stri) //液晶显示{unsigned char hi=0;if(x==0) send_command(0x80+y);else if(x==1) send_command(0x90+y);else if(x==2) send_command(0x88+y);else if(x==3) send_command(0x98+y);if(style==0){for(hi=0;hi<how;hi++){send_data(*(stri+hi*2));send_data(*(stri+hi*2+1));}}elsefor(hi=0;hi<how;hi++) send_data(*(stri+hi));}float LvBo(void)//复合滤波{unsigned char max,min,i;unsigned int sum=0;float U1;max=GetAdData[0];min=GetAdData[0];for(i=0;i<10;i++){sum=sum+GetAdData[i];if(max<GetAdData[i]) max=GetAdData[i];if(min>GetAdData[i]) min=GetAdData[i];}sum=sum-max-min;U1=(float)sum/8;U1=10.0*((U1*5.0)/255); //换成mvreturn U1;}void search (void)//查表子函数{unsigned int da=0,max,min,mid,j;unsigned int var;da=LvBo()*1000; //u1扩大1000倍da=da+798; //20度max=71;min=0;var=0;while(1){mid=(max+min)/2; //中心元素位置if(K_TABLE[mid]==da) {var=mid*10;break;} //中心元素等于查表元素,计算相应温度else if(K_TABLE[mid]>da) max=mid-1;else min=mid+1;if(max-min==1) /*线性插值计算温度值*/{j=(K_TABLE[max]-K_TABLE[min])/10; /*表中相邻两值对应温度相差10°C*/j=(da-K_TABLE[min])/j;var=10*min+j;break;}if(max==min){if(da>=K_TABLE[min]){j=(K_TABLE[min+1]-K_TABLE[min])/10;j=(da-K_TABLE[min])/j;}else if(da<K_TABLE[min]){j=(K_TABLE[min]-K_TABLE[min-1])/10;j=(da-K_TABLE[min-1])/j;min=min-1;}var=10*min+j;break;}}var=var+500;ViewTemperature[0]=var/1000+0x30;ViewTemperature[1]=var/100%10+0x30;ViewTemperature[2]=var/10%10+0x30;ViewTemperature[3]=var%10+0x30;}void LcdDisplay(void){unsigned char ViewMODESelect,ViewTongDao[5]={"0 "},ViewChangeTime[5]={"00(S)"};ViewMODESelect=MODESelect+0x30;ViewTongDao[0]=TongDao+0x30;if(MODESelect==1||MODESelect==2){if(MODESelect==1) Display(0,3,5,0,":自动切换");else if(MODESelect==2) Display(0,3,5,0,":手动切换");Display(0,0,2,0,"模式"); //液晶显示Display(0,2,1,1,&V iewMODESelect);Display(1,0,5,0,"温度通道:");Display(1,5,5,1,V iewTongDao);Display(2,0,4,0,"温度值:");Display(2,4,4,1,V iewTemperature);Display(2,6,2,1,"℃");}else if(MODESelect==3){ViewChangeTime[0]=ChangeTime/10+0x30;ViewChangeTime[1]=ChangeTime%10+0x30;Display(0,0,2,0,"模式");Display(0,2,1,1,&V iewMODESelect);Display(0,3,5,0,":设置时间");Display(1,0,5,0,"切换时间:");Display(1,5,5,1,V iewChangeTime);Display(2,0,14,1," "); //本行清屏}}void TDSelect(void) //AD通道设置{if(TongDao>=5) TongDao=1;if(TongDao<=0) TongDao=4;if(TongDao==1) {ADC=0;ADB=0;ADA=0;}else if(TongDao==2) {ADC=0;ADB=0;ADA=1;}else if(TongDao==3) {ADC=0;ADB=1;ADA=0;}else if(TongDao==4) {ADC=0;ADB=1;ADA=1;}}main(){unsigned char AdCount=0; //用来存放AD采集次数InitLCD();TMOD=0x11; //定时器0初始化TH0=THC0;TL0=TLC0;TR0=1;ET0=1;EA=1;P2|=0x07; //按键初始为高while(1){ADWR=1; /************/ADCS=0; /************/ADWR=0; /**AD初始化**/ADWR=1; /************/while(!EOC); //等待转换结束ADRD=0;GetAdData[AdCount]=P0; //读取转换结果AdCount++;if(AdCount>=10) //连续采集10次值{AdCount=0;search(); //查表LED1=!LED1;LcdDisplay(); //显示}}}void Timer0() interrupt 1{static unsigned char count=0,UPFlag=1,DOWNFlag=1; //按键标志位static unsigned int TimeCount=0;TH0=THC0;TL0=TLC0;if(MODE==0||UP==0||DOWN==0){count++;if(count>=30) //消抖处理{count=0;if(MODE==0) //按键按下{MODESelect++;if(MODESelect>=4) MODESelect=1;}else if(UP==0){UPFlag=0;if(MODESelect==2){TongDao++;TDSelect();}}else if(DOWN==0){DOWNFlag=0;if(MODESelect==2){TongDao--;TDSelect();}}}}else count=0;if(MODESelect==1){TimeCount++;if(TimeCount>=(ChangeTime*1000/5)){TimeCount=0;TongDao++;TDSelect();}}else if(MODESelect==3){if(UPFlag==0) {UPFlag=1;ChangeTime++;}else if(DOWNFlag==0){DOWNFlag=1;ChangeTime--;if(ChangeTime<=0) ChangeTime=1;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于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.实验报告格式:一.实验名称二.实验目的三.实验内容四.设计思想五.硬件设计六.程序代码七.参考文献2.硬件电路原理图用PROTEL等软件画出。
附录:程序源代码:附录1#include "reg51.h"#include "intrins.h"#define THCO 0xee#define TLCO 0x0#define uchar unsigned charsbit CS =P1^0;sbit SID=P1^1;sbit SCLK=P1^2;sbit B_light=P2^7; //背光uchar tab[1] ={'0'} ;int flag=0;unsigned char Hour=0,Min=0,Sec=0;void delay(unsigned int j){unsigned char i;do{}while(j--);}void send_command(unsigned char command_data) //发送命令{unsigned char i;unsigned char i_data,temp_data1,temp_data2;i_data=0xf8; //操作命令,控制指令delay(10);CS=1;SCLK=0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0; //送高{SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data; //送低//temp_data1=i_data&0xf0; temp_data2=i_data&0x0f;//temp_data1>>=4;temp_data2<<=4;//i_data=temp_data1|temp_data2; i_data=temp_data2;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void send_data(unsigned char command_data) //发送数据{unsigned char i;unsigned char i_data,temp_data1,temp_data2;i_data=0xfa; //操作命令,显示数据delay(10);CS=1;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}i_data=command_data;//temp_data1=i_data&0xf0;temp_data2=i_data&0x0f;//temp_data1>>=4;temp_data2<<=4;//i_data=temp_data1|temp_data2;i_data= temp_data2;i_data&=0xf0;for(i=0;i<8;i++){SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;}CS=0;}void InitLCD() //液晶初始化{send_command(0x30); //功能设置:一次送8位数据,基本指令集send_command(0x06); //点设定:显示字符/光标从左到右移位,DDRAM地址加1 send_command(0x0c); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x04); //显示设定:开显示,显示光标,当前显示位反白闪动send_command(0x01); //清DDRAMsend_command(0x02); //DDRAM地址归位send_command(0x80); //把显示地址设为0X80,即为第一行的首位}void DispHanzi(unsigned char x,unsigned char y,unsigned char how,unsigned char *stri){unsigned char hi=0; //汉字显示if(x==0) send_command(0x80+y); //else if(x==1) send_command(0x90+y);else if(x==2) send_command(0x88+y);else if(x==3) send_command(0x98+y);for(hi=0;hi<how;hi++){send_data(*(stri+hi*2));send_data(*(stri+hi*2+1));}}void DispZimu(unsigned char x,unsigned char y,unsigned char how,unsigned char *stri){unsigned char hi=0; uchar temp_pin ; //字母显示if(x==0) send_command(0x80+y);else if(x==1) send_command(0x90+y);else if(x==2) send_command(0x88+y);else if(x==3) send_command(0x98+y);for(hi=0;hi<how;hi++){send_data(*(stri+hi));}}void key(void){unsigned char temp_pin ;P0=0xf0; //低四位接键盘行,高四位为键盘的列线if((P0&0xf0)!=0xf0){delay(10);if((P0&=0xf0)!=0xf0) //消抖{P0=0xfe;temp_pin=(P0&0xf0);switch (temp_pin) //对按下的键进行判断{case 0xe0:tab[0]='F';break;case 0xd0:tab[0]='E';break;case 0xb0:tab[0]='D';break;case 0x70:tab[0]='C';break;default:break;}P0=0xfd;temp_pin=(P0&0xf0);switch (temp_pin){case 0xe0:tab[0]='B';break;case 0xb0:tab[0]='9';break;case 0x70:tab[0]='8';break;default:break;}P0=0xfb;temp_pin=(P0&0xf0);switch (temp_pin){case 0xe0:tab[0]='7';break;case 0xd0:tab[0]='6';break;case 0xb0:tab[0]='5';break;case 0x70:tab[0]='4';break;default:break;}P0=0xf7;temp_pin=(P0&0xf0);switch (temp_pin){case 0xe0:tab[0]='3';break;case 0xb0:tab[0]='1';break;case 0x70:tab[0]='0';break;default:break;}}}}main(){ unsigned char time[8]={"00:00:00"};TMOD=0x11;TH0=THCO;TL0=TLCO;TR0=1;ET0=1;EA=1;InitLCD();B_light=0;DispHanzi(0,1,6,"重庆");DispHanzi(2,2,4,"北京时间");DispZimu(3,2,8,time);while(1){ key();DispZimu(1,4,1,tab);if(flag==1){flag=0;time[0]=Hour/10+0x30;//数字转为ASCCII值进行显示time[1]=Hour%10+0x30;time[3]=Min/10+0x30;time[4]=Min%10+0x30;time[6]=Sec/10+0x30;time[7]=Sec%10+0x30;DispZimu(3,2,8,time);}}}void timer0() interrupt 1{static unsigned char count=0 ;TH0=THCO;TL0=TLCO;count++;if(count>=200) //秒计时,定时器定时5ms,计200次为一秒{count=0;Sec++; flag=1;if(Sec>=60) //分计时{Sec=0;Min++;if(Min>=60) //时计时{Min=0; Hour++;if(Hour>=24)Hour=0;}}}}。