LCD12864显示矩阵键盘输入的任意两位数

合集下载

基于STM32 的门禁系统设计

基于STM32 的门禁系统设计

报警
电压过高或过低、指纹 不匹配、密码不匹配、 触发童锁、胁迫开锁
识别后处理 匹配开门、送显示 指纹 ID、不匹配
报警 图 2 门禁系统的软件架构
第2期
曹 兰:基于 STM32 的门禁系统设计
95
2.1 主程序设计 主 程 序 主 要 包 括 上 电 初 始 化 、指 纹 设 置 、密 码 设 置 、指 纹 识 别 模 块 、继 电 器 驱 动 模 块 、密 码 处 理 模
表 3 录入指纹时的应答包指令格式
字节数 名称 内容
2 bytes 包头 0XEF01
4 bytes 芯片地址
XXXX
1 byte 包标识
02
2 bytes 包长度
03H
N bytes 数据 xxH
2 bytes 校验和
sum
注:确认码=00H 表示录入成功;确认码=01H 表示包有错;确认码=02H 表示传感器上无手指;确认码=03H 表示录入不成功 .
第 23 卷 第 2 期 2021 年 6 月
漳州职业技术学院学报 Journal of Zhangzhou Institute of Technology
Vol. 23, No.2 Jun. 2021
文章编号 :1673-1417(2021)02-0092-06
doi:10.13908/ki.issn1673-1417.2021.02.0017
96
漳州职业技术学院学报
2021 年
过程中 ,遇到问题要参考它的数据手册 ,比如要提高指纹的反应速度 ,指纹生成特征、匹配指纹时 ,可 以调用它内部的函数。
硬件上电初始化设置 页地址、列地址、行地址
设置片选、读写 控制引脚

LCD12864显示矩阵键盘输入的任意两位数

