LCD12864显示矩阵键盘输入的任意两位数
基于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显示矩阵键盘输入的任意两位数

#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

/**************************************************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时钟毕业设计带矩阵键盘

第一章方案论证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显示简单计算器

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转换器、直流稳压电路、功率集成电路及时基电路。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]]);
}。