根据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;}}}。
单片机原理及接口技术(C51编程)单片机的开关检测、键盘输入 与显示的接口设计

5.2.1 开关检测案例1
图5-3 开关、LED发光二极管与P1口的连接
5.2.1 开关检测案例1
参考程序如下: #include <reg51.h> #define uchar unsigned char void delay( ) {
uchar i,j; for(i=0; i<255; i++) for(j=0; j<255; j++); }
5.1.2 I/O端口的编程举例
03 用循环左、右移位函数实现
OPTION
使用C51提供的库函数,即循环左移n位函数和循环右
移n位函数,控制发光二极管点亮。参考程序:
#include <reg51.h> #include <intrins.h> 函数的头文件 #define uchar unsigned char void delay( ) {
5.1.2 I/O端口的编程举例
#include <reg51.h> #define uchar unsigned char uchar tab[ ]={ 0xfe , 0xfd , 0xfb , 0xf7 , 0xef , 0xdf , 0xbf , 0x7f , 0x7f , 0xbf , 0xdf , 0xef , 0xf7 , 0xfb , 0xfd , 0xfe }; /*前8个数据为左移点亮 数据,后8个为右移点亮数据*/ void delay( ) {
// P1口为输入 // 读入P1口的状态,送入state // 屏蔽P1口的高6位
5.2.2 开关检测案例2
switch (state) {
// 判P1口低2位开关状态
LCD按键显示51单片机程序设计

#include<reg52.h>#include<intrins.h>#include <string.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^2;sbit lcdrw=P2^3;sbit lcde=P2^4;uchar num,key;int i,length1,length2,length3; uchar sting1[]={"0903010"};uchar sting2[]={"hello"};uchar sting3[]={"happy"};uchar getkey(void);void delayms(uchar j);void delay1ms(uint time);void lcdinit(void); void lcdsendc(uchar c); void lcdsendd(uchar c); void lcdbusy(void); void jumpkey(uchar k);void delayms(uchar j){uchar n,m;for(n=0;n<j;n++){for(m=0;m<120;m++);}}void lcdinit(){delay1ms(100);lcde=0;lcdrs=1;lcdrw=1;lcdsendc(0x01); delay1ms(200);delay1ms(300);lcdsendc(0x3c); delay1ms(300);lcdsendc(0x06); delay1ms(200);lcdsendc(0x0c); delay1ms(200);}void lcdsendc(uchar c){P1=c;lcdrs=0;lcdrw=0;lcde=0;lcde=1;}void lcdsendd(uchar c){P1=c;lcdrs=1;lcdrw=0;lcde=0;lcde=1;}void lcdbusy(){uchar ma;lcdrs=0;lcdrw=1;lcde=1;ma=P1;if(ma&&0x80==0x80)delay1ms(1);}void delay1ms(uint time){uint i,j;for(i=0;i<time;i++)for(j=0;j<10;j++);}uchar getkey(void){uchar rcode,ccode;P3=0xf0;if((P3&0xf0)!=0xf0){delayms(20);if((P3&0xf0)!=0xf0){rcode=0xfe;while((rcode&0x10)!=0){P3=rcode;if((P3&0xf0)!=0xf0){ccode=(P3&0xf0)|0x0f;while((P3&0xf0)!=0xf0); return((~rcode)+(~ccode)); }else rcode=(rcode<<1)|0x01; }}}return 0;}void jumpkey(uchar k){switch(k){case 0x11:num=1;break;case 0x21:num=2;break;case 0x41:num=3;break; default:break;}main(){uint i;lcdsendc(0x01);while(1){key=getkey();delayms(20);jumpkey(key);switch(num){case 1:lcdsendc(0x01);lcdinit();lcdsendc(0xc3);length1=strlen(sting1);for(i=0;i<length1;i++){lcdsendd(sting1[i]);delay1ms(100);}for(i=10;i>0;i--)delayms(50);lcdsendc(0x08);for(i=10;i>0;i--)delayms(50);num=1;break;case 2: lcdsendc(0x01);lcdinit();lcdsendc(0x80);length2=strlen(sting2);for(i=0;i<length2;i++){lcdsendd(sting2[i]);delay1ms(100);} num=0; break;case 3 : lcdsendc(0x01);lcdinit();lcdsendc(0xc0);length3=strlen(sting3);for(i=0;i<length3;i++){lcdsendd(sting3[i]);delay1ms(100);} num=0; break;default:break;}}}(注:可编辑下载,若有不当之处,请指正,谢谢!)。
键盘输入与LCD显示原理

200Ω×8
g
d
dp
b
e
c
8155
0
1
2
3
4
a 5
f
6
PA0~PA7
电路的接法决定了必须采用逐位扫描显示方式。 即从段选口送出某位LED的字型码,然后选通该位LED, 即从段选口送出某位LED的字型码,然后选通该位LED, 并 保持一段延时时间。然后选通下一位,直到所有位扫描完。
要注意的两个问题:
1.字型码通常通过查表指令MOVC来求得. 1.字型码通常通过查表指令MOVC来求得. 2.换位显示时通常要加一段程序使所有的LED全灭. 2.换位显示时通常要加一段程序使所有的LED全灭.
com
com
例:模拟产品计数显示电路
段 显
编 程
ORG 1000H STAR:MOV TMOD,#60H ;定时器T1工作在方式2计数 MOV TH1,#00H ;T1置初值 MOV TL1,#00H MAIN:MOV P1,#0C0H ;数码管显示0 DISP:JB P3.3,DISP ;监测按键信号 ACALLDELAY ;消抖延时 JB P3.3,DISP ;确认低电平信号 DISP1:JNB P3.3,DISP1 ;监测按键信号 ACALLDELAY ;消抖延时 JNB P3.3,DISP1 ;确认高电平信号 SETB TR1 ;启动计数器 DISP2:MOV A,TL1 MOVC A,@A+DPTR ;查表获取数码管显示值 MOV P1,A ;数码管显示计数值 CJNE A,#8E,DISP2 LJMP STAR TAB:0C0H,0F9H,0A4H … … DELAY:MOV R2,#14H DELAY1:MOV R3,#0FAH DJNZ R3,$ DJNZ R2,DELAY1 RET END
89C51 PS2键盘控制LCD1602显示(已通过硬件实..

实验二十:LCD1602+PS2键盘输入实验一.实验目的:熟悉PS2协议。
二.实验原理图:键盘与单片机的连接LCD1602连接图华南理工大学无线电爱好者协会F D R 工作室三.硬件连线图:四.实验原理:PS/2通信协议是键盘与其他硬件通信时的一种半双工通信协议,键盘通过Data 线向外发送数据,数据时钟由键盘产生,在协议中数据的传送格式为短帧格式,一般为11位,各位的含义如下图所示:Start D0 D1 D2 D3 D4D5D6 D7 Parity StopStart :起始位,总为‘0’(低电平)D0~D7:8位数据位(低位在前,高位在后) Parity :奇偶校验位(为奇校验) Stop :停止位,总为‘1’(高电平)键盘向外发送数据的时序图如下图所示:键盘首先检查Clock 线和Data 线是否同时为高电平时,若是,则键盘产生Clock 信号,并将待发的数据按照数据帧的格式逐位放在数据线上,数据线在时钟的高电平期间改变状态,时钟的下降沿将数据锁定到数据线上,此时外界就可以到数据线上读取数据。
键盘同步时钟的最大频率为33KHZ ,一般情况下使用10~20KHZ 的频率。
本实验主要是接收由键盘Data 线发送过来的11位串行数据。
用的是11位移位寄存器的基本原理。
实现将由键盘发送过来的键盘扫描码转换成ASCII 码,并在LCD1602液晶上显示出来。
五.实验代码:华南理工大学无线电爱好者协会F D R 工作室//===========================ps2.h 头文件=============================// #ifndef PS2_H #define PS2_Hsbit keydata=P3^3; sbit clk=P3^2;unsigned char times=0; unsigned char i=0;unsigned char keycode=0,ps2_key; //ps2_key 用于存放接收到的键码static unsigned char BF=0; //标识是否有字符被收到unsigned char code noshift[80][2]= {1 , 8,// { f9 } 3 , 4,// { f5 } 4 , 2,// { f3 } 5 , 0,// { f1 } 6 , 1,// { f2 } 7 ,11,// { f12 } 9 , 9,// { f10 } 13 ,25,// { tab } 20 ,27,// { ctrl } 17 ,28,// { alt } 41 ,29,// { space } 31 ,30,// { win } 12 , 3,// { f4 } 11 , 5,// { f6 } 10 , 7,// { f8 } 14 ,96,// { ` } 22 ,49,// { 1 } 28 ,97,// { a } 30 ,50,// { 2 } 33 ,99,// { c } 38 ,51,// { 3 } 37 ,52,// { 4 } 46 ,53,// {5 }47 ,31,// { winright} 54 ,54,// { 6 } 61 ,55,// { 7 } 62 ,56,// { 8 } 50 ,98,// { b } 35 ,100,// { d } 36 ,101,// { e } 43 ,102,// { f } 52 ,103,// { g } 51 ,104,// { h } 59 ,106,// { j } 58 ,109,// { m } 49 ,110,// { n } 21 ,113,// { q } 45 ,114,// { r }华南理工大学无线电爱好者协会F D R 工作室44 ,116,// { t } 60 ,117,// { u } 42 ,118,// { v } 29 ,119,// { w } 34 ,120,// { x } 53 ,121,// { y } 26 ,122,// { z } 65 ,44,// { , } 66 ,107,// { k } 67 ,105,// { i } 68 ,111,// { o } 69 ,48,// { 0 } 70 ,57,// { 9 } 73 ,46,// { . } 74 ,47,// { / } 75 ,108,// { l } 76 ,59,// { ; } 77 ,112,// { p } 78 ,45,// { - } 82 ,39,// { ' } 85 ,61,// { = } 84 ,91,// { [ } 91 ,93,// { ] } 88 ,26,// { caps } 93 ,92,// { \ } 90 ,32,// { enter } 120,10,// { f11 } 102,12,// { back } 224,13,// { home } 105,14,// { end } 125,15,// { pageup } 122,16,// { pagedown } 117,17,// { up } 114,18,// { down } 107,19,// { left } 116,20,// { right } 113,21,// { del } 112,22,// { insert } 225,23,// { pause } 118,24,// { esc } 131, 6,// { f7 } };unsigned char code addshift[47][2]= {14,126, // { ~ } 22, 33, // { ! } 30, 64, // { @ } 38, 35, // { # } 37, 36, // { $ } 46, 37, // { % } 54, 94, // { ^ }华南理工大学无线电爱好者协会F D R 工作室62, 42, // { * } 70, 40, // { ( } 69, 41, // { ) } 78, 95, // { _ } 85, 43, // { + } 93,124, // { | } 84,123, // { { } 91,125, // { } } 76, 58, // { : } 82, 34, // { " } 65, 60, // { < } 73, 62, // { > } 74, 63, // { ? } 28 ,65,// { a } 50 ,66,// { b } 33 ,67,// { c } 35 ,68,// { d } 36 ,69,// { e } 43 ,70,// { f } 52 ,71,// { g } 51 ,72,// { h } 67 ,73,// { i } 59 ,74,// { j } 66 ,75,// { k } 75 ,76,// { l } 58 ,77,// { m } 49 ,78,// { n } 68 ,79,// { o } 77 ,80,// { p } 21 ,81,// { q } 45 ,82,// { r } 27 ,83,// { s } 44 ,84,// { t } 60 ,85,// { u } 42 ,86,// { v } 29 ,87,// { w } 34 ,88,// { x } 53 ,89,// { y } 26 ,90,// { z } };unsigned char getchar(unsigned char k) //转换键码为ASCII 码 { unsigned char j; if(!i)for(j=0;j<80;j++) {if(noshift[j][0]==k){ps2_key=noshift[j][1];return 1;} } elsefor(j=0;j<47;j++)华南理工大学无线电爱好者协会F D R 工作室{if(addshift[j][0]==k){ps2_key=addshift[j][1];return 1;} } return 0; }void Keyboard_out(void) interrupt 0 {if(times<9) {keycode=keycode>>1; //因键盘数据是低>>高,结合上一句所以右移一位if(keydata) keycode=keycode | 0x80; //当键盘数据线为1时为1到最高位 }times++; if(times>10) {times=0;if(keycode==0xe0 || keycode==0xf0){}//return;} else if((keycode==18 || keycode==89) && i==0) {i=1;} else if((keycode==18 || keycode==89) && i==1) {i=0;} else {EX0=0;BF=1;} //关中断等显示完后再开中断 //当中断11次后表示一帧数据收完,清变量准备下一次接收 //(注:如这里不用BF 和关中断直接调Decode() //则所Decode 中所调用的所有函数要声明为再入函数)} // while(!clk); //等待PS/2CLK 拉高 }#endif//=========================1602液晶头文键=================// #ifndef LCD1602_4_H #define LCD1602_4_H#include <reg52.h> #include <intrins.h>#define MSB 0x80 //读忙位 #define HIGH 1 #define LOW 0//*****************************************#define DATA_MODE 0x28 //LCD 模式设置,0x28位四位数据线模式 #define OPEN_SCREEN 0x0f //打开LCD 显示,有光标;0x0c 没有光标 #define DISPLAY_ADDRESS 0x80 //写地址指令#define CLEARSCREEN LCD_en_com(0x01) //清屏华南理工大学无线电爱好者协会F D R 工作室//***********//LCD1602的接线//***************************** #define LCDIO P0 //LCD1602的高四位接在P0口的高四位sbit LCD1602_RS=P0^0; //RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
基于C51单片机4按键4花样流水灯4种LCD显示的设计

按下K1,LCD显示一种内容同时显示一种花样流水灯,按下K2, K3,K4也有不同的花样和内容。 代码如下: /**************************************************/ #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define out P0 #define LED P3 uchar i,flag1,flag2,flag3,flag4; /*****定义端口******/ sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; sbit k1=P2^4; sbit k2=P2^5; sbit k3=P2^6; sbit k4=P2^7; //////////子函数/////////////// void check_busy(void); void write_command(uchar com); void write_data(uchar dat); void LCD_initial(void); void string(uchar ad ,uchar *s); void lcd_test(void); void delay(uint); /************************流水灯花样设计********************/ uchar table1[]= {0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};/** 从右到左点亮再灭之**/ uchar table2[]={0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff};/****两头分开 点亮再靠拢熄灭****/ uchar table3[]= {0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x9f,0xcf,0xe7,0xf3,0xf9};/****两灯 左右循环****/ uchar table4[]=
c51的简易计算器-单片机课程设计

单片机课程设计题目名称基于51单片机的简易计算器学生学院____ 信息工程学院_______专业班级信息工程(应用电子方向)12(2)班姓名______虞君权__________学号**********指导教师_ _____李优新 ___2015年1月151一、课程设计的内容本次课程设计的内容从下面两个方面任选一个:一是在学院的单片机实验平台上进行,开发一个基于单片机与PWM技术的灯光调节系统,主要开发内容为按键定义、输入与防抖动技术、PWM调节技术以及显示技术等程序设计。
二是利用51系列单片机及必要的外围芯片、输入输出等接口电路设计开发一个简易的单片机系统,在此基础上,自行设计一个单片机应用程序来实现一些实用的功能。
通过这些内容的设计、开发、安装、调试等一系列工作,熟练掌握单片机系统的开发流程与工作机理,加深对所学课程知识的理解与把握,为将来相关的研究开发工作打下坚实的基础。
二、设计内容本次实验的任务就是要以51系列单片机为核心实现一个简易计算器计算器,它的结构非常简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
三、方案论证经分析,计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。
具体如下:⒈)LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。
又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.⒉)4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用 3 种方法读取键值。
一种是中断式,外两种是扫描法和反转法。
中断式:在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个案件被按下。
本实验采用中断式实现用户键盘接口。
扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。
51单片机LCD1602液晶显示程序

LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/******************************************************************************
*
*函数名 * 函数功能
: 初始化 LCD 屏 :无 :无
*******************************************************************************
/
#ifndef
LCD1602_4PINS
void LcdInit()
//LCD 初始化子程序
{ LcdWriteCom(0x38); //开显示
//以下程序都是在 VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是 STC89C52RC,但是在所有的 51 52 单片机上都是通用的。51 只是一个学习的基础 平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111 代表第一个程序。//2222222222222222222222222 代表第二个程序, 以此类推
for(a=1;a>0;a--); } }
//误差 0us
}
/******************************************************************************
*
*函数名 * 函数功能
: LcdWriteCom : 向 LCD 写入一个字节的命令
LCD1602_E = 0;
单片机 矩阵键盘实验 实验报告

单片机矩阵键盘实验实验报告
实验名称:单片机矩阵键盘实验
实验目的:掌握单片机矩阵键盘的原理和应用,能够使用单片机按键输入
实验内容:利用Keil C51软件,采用AT89C51单片机实现一个4x4的矩阵键盘,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
实验步骤:
1、搭建实验电路,将矩阵键盘与单片机相连,连接好电源正负极,然后将电路焊接成一个完整的矩阵键盘输入电路。
2、打开Keil C51软件,新建一个单片机应用工程,然后编写代码。
3、通过代码实现对矩阵键盘输入的扫描功能,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
4、编译代码,生成HEX文件,下载HEX文件到单片机中,将单片机与电源相连,然后就可以测试了。
5、测试完成后,根据测试结果修改代码,重新编译生成HEX 文件,然后下载到单片机中进行验证。
实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。
实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。
基于C51单片机智能车LCD显示系统控....

摘要本课题以单片机为基础,以C语言为编程语言,以STC12C5608AD单片机芯片为核心。
本智能车显示系统分为手持端和服务端,手持端负责解析用户的操作,发送信息到服务端,并用LCD1602以友好的界面显示,显示内容涉及时间,当前车速,当前车子方向及当前温度等。
服务端负责响应手持端的消息,执行指定操作,如控制车子方向,速度等。
本设计对智能车进行仿真,对其速度,方向等进行模拟,然后进行本次设计的研制。
关键词STC12C5608AD;智能车;液晶显示ABSTRACT This topic to micro-based programming language C language to STC12C5608AD micro chip as the core. The smart car system is divided into the operation of the handheld client and server, the handheld terminal is responsible for parsing user to send a message to the server, and use Lcd1602 friendly interface, the display with respect to time, the current speed, the current direction of the car and the current temperature. . The server is responsible for responding to the handheld end of the message, perform the specified operation, such as control car direction, speed. The design of intelligent vehicle simulation, simulation of its speed, direction, and then proceed to the development of the design.KEY WORDS STC12C5608AD; Smart car;LCD目录1前言 (1)2系统总体设计 (3)2.1 设计思路 (3)2.2 主控芯片的选取 (4)2.2.1 单片机的特点 (4)3硬件电路设计 (7)3.1结构框图 (7)3.2服务端电路 (8)3.2.1驱动电路 (8)3.2.2传输电路 (9)3.2.3基础外围电路 (9)3.2.4速度模块 (11)3.3手持端模块 (12)3.3.1时钟模块 (12)3.3.2温度模块 (14)3.3.3显示模块 (15)3.3.4按键控制模块 (15)4软件系统设计方案 (16)4.1 手持端系统工作流程图: (16)4.2手持端系统代码分析: (17)4.3 服务端系统工作流程图: (22)4.3.1服务端系统代码分析: (23)5系统测试分析及改进 (26)5.1手持端测试分析: (26)5.1.1时钟模块测试: (26)5.1.2 Lcd1602显示模块测试: (26)5.1.3 NRF24L01无线传输模块测试: (26)5.1.4 DS18B20温度模块测试: (27)5.1.5按键扫描模块测试: (27)5.2 服务端测试分析: (27)5.2.1 PWM控速模块测试: (27)5.2.3 NRF24L01无线传输模块测试: (27)5.2.2 L298N电机驱动模块测试: (28)6总结 (29)参考文献 (30)致谢 (31)1前言智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。
基于单片机的液晶显示和键盘实现

——当要实现多电压输出时,既可以直接选用具备相应功能的电源稳压变换器件,也可以充分利用电路中已有器件的辅助电压输出,达到简化外围电路的目的。
随着半导体工艺技术的发展及系统设计水平的提高,单片机还会不断产生新的变化和进步,最终人们可能发现:单片机与微机系统之间的距离越来越小,甚至难以辨认。单片机的发展日新月异,鉴于本人水平有限,加之时间仓促,因此此次的毕业设计论文缺点在所难免,敬请各位老师同学批评指正。、
本次的毕业设计是基于单片机的知识作便携式设备的液晶显示与键盘输入,便携式设备有着广泛的用途,如远程监控,无损检测等,目前大部分的数字便携式设备是基于单片机系统开发的,在单片机系统中,除了需要特定的功能算法和传感器等器件外,还需要输入,输出装置,在便携式仪表中,输入装置一般是键盘,而输出装置一般是液晶显示模块。主要完成以下内容实现按键内容的液晶显示,实现按键功能的液晶显示[14],实现便携式设备的结果输出。
关键词:单片机;便携式设备;液晶显示;键盘
LCD and keyboard development based on single chip
Abstract
For the development of microelectronics technology and the demand of the industrial measurements, portable instruments have a bright future. Portable instruments are small in size, but flexible in use. Its design is quite different from other equipment, according their special requirements of single voltage input and multi voltage output. By analyzing the typical hardware structure and the different requirements of different modules, a general method is given to solve such problems.
基于C51单片机对液晶显示的实验设计

}
for(num=0;num《16;num++)
{
write_com(0x18);//整个屏幕左移
delay(20);
}
while(1);//停止
}
//在液晶屏上显示一串字符
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=“I LIKE MCU!”;
uchar code table1[]=“TAO XIAO SHOU”;
//端口设置
sbit lcden=P3_;
lcden=1;//启动使能,向存储器写
delay(5);
lcden=0;//写完关闭使能
}
//写数据
void write_data(uchar date)
{
lcdrs=1;//写数据
P0=date;
delay(5);
lcden=1;//启动使能
delay(5);
lcden=0;
}
//初始化子程序
void init()
sbit lcdrs=P3_;
uchar num;
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x》0;x--)
for(y=110;y》0;y--);
}
//写命令
void write_com(uchar com){lcdrFra bibliotek=0;//写命令
P0=com;
delay(5);
write_com(0x0e);//显示开关与光标设置
- 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;}}}}。