LCD12864显示矩阵键盘输入的任意两位数
#defineuintunsignedint
#define NOP _nop_();
sbitLCD_CS=P1^0; //片选,高电平有效(RS)
sbitLCD_SID=P1^1;//串行数据输入端(R/W)
sbitLCD_SCLK=P1^2;//串行同步时钟,上升沿读取SID数据(E)
sbitLCD_PSB=P1^3;//并/串选择H并行L串行
voiddelayuint写指令程序指令由3个字节组成第一个为写指令第二个为指令高4位第三个为指令低4voidsendcmducharcmddatucharidat
/**********************************************************
用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5
{
dis_buf[1]=dis_buf[0]; //第一个键值移位显示
dis_buf[0]=keynum;//获得第二个键值
display();//显示改变后的键值
while(keynum<10) //松手检测
{
keynum=getkey();
}
}
}
void main()
{
P1=0xff;
LCD_INIT();
{
if(!(P2&k))//如果有键按下
return(row*4+col); //返回按键位置
k<<=1;
}
}
return 99;//无键按下返回99
}
voidkey_dispos()//按键处理并显示程序
{
display();//显示第一行和初始键值
keynum=getkey(); //获取键值

阐述数码管显示对应矩阵键盘值

阐述数码管显示对应矩阵键盘值

阐述数码管显示对应矩阵键盘值
数码管显示和矩阵键盘值之间的关系是通过数字信号的传递和编码来实现的。

在数码管显示中,每个数码管都有七个LED灯,可以分别控
制其显示数字的不同部分。

这七个LED灯对应的位置被编码
为数字的七位二进制数。

例如,数字“0”的编码为“00111111”,其中每个1代表一个LED灯亮起来,每个0代表一个LED灯
灭掉。

在矩阵键盘中,每个按键都与一个特定的行和列相连。

当用户按下一个按键时,该按键所在的行和列的电路之间会形成一个连接,并产生一个特定的数字信号,该信号代表了该按键所对应的数值。

因此,通过将数码管和矩阵键盘连接起来,可以根据按键的行列位置,将相应的数字信号解码并显示在数码管上。

这使得用户可以直接通过矩阵键盘输入数字,并看到其相应的显示和输出。

汽车多功能语音监控系统设计

汽车多功能语音监控系统设计

汽车多功能语音监控系统设计摘要:基于单片机(AT89S52)和语音芯片(ISD4004)研发了一套汽车多功能语音监控系统。

利用速度、温度、压力以及气敏(酒精)等检测传感器,实时采集汽车的各项参数,处理后输入单片机中,与正常参数进行比较,并通过语音输出比较结果,提示驾驶员做出正确的操作,提高驾驶安全性。

实际测试表明,该语音监控系统可对运行中的汽车各项参数进行实时采集,采集精度较高,并可输出高质量的语音提醒,对安全行车有一定的实际价值。

关键词:单片机;传感器;语音监控1 引言随着时代的飞速发展,人们的生活节奏越来越快,汽车已经成为人类最普遍的交通工具。

由于目前驾照考核制度的缺陷以及驾驶员本身素质的欠缺,大部分驾驶员不懂得行车过程中汽车各参数的意义以及参数变化后应采取何种措施,并且有些驾驶员甚至酒后驾车,这些都增加了行车的危险系数,使交通事故频频发生。

因此,如何提高汽车的行车安全性,特别是将安全行车因素实时地直观地呈现给驾驶员,将成为未来汽车的研究重点和发展方向。

2 系统总体方案系统要求驾驶员在启动汽车前先进行酒精测试,低于交通法规定的酒精浓度时,驾驶员才能启动汽车,否则无法启动汽车。

启动后,首先进入初始化设置(初次使用时,所有参数都是根据正常情况下安全行使时的数据进行设置,如无特殊要求可以跳过设置,也可根据特殊要求进行手动设置),汽车在运行中,各类传感器进行实时数据采集和处理,通过与设置值进行比较,输出比较结果,经过语音芯片把信号传输给扬声器发出语音提示。

为了方便驾驶员操作,系统采用矩阵键盘输入和LCD12864液晶屏显示,使系统的使用更加简单和人性化。

语音芯片(ISD4004)采用CMOS技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存储阵列,同时片内信息存于闪烁存储器中,可在断电情况下保存100年以上(典型值),反复录音10万次以上,因此,驾驶员还可以自己录制提示语音或选择通用普通话语音,也可设置每个部件选择不同的报警提示,可以让驾驶员快速了解提示报警的问题所在。

LCD12864

LCD12864

/**************************************************12864LCD指定位置显示汉字、ASCII码和自定义字型**************************************************/#include<reg51.h>#define uint unsigned int#define uchar unsigned char#define lcd_dat P0 //LCD数据输入/输出端D7‐‐‐‐‐‐D0,8位并行口sbit lcd_RS=P2^5; //数据/命令选择引脚(H/L)sbit lcd_RW=P2^6; //读/写引脚(H/L)sbit lcd_E=P2^7; //使能引脚sbit PSB=P2^2; //串/并口选择端,高电平为选择8位并口sbit RES=P2^4; //复位脚,低电平有效uchar code table1[]="林中白狼LCD12864";uchar code table2[]="自定义显示字符";uchar code table3[]="如下:";//用zimo221软件横向取模得到以下代码:/******************"龍"****************/uchar code cgram_data1[]={0x18,0xC0,0x18,0xFC,0xFE,0xC0,0x44,0xFC,0x28,0x0C,0xFE,0x0C,0xFE,0xFC,0x00 ,0xC0,0x7E,0xFC,0x66,0xC0,0x7E,0xFC,0x66,0xC0,0x7E,0xFC,0x66,0xC2,0x6E,0x7E,0x00,0x00};/******************"飛"****************/uchar code cgram_data2[]={0x00,0x00,0x7F,0xE0,0x7F,0xEC,0x18,0x78,0x7E,0x6C,0x76,0x60,0x36,0x36,0xFF, 0xDE,0xFF,0xC0,0x36,0xD8,0x36,0xF0,0x36,0xD8,0x36,0x66,0xE6,0x3E,0xC6,0x1C,0x00,0x00};/******************"鳳"****************/uchar code cgram_data3[]={0x00,0x00,0x7F,0xF8,0x60,0x18,0x6F,0xD8,0x66,0x18,0x6F,0xD8,0x6C,0xD8,0x6F, 0xD8,0x6C,0xD8,0x6F,0xF8,0x6C,0x18,0x6F,0xFA,0xD5,0x6E,0xD5,0x6E,0x40,0xE6,0x00,0x00};/******************"舞"****************/uchar code cgram_data4[]={0x0C,0x00,0x1F,0xFC,0x3F,0xFC,0x5A,0x58,0x3F,0xFC,0x1A,0x58,0xFF,0xFE,0xFF,0 xFE,0x18,0x30,0x1E,0xFC,0x36,0xFC,0x7E,0xB0,0x0C,0xFE,0x18,0xFE,0x70,0x30,0x00,0x00};void delay_ms(uint ms) // ms精确延时函数 (C51@11.0592MHz){uint i;uchar j;for(i=0;i<ms;i++){for(j=0;j<200;j++);for(j=0;j<102;j++);}}void delay(uint i) //us精确延时函数(C51@11.0592MHz){while(i‐‐);}void lcd_write_command(uchar command)//写指令函数{lcd_RS=0; //低电平表示写入的是指令lcd_RW=0; //低电平表示写操作lcd_dat=command; //把要写的指令送到lcd数据输入端,即P0口lcd_E=1; //E置高电平,使能允许lcd_E=0; //E置低电平,使能端E从高电平1跳变到低电平0,执行写操作delay(20); //延时212us,等待写指令操作完成【写指令操作时间为72us】}void lcd_write_data(uchar dat) //写数据函数{lcd_RS=1; //低电平表示写入的是数据lcd_RW=0; //低电平表示写操作lcd_dat=dat; //把要写的数据送到lcd数据输入端,即P0口lcd_E=1; //E置高电平,使能允许lcd_E=0; //E置低电平,使能端E从高电平1跳变到低电平0,执行写操作delay(20); //延时212us,等待写指令操作完成【写指令操作时间为72us】}/***************设置显示位置**************************/void lcd_set_xy(uchar x,uchar y)//x代表第几行,y代表第几列(共4行8列){uchar address;switch(x){case 1 : address=0x80+y‐1;break;case 2 : address=0x90+y‐1;break;case 3 : address=0x88+y‐1;break;case 4 : address=0x98+y‐1;break;default :break;}lcd_write_command(address);}/****************显示一个字符**********************//*void lcd_dsplay_onechar(uchar x,uchar y,uchar dat){lcd_set_xy(x,y);lcd_write_data(dat);}*//****************以写入汉字内码形式显示一个汉字**********************//*void lcd_dsplay_onecn(uchar x,uchar y,uchar dat_high,uchar dat_low){lcd_set_xy(x,y);lcd_write_data(dat_high);//写入汉字内码高字节lcd_write_data(dat_low);//写入汉字内码低字节}*//***************显示字符串函数***************/void lcd_dsplay_string(uchar x,uchar y,uchar *p){lcd_set_xy(x,y);while(*p!='\0') //'\0'表示ASCII码值为0,即空操作NULL,字符串就以'\0'代表一个字符串的结束{lcd_write_data(*p);p++;}}//注:Keil编译器可以直接把汉字转换成汉字所对应的两个字节的GB2312内码//所以写程序可以直接把汉字当做字符串来显示就可以了/****************************************CGRAM自定义字符对应地址及其显示编码如下:地址 显示编码0x40 0000H0x50 0002H0x60 0004H0x70 0006H****************************************//***********写CGRAM函数*****************/void write_cgram(){uchar i;lcd_write_command(0x40);//设定CGRAM地址,接下来要向上一步刚刚设定的CGRAM地址写入数据for(i=0;i<16;i++){lcd_write_data(cgram_data1[i*2]);//写CGRAM数据‐高字节lcd_write_data(cgram_data1[i*2+1]);//写CGRAM数据‐低字节}lcd_write_command(0x50);//写CGRAM地址0x50for(i=0;i<16;i++){lcd_write_data(cgram_data2[i*2]);//写CGRAM数据‐高字节lcd_write_data(cgram_data2[i*2+1]);//写CGRAM数据‐低字节}lcd_write_command(0x60);//写CGRAM地址0x60for(i=0;i<16;i++){lcd_write_data(cgram_data3[i*2]);//写CGRAM数据‐高字节lcd_write_data(cgram_data3[i*2+1]);//写CGRAM数据‐低字节}lcd_write_command(0x70);//写CGRAM地址0x70for(i=0;i<16;i++){lcd_write_data(cgram_data4[i*2]);//写CGRAM数据‐高字节lcd_write_data(cgram_data4[i*2+1]);//写CGRAM数据‐低字节}}void lcd_init() //lcd初始化函数{PSB=1; //设置为8位并口工作模式delay(20); //延时212usRES=0; //复位delay(20); //延时212usRES=1; //复位置高delay(20);lcd_write_command(0x30);//lcd显示模式设置,8位数据接口,基本指令显示lcd_write_command(0x0c);//显示状态设置,开显示,关光标,光标no闪烁lcd_write_command(0x06);//输入方式设置,光标右移,整屏NO移动,【N=1,即读/写一个字符后,地址指针AC自动+1,光标指针+1】lcd_write_command(0x01);//清除屏幕显示delay_ms(4); //延时4ms,完成清屏操作【执行清屏指令需要1.64ms】}void main(){lcd_init();//初始化lcd_dsplay_string(1,1,"林中白狼LCD12864");lcd_dsplay_string(2,1,"自定义显示字符");lcd_dsplay_string(3,1,"如下:");write_cgram();//往CGRAM对应地址里写好要显示的数据lcd_write_command(0x98+0x02);//在第4行第3列显示lcd_write_data(0x00);//自定义字符显示编码高字节lcd_write_data(0x00);//自定义字符显示编码低字节‐‐‐第一个要显示的自定义字符显示编码为:0x0000lcd_write_command(0x98+0x03);//在第4行第4列显示lcd_write_data(0x00);//自定义字符显示编码高字节lcd_write_data(0x02);//自定义字符显示编码低字节‐‐‐第二个要显示的自定义字符显示编码为:0x0002lcd_write_command(0x98+0x04);//在第4行第5列显示lcd_write_data(0x00);//自定义字符显示编码高字节lcd_write_data(0x04);//自定义字符显示编码低字节‐‐‐第三个要显示的自定义字符显示编码为:0x0004lcd_write_command(0x98+0x05);//在第4行第6列显示lcd_write_data(0x00);//自定义字符显示编码高字节lcd_write_data(0x06);//自定义字符显示编码低字节‐‐‐第四个要显示的自定义字符显示编码为:0x0006while(1);}。

LCD12864时钟毕业设计带矩阵键盘

LCD12864时钟毕业设计带矩阵键盘

第一章方案论证1.1 单片机型系统的选择与论证方案一:此方案采用AT89C51八位单片机实现。

它内存较小,只有4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,无在线下载编程功能,也无在线仿真功能。

只能通过编程器烧写成以.hex为后缀名的文件。

方案二:此方案采用AT89S52八位单片机实现。

它内存较大,有8K的字节Flash闪速存储器,比AT89C51要多4K。

它可在线编程,可在线仿真的功能,这让调试变得方便。

单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。

而且体积小,硬件实现简单,安装方便。

另外AT89S52在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。

综上所述,我们采用了第二个方案,即AT89S52。

1.2显示模块的选择与论证方案一:采用LED点阵显示,用来显示文字、图形、图像、等各种信息的显示屏幕。

它均由LED矩阵块组成。

图文显示屏可与计算机同步显示汉字、英文文本和图形,该方案简单易行。

但所需的元件较多,且不容易进行操作,可读性差,一旦设定后,很难再加入其他的功能,当加上日期、时间时增加了编程的难度。

方案二:采用液晶(JHD529M1)显示器件,该液晶显示器件与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该器件的价格也略低于相同点阵的图形液晶模块。

而且此液晶显示平稳、省电、美观,更容易实现题目要求,对后续的功能兼容性高,同时有中文字库,也可以实现图像显示。

只需将软件作修改即可,可操作性强,也易于读数,能同时显示日期、时间、星期且易于修改。

综上分析,我们采用了第二个方案。

1.3 时钟实现方案一:采用软件实现,直接用单片机的定时器编程以实现时钟,优点节省硬件,缺点是编程复杂程序运行的每一步都需要时间,多一步或少一步程序都会影响记时的准确度,准确度较差。

AVR控制矩阵键盘,12864显示简单计算器

AVR控制矩阵键盘,12864显示简单计算器
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=0;
write_data(0x30+key);
while((!PINA&0X01));
if(s==1)
{
{h++;}
if(s!=1)
{
w++;}
}
}
// 按键10加法按键
if((PINB&0x04)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x04)==0)//确实有按键按下
#include<de<macros.h>
#define uint unsigned int
#define uchar unsigned char
#define RS_0 (PORTA&=~BIT(7))
#define RS_1 (PORTA|=BIT(7))
delay(1);//延时消抖
// 按键8
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{ n++;
delay(1);//延时消抖
key=2;
write_data(0x30+key);
while((!PINA&0X04));//等待按键松开

江苏省职业院校技能大赛高职组-集成电路开发及应用

江苏省职业院校技能大赛高职组-集成电路开发及应用

集成电路开发及应用赛项样题集成电路开发及应用赛项由“集成电路设计与仿真”,“集成电路工艺仿真”,“集成电路测试”及“集成电路应用”四部分组成。

本样题及其配分仅供参考,最终专家组命题时将根据命题情况,在保证各部分总分值不变的情况下,对各部分的子任务分值进行适当微调。

第一部分集成电路设计与仿真(20%)根据表1所示的真值表,设计集成电路,进行功能仿真演示。

具体要求如下:(1)使用Multisim 软件进行设计与仿真。

(2)选用ZVP2106G(PMOS)和ZVN2106G(NMOS)两种元器件进行设计,设计时应考虑如何使用最少个数的器件来实现。

(3)功能仿真时添加必要的电源、信号源、仪表,标好A、B、C、Y1、Y2信号标号。

(4)功能仿真需要现场运行并展示出包含全部输入状态和输出结果的完整的数字分析时序图。

表1 集成电路设计与仿真任务真值表说明:(1)最终设计的集成电路输出包含不少于一个信号输出端,如上表中有两个输出端(Y1与Y2),每个信号输出端的具体状态值,即Y11~Y18、Y21~Y28的值,将由比赛现场裁判长抽取的任务参数确定。

(2)现场评判时:①仅展示已完成的电路图;②现场仿真运行并展示出包含全部输入状态和输出结果的完整时序图;③现场生成并展示元件清单,不能进行增加、删除、修改、连线等操作。

第二部分集成电路工艺仿真(20%)任务一、选择、填写正确的集成电路制造工艺步骤(10%)所涉及的典型集成电路制造工艺流程和典型工艺方法包含但不限于以下表述:集成电路设计流程、硅片制备流程、热氧化工艺流程、光刻工艺流程、CMOS 工艺流程等集成电路典型制造工艺流程,SiO2制备工艺方法、薄膜淀积方法等典型集成电路制造工艺方法,数字、模拟集成电路基本设计步骤等。

赛题以选择题(单项选择或多项选择)或填空题形式呈现。

任务二、集成电路晶圆MAP图标定(10%)所涉及芯片类型仅限于以下表述:74HC系列、74LS系列、CD40系列、CD45系列、LM系列运算放大器、TL系列运算放大器、A/D转换器、D/A转换器、直流稳压电路、功率集成电路及时基电路。

LCD12864解释

LCD12864解释

RE 为基本指令集与扩充指令集的选择控制位:RE=1:扩充指令集动作RE=0:基本指令集动作DL 为选择控制接口:DL=1:8-BIT 控制接口DL=0:4-BIT 控制接口G 绘图开关控制位:G=1 :绘图显示ONG=0 :绘图显示OFF在一个指令中不能同时改变“RE”和“DL”位的。

所以要分两次进行定义。

lcd_wcmd(0x34); //扩充指令操作是先确定“DL”“G”位。

“G”位的改变只能在扩充指令操作中进行。

lcd_wcmd(0x30); //基本指令操作是再确定“RE”位的。

SR=1允许输入垂直卷动地址SR=0允许输入IRAM地址SL=1脱离睡眠模式SL=0进入睡眠模式R/L=1右移R/L=1左移I/D-bit1:1 读写一个字符后指针+1,且光标+10 读写一个字符后指针-1,且光标-1// S-bit0:1 当写一个字符后,整屏显示左移(N=1)或右移(N=0),以得到光标不动而屏幕移动的效// S/C-bit3:1 画面平移一个字符位;0 光标平移一个字符位在仔细研究了上面关于它的 X啊 Y啊那些坐标的定位啊写满了哪些地址会自增啊哪些不会啊什么的,最后感觉脑袋里有了一种朦胧的概念……哟西,反正不会弄坏,就先随便写个程序试试。

于是乎,嘀咕嘀咕……捣鼓捣鼓……反反复复又弄了一个多小时后,终于摸清了它显示的规律……LCD12864实现画图功能的思路:首先,画图指令属于扩充指令集,要使用这些指令必须在12864初始化之后写命令字(0x34)进入扩充指令集设定状态。

接着要做的事就是指定我们的图片要从哪里写入(即写入的XY坐标,这个是最关键,也是最难理解的部分)。

因为我们这里是显示一整个画面的图片,所以我们就从12864的第一个点开始显示。

那这个点的坐标是怎么定位的呢?我们往这个点写入数据后,要是接着再写数据,那坐标值会怎样变化呢?首先我们要弄清楚12864究竟是怎么把数据写入到GDRAM(绘图显示RAM)中去的。

LCD12864液晶的使用之字库型液晶(二)

LCD12864液晶的使用之字库型液晶(二)
Read_H=ReadByte(); //读高8位
Read_L=ReadByte(); //读低8位
write_LCD_command(ROW+0x80); //送入垂直地址
write_LCD_command(xlabel+0x80);//再送入水平地址
if(xlabel_bit<8)
{
switch(color)
address++;//指针地址指向下个位置
}
}
}
还有一点要注意的就是显示图片和显示ASCII码、汉字的初始化函数不同,显示图片用的是扩展指令:
void init_BMP()
{
write_LCD_command(0x36);//CL=1--8位。扩充指令(RE=1),绘图打开(G=1)
delay(100);//适当延时
下面这个显示温度曲线:
这两个的仿真图大家可以做一下!
/echoas/blog/item/525d2f74bc735508b151b92d.html
{
ROW=y;
}
else//显示的是下半屏
{
ROW=y-32;
xlabel+=8; //规定显示在下半屏
}
write_LCD_command(ROW+0x80); //送入垂直地址
write_LCD_command(xlabel+0x80);//再送入水平地址
ReadByte();//读取当前GDRAM数据前腰进行一次空读,接下来就可以读出数据了
break;
default:break;
}
write_LCD_data(Read_H);//将数据写入GDRAM

51单片机毕业设计题目

51单片机毕业设计题目

1、基于51单片机温湿度检测的设计1、设计要求1、采用51单片机(STC89C52RC)+LCD12864+DHT11设计,实现温湿度检测,板上有单片机复位按键和报警指示灯等。

2、电脑USB供电3、采用C语言编程。

4、显示图片和汉字。

2、基于51单片机温湿度检测的设计1、设计要求1、采用51单片机(STC89C52RC)+LCD12864+DHT11设计,实现温湿度检测。

2、3个按键调整温湿度上下限值。

3、4个发光二级管和蜂鸣器报警。

4、电脑USB供电5、采用C语言编程。

6、显示图片和汉字。

3、基于51单片机温湿度检测+电子万年历的设计1、设计要求1、采用51单片机(STC89C52RC)+LCD12864+DHT11+DS1302设计,实现温湿度检测和电子万年历。

2、4个发光二级管实现温湿度报警。

3、电脑USB供电4、断电走时5、显示图片和汉字。

6、采用C语言编程。

4、基于51单片机温湿度检测+电子万年历的设计1、设计要求1、采用51单片机(STC89C52RC)+LCD12864+DHT11+DS1302设计,实现温湿度检测和电子万年历。

2、4个发光二级管和蜂鸣器实现温湿度报警。

3、3个按键实现温湿度上下限数值调节。

4、电脑USB供电5、断电走时6、显示图片和汉字。

7、采用C语言编程。

5、基于51单片机温湿度检测+数字钟的设计1、设计要求1、采用51单片机(STC89C52RC)+LCD12864+DHT11设计,实现温湿度检测和数字钟。

2、4个发光二级管实现温湿度报警。

3、3个按键实现温湿度上下限数值和数字钟时分秒调节。

4、电脑USB供电5、显示图片和汉字。

6、采用C语言编程。

6、基于51单片机温湿度检测+电子万年历的设计1、设计要求1、采用51单片机(STC89C52RC)+LCD12864+DHT11+DS1302设计,实现温湿度检测和电子万年历两个功能。

2、4个发光二级管实现温湿度报警。

基于stm32的LCD12864显示+16个矩阵键盘程序

基于stm32的LCD12864显示+16个矩阵键盘程序
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_9);
for (ii=0;ii<4;ii++)
{
GPIO_ResetBits(GPIOB,heng[ii]);
for(jj=0;jj<4;jj++)
{
delay(50000);
delay(50000);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
}
void GPIO_Cofiguration_12864(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
//delay(50000);
if(GPIO_ReadInputDataBit(GPIOB,ling[jj])==0)
{

LCD12864的原理分析以及使用方法(含代码分析)

LCD12864的原理分析以及使用方法(含代码分析)

LCD12864液晶显示模块的使用与分析(函代码分析)一、LCD12864功能应用LCD12864液晶显示模块能显示中文汉字、数字、字符,能显示数字与字符的个数为64个(4行,每行16个数字或字符),能显示汉字的个数为32个(4行,每行8个汉字)。

其内置了8192个中文汉字(16*16的点阵)、128个字符(8*16点阵)、以及64*256 点阵显示RAM(GDRAM)。

图1外观尺寸图图2外观尺寸图图3 LCD12864读操作时序图4 LCD12864写操作时序二、LCD12864主要技术参数(1)工作电压:3.3V-5.5V,模块最佳电压为5V。

(2)可以在显示界面显示数字、字母和中文汉字。

(3)与外部单片机的通信方式有并行或串行两种通信方式,这里主要介绍并行通信方式。

(4)显示内容:128 列× 64 行(5)显示颜色:黄绿/蓝屏/灰屏(6)LCD 类型:STN(7)与MCU 接口:8 位或4 位并行/3 位串行(8)配置LED 背光(9)多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等三、LCD12864液晶显示的电路用法分析图5 LCD12864电路连接图图6 LCD12864电路连接图LCD12864模块主要用来显示所要的界面信息或数据,所以要求能显示汉字,字符和数字,而LCD12864满足系统要求的显示功能。

LCD12864在显示字母和数字时,是4*16的显示字符模块,即可以显示4行,每行可以显示16个字母或数字;在显示汉字时,是4*8的汉字显示模块,即可以显示4行,每行可以显示8个汉字。

下面进行介绍的是并行通信的显示方式。

按照电路原理图跟单片机最小系统进行连线,如图6所示。

LCD12864共有20个引脚,其引脚具体功能如表1所示,由表可得LCD12864引脚组成为8位数据传输端口(DB0-DB7);两个电源引脚(VCC,GND);两个电源背光引脚(BLK,BLA),控制LCD的背景亮度;一个VO引脚,外接一个上拉电阻(控制LCD12864的字符对比度,让字符更加的清晰可见);RST复位引脚,低电平有效,此处直接接高电平;第16、17位空引脚,不用管;剩下的RS,RW,EN 和PSB四个引脚则跟LCD12864的写入息息相关,通过PSB可以控制LCD12864跟单片机的通信方式,输入高电平,则LCD12864跟单片机的通信模式为并行通信,低电平则为串行通信。

矩阵键盘控制12864显示最经典程序

矩阵键盘控制12864显示最经典程序

矩阵键盘控制12864显示最经典程序#include //这个程序的功能:用4*4的矩阵键盘(接P3口)按键盘k1——k16中的任何一个键ki#include //12864液晶上显示数字i-1 (液晶数据口接P0)#define uint unsigned int//键盘扫描的思想是将行设置为低,列设置为高,来读取P3口的值,就能知道是哪个按键按下了#define uchar unsigned char#define LCDdata P0sbit E = P2^7;sbit RW = P2^6;sbit RS = P2^5;void init();void delayms(uint x);void displaykey();void write_com(uchar com);//写命令void write_data(uchar date);//写数据uchar temp;//--------------主函数-----------------void main(){init();// P3=0xfe;//P3=0xfd;//P3=0xfb;//P3=0xf7;while(1){displaykey();}}//-------------液晶初始化----------------void init(){write_com(0x01);write_com(0x02);write_com(0x06);write_com(0x0e);}//------------毫秒延时--------------- void delayms(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//------------写命令----------------- void write_com(uchar com){RS = 0;RW = 0;E = 0;LCDdata = com;E = 1;delayms(5);E = 0;}//-------------写数据------------------ void write_data(uchar date){RS = 1;RW = 0;E = 0;LCDdata = date;E = 1;delayms(5);E = 0;}//----void displaykey(){ //****************************判断第一行的键盘P3=0xfe; temp=P3; temp=temp&0xf0;while(temp!=0xf0)//判断是否有键盘按下为真有键盘按下{ delayms(50); temp=P3; temp=temp&0xf0;while(temp!=0xf0)//再次判断是否有键盘按下为真有键盘按下{ temp=P3;switch(temp){case0xee:write_com(0x80);write_data('0');write_com(0x81);write_data (' ');break;case0xde:write_com(0x80);write_data('1');write_com(0x81);write_data (' ');break;case0xbe:write_com(0x80);write_data('2');write_com(0x81);write_data (' ');break;case0x7e:write_com(0x80);write_data('3');write_com(0x81);write_data (' ');break;}break;//这个break很重要不能丢下,若丢下会这这个中退步出来}}//******************************判断第二行的键盘P3=0xfd; temp=P3; temp=temp&0xf0;while(temp!=0xf0){ delayms(50); temp=P3; temp=temp&0xf0;while(temp!=0xf0){ temp=P3;switch(temp){case0xed:write_com(0x80);write_data('4');write_com(0x81);write_data (' ');break;case0xdd:write_com(0x80);write_data('5');write_com(0x81);write_data (' ');break;case0xbd:write_com(0x80);write_data('6');write_com(0x81);write_data (' ');break;case0x7d:write_com(0x80);write_data('7');write_com(0x81);write_data (' ');break;} break;}}//******************************判断第三行的键盘P3=0xfb; temp=P3; temp=temp&0xf0;while(temp!=0xf0){ delayms(50); temp=P3; temp=temp&0xf0;while(temp!=0xf0){ temp=P3;switch(temp){case0xeb:write_com(0x80);write_data('8');write_com(0x81);write_data (' ');break;case0xdb:write_com(0x80);write_data('9');write_com(0x81);write_data (' ');break;case0xbb:write_com(0x80);write_data('1');write_com(0x81);write_ data('0');break;case0x7b:write_com(0x80);write_data('1');write_com(0x81);write_ data('1');break;}break;}}//******************************判断第四行的键盘P3=0xf7; temp=P3; temp=temp&0xf0;while(temp!=0xf0){ delayms(50); temp=P3; temp=temp&0xf0;while(temp!=0xf0){ temp=P3;switch(temp){case0xe7:write_com(0x80);write_data('1');write_com(0x81);write_ data('2');break;case0xd7:write_com(0x80);write_data('1');write_com(0x81);write_ data('3');break;case0xb7:write_com(0x80);write_data('1');write_com(0x81);write_ data('4');break;case0x77:write_com(0x80);write_data('1');write_com(0x81);write_ data('5');break;}break;}}}。

lcd12864c语言编程详解

lcd12864c语言编程详解

12864系列点阵型液晶显示模块使用说明书一、OCM12864液晶显示模块概述1.OCM12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。

采用KS0107控制IC。

2.外观尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)78×70×10mm(ocm12864-3),3.视域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),64×44mm(ocm12864-3)4.重量:大约g补充说明:外观尺寸可根据用户的要求进行适度调整。

二、最大工作范围1、逻辑工作电压(Vcc):4.5~5.5V2、电源地(GND):0V3、LCD驱动电压(Vee):0~-10V4、输入电压:Vee~Vdd5、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温)6、保存温度(Tstg):-10~65℃三、电气特性(测试条件 Ta=25,Vdd=5.0+/-0.25V)1、输入高电平(Vih):3.5Vmin2、输入低电平(Vil):0.55Vmax3、输出高电平(Voh):3.75Vmin4、输出低电平(Vol):1.0Vmax5、工作电流:2.0mAmax四、接口说明12864-3A接口说明表五、指令描述1、显示开/关设置CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:设置屏幕显示开/关。

DB0=H,开显示;DB0=L,关显示。

不影响显示RAM(DD RAM)中的内容。

2、设置显示起始行CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:执行该命令后,所设置的行将显示在屏幕的第一行。

高精度数控恒流源的设计与实现

高精度数控恒流源的设计与实现

高精度数控恒流源的设计与实现宋林桂【摘要】为了满足可调温无纺布热切割机对恒流源的需求,文章阐述了一种基于单片机的高精度数控恒流源的设计和实现方法.该电源以电流串联负反馈式压控恒流源电路为基础,以AT89S52单片机为控制核实现数字化控制.为实现高精度要求,在数控部分中,要采用12位高精度数字模拟转换器(Digital Analog Converter,DAC)芯片TLV5616控制压控恒流源的输出电流,并利用16位高精度模数转换器(Analog to Digital Converter,ADC)芯片ADS1115测量输出电流.文章采用矩阵键盘设定电流输出值,采用LCD12864液晶屏显示设定的电流和负载两端电压值.测试结果表明,本恒流源在20 ~2000mA输出电流时,输出电流与给定值误差小于5mA.【期刊名称】《无线互联科技》【年(卷),期】2016(000)018【总页数】3页(P59-60,76)【关键词】AT89S52;恒流源;ADS1115;TLV5616【作者】宋林桂【作者单位】苏州健雄职业技术学院电气工程学院,江苏太仓215411【正文语种】中文高精度恒流源是一种非常重要的特种电源,在现代科学研究和医疗、工业生产中得到了越来越广泛的应用。

传统的恒流源往往用电位器调节输出电流,其精度较差,且无法实现精确步进。

目前,恒流源已朝着数字化方向发展,多采用模数和数模转换器实现数字化控制,具有高精度、高稳定性等特点[1]。

该系统主要由电源模块、恒流源电路模块、负载模块、单片机最小系统模块、键盘显示模块、ADC电路模块和DAC电路模块、LCD12864液晶显示电路以及4×4矩阵键盘电路构成,系统结构如图1所示。

2.1 电源电路系统中使用到集成运算放大器,集成运算放大器供电使用正负电源。

如图2所示,为了减少系统输出的纹波系数,系统选用±12V变压器把市电降成低压,变压器变压后经过整流滤波得到正直流电源DC+和负直流电源DC-,正电源DC+和负电源DC-为集成运算放大器提供正负电源。

矩阵键盘按键的数码管显示矩阵,键盘按键的数码管显示

矩阵键盘按键的数码管显示矩阵,键盘按键的数码管显示

一、矩阵键盘按键的数码管显示1.实验目的(1)掌握VHDL语言的语法规范,掌握时序电路描述方法(2)掌握多个数码管动态扫描显示的原理及设计方法2.实验所用仪器及元器件计算机一台实验板一块电源线一根扁平线一根下载线一根3.实验任务要求设计出4*4矩阵键盘对某一按键按下就在数码管显示一个数字。

按键从左上角到右下角依次为1,2, (16)4.实验原理按键模块原理键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。

同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。

键盘键值的获取:键盘上的每一个按键其实就是一个开关电路,当某键被按下时,该按键的接点会呈现0的状态,反之,未被按下时则呈现逻辑1的状态。

扫描信号由row进入键盘,变化的顺序依次为1110-1101-1011-0111-1110。

每一次扫描一排,依次地周而复始。

例如现在的扫描信号为1011,代表目前正在扫描9,10,11,12这一排的按键,如果这排当中没有按键被按下的话,则由column 读出的值为1111;反之当9这个按键被按下的话,则由column读出的值为1110。

根据上面所述原理,我们可得到各按键的位置与数码关系如表所示:1110 1110 1110 1110 1101 1101 1101 1101row1110 1101 1011 0111 1110 1101 1011 0111 column1 2 3 4 5 6 7 8键值row 1011 1011 1011 1011 0111 0111 0111 0111 column 1110 1101 1011 0111 1110 1101 1011 0111键值9 10 11 12 13 14 15 16动态显示原理为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。

LCD12864

LCD12864

12864LCD液晶显示屏中文资料一、概述二、带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

三、基本特性:(1)、低电源电压(VDD:+3.0--+5.5V)(2)、显示分辨率:128×64点(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) (4)、内置 128个16×8点阵字符(5)、2MHZ时钟频率(6)、显示方式:STN、半透、正显(7)、驱动方式:1/32DUTY,1/5BIAS (8)、视角方向:6点(9)、背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 (10)、通讯方式:串行、并口可选(11)、内置DC-DC转换电路,无需外加负压(12)、无需片选信号,简化软件设计(13)、工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃模块接口说明:*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。

2.2并行接口管脚名称电平管脚功能描述管脚号1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对比度(亮度)调整RS=“H”,表示DB7——DB0为4 RS(CS)H/L显示数据RS=“L”,表示DB7——DB0为显示指令数据5 R/W(SID) H/L R/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”,DB7——DB0的数据被写到IR 或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线8 DB1 H/L 三态数据线9 DB2 H/L 三态数据线10 DB3 H/L 三态数据线11 DB4 H/L 三态数据线12 DB5 H/L 三态数据线13 DB6 H/L 三态数据线14 DB7 H/L 三态数据线15 PSB H/LH:8位或4位并口方式,L:串口方式(见注释1)16 NC - 空脚17 /RESET H/L 复位端,低电平有效(见注释2)18 VOUT - LCD驱动电压输出端19 A VDD 背光源正端(+5V)(见注释3)20 K VSS 背光源负端(见注释3)*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。

矩阵键盘的键值用数码管显示

矩阵键盘的键值用数码管显示

矩阵键盘的键值用数码管显示�矩阵按键项目:分别按下4*4 矩阵键盘,一共16 个按键,数码管会相应的显示1-16 不同的数字。

最终效果图:现象说明:效果图中我们看到:按 4 键,数码管上即显示04,同理按5 键数码管上即显示05。

上面显示的 2 个LED 灯是硬件上特意设计的,只要按键按下,相应的灯就亮了。

目前不用太在意。

此项目练习的目的:(1)认识矩阵键盘。

(2)了解矩阵键盘的原理。

(3)熟悉软件编程。

(4)熟悉软件的使用。

完整代码:(注意,代码中省略的部分是我们目前可以不关心的内容,在下一阶段将着重介绍,此代码已编译测试通过)#include <reg52.h> //头文件#include "digitron_drv.h" //调用数码管显示程序,现在可以把它当做一个主体#define uint unsigned int //宏定义#define uchar unsigned charuchar key_num; //矩阵键盘键值/*延时函数*/void delay(uchar x){uchar i,j;for(i = x;i > 0;i--)for(j = 100;j > 0;j--);}/*键盘键值显示*/void display(void){DigShowNumber(1,key_num%10,0); //个位除以10 取余DigShowNumber(2,key_num/10,0); //十位除以10 取整}/*键盘扫描*/void keyboard(void){uchar temp;P1=0xef; //将第1 列置位低电平,其余的为高电平temp=P1; //读取P1 口当前的状态,赋值给临时变量temp,用于后面的计算temp=temp&0x0f; //判断temp 的,低四位是否为0,if(temp!=0x0f) //如果temp 不等于0x0f,说明有按键按下{delay(10); //延时消抖temp=P1; //重新读一次P1 口数据temp=temp&0x0f;// 如果temp 仍然不等于0x0f,这次说明第1 列真的有按键按下if(temp!=0x0f){temp=P1;switch(temp) //判断按下的是该列的第几行{case 0xee: //如果读到P1 是0xee,说明是第1 列和第1 行的交叉键,即数字键7key_num=7;break;case 0xed: //如果读到P1 是0xed,说明是第1 列和第2 行的交叉键,即数字键4key_num=4;break;case 0xeb: //如果读到P1 是0xeb,说明是第1 列和第3 行的交叉键,即数字键1key_num=1;break;case 0xe7: //如果读到P1 是0xe7,说明是第1 列和第4 行的交叉键,即数字键0key_num=0;break;}}//在判断完按键序号后,还要等待按键被释放,检测释放语句如下:while(temp!=0x0f) //等待按键被释放{temp=P1;temp=temp&0x0f; //不断的读取P1 口数据,然后和0x0f“与”运算,只要结果不等于0x0f,说明按键没有被释放,直到按键被释放才退出whiledisplay();}}//以下程序意义同上,继续进行第2、3、4 列的检测P1=0xdf;temp=P1;temp=temp&0x0f;if(temp!=0x0f){delay(10);temp=P1;temp=temp&0x0f;if(temp!=0x0f){temp=P1;switch(temp){case 0xde:key_num=8;break;case 0xdd:key_num=5;break;case 0xdb:key_num=2;break;case 0xd7:key_num=10;break;}}while(temp!=0x0f){temp=P1;temp=temp&0x0f;display();}}P1=0xbf;temp=P1;temp=temp&0x0f; if(temp!=0x0f) {delay(10);temp=P1;temp=temp&0x0f; if(temp!=0x0f) {temp=P1;switch(temp){case 0xbe:key_num=9; break;case 0xbd:key_num=6; break;case 0xbb:key_num=3; break;case 0xb7:key_num=11; break;}}while(temp!=0x0f){ temp=P1;temp=temp&0x0f; display();}}P1=0x7f;temp=P1;temp=temp&0x0f; if(temp!=0x0f) {delay(10);temp=P1;temp=temp&0x0f; if(temp!=0x0f) {temp=P1;switch(temp){case 0x7e:key_num=12;break;case 0x7d:key_num=13;break;case 0x7b:key_num=14;break;case 0x77:key_num=15;break;}}while(temp!=0x0f){temp=P1;temp=temp&0x0f;display();}}}void main(void){while(1){keyboard();display();}}长见识:(1)按键实物:也称轻触开关按键之前也已经见过了,再回忆一下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**********************************************************
用矩阵按键输入任意两位数并显示在12684上。

如先输入2,再输入5
液晶上显示25。

用矩阵按键0-9共10个按键。

LCD12864用串行方式操作,如果用并行,请自行修改。

***********************************************************/
#include <>
#include <>
#define uchar unsigned char
#define uint unsigned int
#define NOP _nop_();
sbit LCD_CS=P1^0; //片选,高电平有效(RS)
sbit LCD_SID=P1^1; //串行数据输入端(R/W)
sbit LCD_SCLK=P1^2; //串行同步时钟,上升沿读取SID数据(E)
sbit LCD_PSB=P1^3; //并/串选择 H并行 L串行
sbit LCD_RST=P1^4; //复位,低电平有效
uchar keynum;
uchar code dis1[]={"请输入任意两位数"};
uchar code dis2[16]={"09ABCDEF"};
uchar dis_buf[]={0,0};
uchar getkey();
void display();
void delay(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<110;i++);
}
}
/*写指令程序,指令由3个字节组成,第一个为写指令*/
/*第二个为指令高4位,第三个为指令低4位*/
void send_cmd(uchar cmd_dat)
{
uchar i;
uchar i_dat;
i_dat=0xf8;
LCD_CS=1;
LCD_SCLK=0;
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&=0xf0;
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;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
LCD_CS=0;
delay(10);
}
/*写数据程序,指令由3个字节组成,第一个为写数据*/ /*第二个为数据高4位,第三个为数据低4位*/
void send_dat(uchar cmd_dat)
{
uchar i;
uchar i_dat;
i_dat=0xfa;
LCD_CS=1;
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&=0xf0;
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;
LCD_SCLK=1;
i_dat=i_dat<<1;
}
LCD_CS=0;
delay(10);
}
void LCD_INIT()
{
LCD_PSB=0; //串行方式操作
send_cmd(0x30); //基本指令操作
delay(5);
send_cmd(0x0c); //显示开,关游标,游标位置反白禁止
delay(5);
send_cmd(0x06); //光标右移,整体显示不移动
delay(5);
send_cmd(0x01); //清除LCD显示内容
delay(5);
}
uchar getkey()
{
unsigned char row,col,k;
for(row=0;row<4;row++) //行值依次为0xfe, 0xfd, 0xfb, 0xf7 {
P2=~(1<<row);
k=0x10;
for(col=0;col<4;col++) //列值扫描
{
if(!(P2&k)) //如果有键按下
return (row*4+col); //返回按键位置
k<<=1;
}
}
return 99; //无键按下返回99
}
void key_dispos() //按键处理并显示程序
{
display(); //显示第一行和初始键值
keynum=getkey(); //获取键值
if(keynum<10) //
{
dis_buf[1]=dis_buf[0]; //第一个键值移位显示
dis_buf[0]=keynum; //获得第二个键值
display(); //显示改变后的键值
while(keynum<10) //松手检测
{
keynum=getkey();
}
}
}
void main()
{
P1=0xff;
LCD_INIT();
while(1)
{
key_dispos();
}
}
void display()
{
uint i;
send_cmd(0x80); //第一行显示
i=0;
while(dis1[i]!='\0')
{
send_dat(dis1[i]);
i++;
}
send_cmd(0x90); //第二行显示数据
send_dat(dis2[dis_buf[1]]);
send_dat(dis2[dis_buf[0]]);
}。

相关文档
最新文档