单片机按键加减报告
- 格式:docx
- 大小:203.30 KB
- 文档页数:8
第1篇一、实验目的1. 理解按键输入的基本原理。
2. 掌握C语言编程中按键扫描和响应的实现方法。
3. 实现基于按键输入的加减功能,并能够查询结果。
二、实验环境1. 开发工具:Keil uVision52. 实验平台:STM32F103系列单片机开发板3. 外设:按键模块三、实验原理1. 按键扫描原理:通过查询或中断方式检测按键是否被按下,并判断是哪个按键被按下。
2. 单片机编程:使用C语言编写程序,实现对按键的扫描和加减功能的实现。
四、实验步骤1. 准备实验环境,连接按键模块到单片机开发板上。
2. 编写按键扫描函数,实现按键的检测和识别。
3. 编写加减功能函数,实现加法和减法运算。
4. 编写主函数,实现按键输入和结果显示。
五、实验代码```cinclude "stm32f10x.h"// 按键定义define KEY_ADD GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) // PA0define KEY_SUB GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) // PA1// 全局变量volatile int result = 0;// 按键扫描函数void KeyScan(void) {if (KEY_ADD == 0) {while (KEY_ADD == 0); // 防抖动 result += 1;}if (KEY_SUB == 0) {while (KEY_SUB == 0); // 防抖动 result -= 1;}}// 加减功能函数void AddSub(void) {KeyScan();// 显示结果// ... (此处省略显示代码)}// 主函数int main(void) {// 初始化GPIO// ... (此处省略初始化代码)while (1) {AddSub();}}```六、实验结果与分析1. 实验结果:通过按键输入,可以实现对数字的加减操作,并实时显示结果。
first_ge equ 60h ;伪指令first_shi equ 61hsecond_ge equ 62hsecond_shi equ 63hresult_ge equ 64hresult_shi equ 65hresult_bai equ 66hresult_qian equ 67hal equ 68hp_can bit 40hc_can bit 41hover bit 42horg 0000hljmp startorg 0050hstart:mov first_ge,#0mov first_shi,#0mov second_ge,#0mov second_shi,#0mov al,#5mov result_ge,#0mov result_shi,#0mov result_bai,#0mov result_qian,#0mov 45h,#0mov 46h,#0mov 35h,#0mov 36h,#0mov 37h,#0mov 38h,#0clr p_canclr c_canclr overmov 10h,#0main: lcall xianshimov p0,#0f0hmov a,p0cjne a,#0f0h,next ;判断是否有键按下ljmp mainnext: lcall delay ;延时去斗mov p0,#0f0hmov a,p0cjne a,#0f0h,key_num ;确定有键按下ljmp mainlcall xianshikey_num:mov p0,#0f0h ;取键值mov a,p0mov 20h,amov p0,#0fhmov a,p0add a,20hmov 10h,await: mov P0,#0f0h ;等键放开mov a,P0cjne a,#0f0h,waitmov a,10hlcall displaylcall xianshiljmp main;============================== display: ;判断键值cjne a,#0eeh,next1ljmp display0next1:cjne a,#0edh,next2ljmp display1next2:cjne a,#0ebh,next3ljmp display2next3:cjne a,#0e7h,next4ljmp display3next4:cjne a,#0deh,next5ljmp display4next5:cjne a,#0ddh,next6ljmp display5next6:cjne a,#0dbh,next7ljmp display6next7:cjne a,#0d7h,next8ljmp display7next8:cjne a,#0beh,next9ljmp display8next9:cjne a,#0bdh,nextaljmp display9nexta:cjne a,#0bbh,nextbljmp displayanextb:cjne a,#0b7h,nextcljmp displaybnextc:cjne a,#7eh,nextdljmp displaycnextd:cjne a,#7dh,nexteljmp displaydnexte:cjne a,#7bh,nextfljmp displayenextf:cjne a,#77h,wrongljmp displayfwrong:ret;===================================display0: ;1jb c_can,d_0_0jb p_can,d_0_1mov first_ge,#1setb p_canretd_0_1: mov 61h , 60hmov 60h,#1retd_0_0:jb p_can,d_0_2mov second_ge,#1setb p_canretd_0_2:mov 63h , 62hmov 62h,#1retdisplay1: ;4jb c_can,d_1_0jb p_can,d_1_1mov first_ge,#4setb p_canretd_1_1: mov 61h , 60hmov 60h,#4retd_1_0:jb p_can,d_1_2mov second_ge ,#4setb p_canretd_1_2: mov 63h , 62hmov 62h,#4retdisplay2: ;7jb c_can,d_2_0jb p_can,d_2_1mov first_ge,#7setb p_canretd_2_1: mov 61h , 60hmov 60h,#7retd_2_0:jb p_can,d_2_2mov second_ge,#7setb p_canretd_2_2:mov 63h , 62hmov 62h,#7setb p_canretdisplay3: ;clrmov first_ge,#0mov first_shi,#0mov second_ge,#0mov second_shi,#0mov al,#5mov result_ge,#0mov result_shi,#0mov result_bai,#0mov result_qian,#0mov 45h,#0mov 46h,#0mov 35h,#0mov 36h,#0mov 37h,#0mov 38h,#0clr p_canclr c_canclr overmov 10h,#0retdisplay4: ;2jb c_can,d_4_0jb p_can,d_4_1mov first_ge,#2setb p_canretd_4_1: mov 61h , 60hmov 60h,#2retd_4_0:jb p_can,d_4_2mov second_ge,#2setb p_canretd_4_2:mov 63h , 62hmov 62h,#2setb p_canretdisplay5: ;5jb c_can,d_5_0jb p_can,d_5_1mov first_ge,#5setb p_canretd_5_1: mov 61h , 60hmov 60h,#5retd_5_0: jb p_can,d_5_2mov second_ge,#5setb p_canretd_5_2:mov 63h , 62hmov 62h,#5setb p_canretdisplay6: ;8jb c_can,d_6_0jb p_can,d_6_1mov first_ge,#8setb p_canretd_6_1: mov 61h , 60hmov 60h,#8retd_6_0:jb p_can,d_6_2mov second_ge,#8setb p_canretmov 62h,#8setb p_canretdisplay7: ;0jb c_can,d_7_0jb p_can,d_7_1mov first_ge,#0setb p_canretd_7_1: mov 61h , 60hmov 60h,#0retd_7_0:jb p_can,d_7_2mov second_ge,#0setb p_canretd_7_2:mov 63h , 62hmov 62h,#0setb p_canretdisplay8: ;3jb c_can,d_8_0jb p_can,d_8_1mov first_ge,#3setb p_canretd_8_1: mov 61h , 60hmov 60h,#3retd_8_0:jb p_can,d_8_2mov second_ge,#3setb p_canretd_8_2:mov 63h , 62hmov 62h,#3setb p_canretdisplay9: ;6jb c_can,d_9_0jb p_can,d_9_1mov first_ge,#6setb p_canretmov 60h,#6retd_9_0:jb p_can,d_9_2mov second_ge,#6setb p_canretd_9_2:mov 63h , 62hmov 62h,#6setb p_canretdisplaya: ;9jb c_can,d_a_0jb p_can,d_a_1mov first_ge,#9setb p_canretd_a_1: mov 61h , 60hmov 60h,#9retd_a_0:jb p_can,d_a_2mov second_ge,#9setb p_canretd_a_2:mov 63h , 62hmov 62h,#9setb p_canretdisplayb: ;=setb overmov a,al;````````````````cjne a,#0,d_b_0 ;加法程序mov a,first_shiswap aorl a,first_gemov 45h,amov a,second_shiswap aorl a,second_geadd a,45hda ajnc bai_no_addmov result_bai,#1bai_no_add:mov 46h,aanl a,#0fhmov result_ge,amov a,46hanl a,#0f0hswap amov result_shi,aret;``````````````````````````````d_b_0:cjne a,#1,d_b_1 ;减法程序mov a,first_shiswap aorl a,first_gemov 45h,amov a,second_shiswap aorl a,second_gemov 46h,amov a,#9ah ;取补码9ahsubb a,46hadd a,45hda amov 46h,aanl a,#0fhmov result_ge,amov a,46hanl a,#0f0hswap amov result_shi,aret;``````````````````d_b_1:cjne a,#2,tiao ;乘法程序sjmp chengtiao:ljmp d_b_2;-----------------;十进制个位与个位相乘cheng:mov a,first_gemov b,second_gemul ab ;结果不大于81,存放于a中mov b,#10div ab ;十位数存于a,个位数存于bmov result_ge,b ;求出个位数mov 35h,a ;存十位寄35h;-----------------;个位与十位相乘mov a,first_shimov b,second_gemul abmov b,#10div abmov 36h,a ; 存百位寄存36hmov a,badd a,35hmov 35h,a ;clr csubb a,#10jc bai_no_jin_1inc 36h;如有进位,加一mov 35h,abai_no_jin_1:mov a,36hclr csubb a,#10jc qian_no_jin_1inc 37hmov 36h,aqian_no_jin_1: ;----------------------;十位与个位相乘mov a,first_gemov b,second_shimul abmov b,#10div abmov 33h,a ;结果寄放clr cmov a,badd a,35hmov 35h,a ;十位处理clr csubb a,#10jc bai_no_jin_2inc 36hmov 35h,abai_no_jin_2:mov a,33hadd a,36hmov 36h,a ;百位处理clr csubb a,#10 ;千位处理jc qian_no_jin_2inc 37hmov 36h,aqian_no_jin_2:;--------------------------;十位与十位相乘mov a,first_shimov b,second_shimul abmov b,#10div abmov 33h,aclr cmov a,badd a,36hmov 36h,aclr csubb a,#10jc qian_no_jin_3inc 37hmov 36h,aqian_no_jin_3:mov a,33hadd a,37hmov 37h,a ;--mov result_shi,35hmov result_bai,36hmov result_qian,37hret;```````````````````````````d_b_2:cjne a,#3,d_b_3 ;除法程序mov a,first_shiswap aorl a,first_gemov 45h,a ;第一个bcd码数字存放mov a,second_shiswap aorl a,second_gemov 46h,a ;第二个bcd码数字存放recom:mov a,45hclr csubb a,46hjc xiaomov a,#9ahsubb a,46hadd a,45hda amov 45h,ainc 38hjmp recomxiao:mov a,38hmov b,#10div abmov result_shi,amov result_ge,bret;d_b_3:retdisplayc: ;+mov al,#0setb c_canclr p_canretdisplayd: ;-mov al,#1setb c_canclr p_canretdisplaye: ;*mov al,#2setb c_canclr p_canretdisplayf: ;/mov al,#3setb c_canclr p_canret;========================delay:mov r7,#10loop0:mov r6,#08fhloop1:djnz r6,loop1djnz r7,loop0ret ;===================================xianshi:mov dptr,#TABjb over,over_loopjb c_can,c_loopmov a,first_ge ;显示第一个数movc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhret;-----------------------;显示第二个数c_loop:mov a,second_gemovc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmov a,second_shimovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhretover_loop: ;显示运算结果mov a,result_gemovc a,@a+dptrmov P1,amov P2,#0fehlcall delaymov P1,#0ffhmov P2,#0ffhmov a,result_shimovc a,@a+dptrmov P1,amov P2,#0fdhlcall delaymov P1,#0ffhmov P2,#0ffhmov a,result_baimovc a,@a+dptrmov P1,amov P2,#0fbhlcall delaymov P2,#0ffhmov a,result_qianmovc a,@a+dptrmov P1,amov P2,#0f7hlcall delaymov P1,#0ffhmov P2,#0ffhretTAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4, DB 92H,82H,0F8H,80H,90H ;5,6,7,8,9,DB 88H,83H,0C6H,0A1H,86H ;A,B,C,D,E,DB 8EH;f。
实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。
按其它键退出。
2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。
可定义“A”键为“+”键,“B”键为“=”键。
二、实验目的1、学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
三、实验说明1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。
在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。
实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。
本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。
具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。
程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。
在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。
在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。
同时,计算器还具有清零、退格等功能,方便用户进行操作。
总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。
同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。
实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。
按其它键退出。
2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。
可定义“A”键为“+”键,“B”键为“=”键。
二、实验目的1、学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
三、实验说明1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
单片机实验报告一、实验目的1、学习利用单片机设计简单加减计数,并学会定时/计数器T0/T1的使用.2、学习使用keil和proteus软件.3、熟悉汇编语言并能利用汇编语言编写程序.二、实验思路用T0、T1设计10位以内的按键加减计数:利用T0/T1计数功能实现每次按键的中断,且采用方式2,可以自动重载初值,较为方便.这里不考虑优先级的问题.再分别对T0、T1编写中断处理的程序.要注意的是,加法时, 9加1显示0的情况;减法时,0减1显示9的情况.三、实验原理〔以下不考虑T2的情况〕1、中断的概念CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理〔中断发生〕;CPU暂时中断当前的工作,转去处理事件B〔中断响应和中断服务〕;待CPU 将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A〔中断返回〕,这一过程称为中断.2、定时/计数器(1)中断控制寄存器〔TCON〕TCON的高4位用于控制定时/计数器的启动和中断申请.其格式如下:TF1<TCON.7>:T1溢出中断请求标志位.T1计数溢出时由硬件自动置TF1为1.CPU响应中断后TF1由硬件自动清0.T1工作时,CPU可随时查询TF1的状态.所以,TF1可用作查询测试的标志.TF1也可以用软件置1或清0,同硬件置1或清0的效果一样.TR1<TCON.6>:T1运行控制位.TR1置1时,T1开始工作;TR1置0时,T1停止工作.TR1由软件置1或清0.所以,用软件可控制定时/计数器的启动与停止.TF0<TCON.5>:T0溢出中断请求标志位,其功能与TF1类同.TR0<TCON.4>:T0运行控制位,其功能与TR1类同.本次试验要用到T0、T1,即TR0、TR1置1.(2)中断允许控制〔IE〕EX0<IE.0>,外部中断0允许位;ET0<IE.1>,定时/计数器T0中断允许位;EX1<IE.2>,外部中断1允许位;ET1<IE.3>,定时/计数器T1中断允许位;ES<IE.4>,串行口中断允许位;EA <IE.7>,CPU中断允许〔总允许〕位.以上都是为1时开启,为0时关闭.本次试验需要开启EA、ET1、ET0,即令IE 为8AH.(3)工作方式寄存器TMODGATE:门控位.GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作.C/T:定时/计数模式选择位.C/T=0为定时模式;C/T =1为计数模式.M1M0:工作方式设置位.定时/计数器有四种工作方式,由M1M0进行设置.这次试验需要计数模式且为方式二,所以,TMOD值设为66H.3、数码管在这里我们使用的是7SEG-COM-AN-GRN数码管,由7个发光管组成的8字形构成的,如下图所示,左边接线顺序下来分别命名为ABCDEFG数码管的接线为共阳接法,即低电平亮,高电平灭.实验中用P0.0-P0.6控制数码管的7段,P0口的八位与发光管的对应关系见下表所示.显示P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0HEX——G F E D C B A 0 0 1 0 0 0 0 0 0 40H 1 0 1 1 1 1 0 0 1 79H 2 0 0 1 0 0 1 0 0 24H 3 0 0 1 1 0 0 0 0 30H 4 0 0 0 1 1 0 0 1 19H 5 0 0 0 1 0 0 1 0 12H 6 0 0 0 0 0 0 1 0 02H 7 0 1 1 1 1 0 0 0 78H 8 0 0 0 0 0 0 0 0 00H 91118H四、设计流程N YYNYN<a>主程序 <b>中断响应 五、原理图存数寄存器初始化 中断初始化 开始 数码管显示等待中断按键扫描R0置0是否为加法R0是否为9R0是否为0R0加1R0加1 R0减1 中断返回运行后,初始如上图所示,当按一下第一个键时,数码管显示1,此后每按一次数码管显示数值加1,当数码管显示为9时,按下第一个键,显示为0;初始状态下,当按下第二个键时,数码管显示9,此后每按一次第二个键,数码管显示数值减1.说明实验成功六、汇编程序ORG 0000HJMP MAINORG 000BH //T0〔加法〕中断入口JMP T0_ADDORG 001BH //T1〔减法〕中断入口JMP T1_SUBMAIN: //主程序MOV TMOD,#66H //设置T1、T0方式2计数MOV TL1,#0FFH //为T1、T0设置初值MOV TH1,#0FFHMOV TL0,#0FFHMOV TH0,#0FFHMOV IE,#8AH //CPU、T0、T1开启中断SETB TR1 //启动T1计数器SETB TR0 //启动T0计数器MOV R0,#0 //设置显示的初始值与其地址MOV DPTR,#TABLOOP:MOV A,R0 //输出显示数值MOVC A,A+DPTRMOV P0,ASJMP LOOP //等待中断T0_ADD:CJNE R0,#9,T_END0 //是否需要进位MOV R0,#0RETIT1_SUB:CJNE R0,#0,T_END1 //是否需要借位MOV R0,#9RETIT_END0:INC R0 //加1RETIT_END1:DEC R0 //减1RETITAB: //选择0-9的输出DB 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18END七、小结这次实验中,我进一步加深了对单片机与其应用的了解.通过查找资料和老师的帮助,进一步熟练了对keil和proteus软件的操作.在编写程序的过程中也遇到了一些问题,一些语句的使用不够熟练,但现在对它们有了更深的记忆.在编写程序的过程中,我加深了对中断概念和对计数器工作原理的理解.同时,感受了设计程序的流程,为以后的实验积累了一定经验.。
单片机实验五报告_单片机键盘实验一、实验目的本次单片机键盘实验的主要目的是让我们深入了解单片机与键盘的接口技术,掌握如何通过编程实现对键盘输入的检测和响应,从而提高我们在单片机应用开发中的实际操作能力。
二、实验原理在单片机系统中,键盘通常是作为输入设备使用的。
常见的键盘有独立式键盘和矩阵式键盘两种类型。
独立式键盘是每个按键单独占用一根 I/O 线,其优点是电路简单,编程容易,但缺点是占用较多的 I/O 口资源。
矩阵式键盘则是将按键排列成矩阵形式,通过行线和列线的交叉来识别按键。
这种方式可以有效地节省 I/O 口资源,但电路和编程相对复杂一些。
在本次实验中,我们采用了矩阵式键盘。
其工作原理是通过逐行扫描或者逐列扫描的方式,检测行线和列线的电平状态,从而确定按下的按键。
三、实验设备及材料1、单片机开发板一块2、计算机一台3、编程软件(如 Keil C51)4、下载工具(如 STCISP)四、实验步骤1、硬件连接将矩阵式键盘与单片机的 I/O 口进行连接,注意行线和列线的对应关系。
连接好电源和地线,确保硬件电路正常工作。
2、软件编程打开编程软件,创建一个新的工程。
编写初始化程序,包括设置 I/O 口的工作模式、中断等。
编写键盘扫描程序,通过循环扫描行线和列线的电平状态,判断是否有按键按下。
当检测到按键按下时,根据按键的编码执行相应的操作,如在数码管上显示按键值、控制 LED 灯的亮灭等。
3、编译和下载对编写好的程序进行编译,检查是否有语法错误。
如果编译成功,使用下载工具将程序下载到单片机中。
4、实验调试观察硬件电路的工作状态,看是否有异常现象。
按下不同的按键,检查程序的响应是否正确。
如果出现问题,通过调试工具(如单步调试、断点调试等)查找并解决问题。
五、实验代码以下是本次实验的部分关键代码:```cinclude <reg51h>//定义键盘的行和列define ROW_NUM 4define COL_NUM 4//定义行线和列线的端口sbit ROW1 = P1^0;sbit ROW2 = P1^1;sbit ROW3 = P1^2;sbit ROW4 = P1^3;sbit COL1 = P1^4;sbit COL2 = P1^5;sbit COL3 = P1^6;sbit COL4 = P1^7;//定义按键值的编码unsigned char code KeyCodeMapROW_NUMCOL_NUM ={{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'','0','','D'}};//键盘扫描函数void KeyScan(){unsigned char i, j, temp;unsigned char keyValue = 0;//逐行扫描for (i = 0; i < ROW_NUM; i++){//先将所有行线置高电平ROW1 = ROW2 = ROW3 = ROW4 = 1;//将当前行线置低电平switch (i){case 0: ROW1 = 0; break;case 1: ROW2 = 0; break;case 2: ROW3 = 0; break;case 3: ROW4 = 0; break;}//读取列线的电平状态temp = COL1 | COL2 | COL3 | COL4;//如果有列线为低电平,则表示有按键按下if (temp!= 0xF0){//延迟去抖动delay_ms(10);//再次读取列线的电平状态temp = COL1 | COL2 | COL3 | COL4; if (temp!= 0xF0){//确定按下的按键for (j = 0; j < COL_NUM; j++){if ((temp &(1 << j))== 0){keyValue = KeyCodeMapij;break;}}//执行相应的操作switch (keyValue){case '1'://具体操作break;case '2':break;//其他按键的操作}}}}}//主函数void main(){while (1){KeyScan();}}```六、实验结果及分析在实验过程中,我们成功地实现了对矩阵式键盘的输入检测,并能够根据不同的按键执行相应的操作。
PIC之闪烁显示及按键的串键加减实验实验环境: Proteus编程语言:汇编编程环境: MPLAB单片机:PIC16F877晶振:20MHz功能说明:该实验旨在对按键调试过程中的闪烁显示和串键加减进行研究和实验,如图所示.主体显示采用的是定时器定时的数字时钟,为防止误按加减而导致时钟数据的改变,采用了两级锁定的方式,首先要按下总键,按一次进入分钟调试,两次为小时,第三次退出按键模式.在按键调试模式下,还要按移位键才能对分钟或小时进行加减,按下移位键后(可通过它选择是对十位调节还是对个位调节),选中的位会闪烁显示,然后才可通过加减键对数值进行调节.长按加减键半秒以上可实现连加连减.图(1)无按键显示图图(2)按移位键后的闪烁显示,上图为个位闪烁,下图(3)为十位闪烁图(3)部分源程序:;*******************ORG 0X0000GOTO MAINORG 0X0004MOVWF BWSW APF STA TUS,0CLRF STA TUSMOVWF BSTA TUSMOVF FSR,0MOVWF BFSRMOVF PCLA TH,0MOVWF BPCH;***************************以上是中断现场保护CLRF PCLA THBTFSS INTCON,5GOTO INTOUTBTFSC INTCON,2GOTO T0INT;******************以上是中断源判别INTOUT: CLRF STA TUSMOVF BFSR,0MOVWF FSRMOVF BPCH,0MOVWF PCLA THSW APF BSTA TUS,0MOVWF STA TUSSW APF BW,1SW APF BW,0RETFIE;***********************************以上是中断现场恢复T0INT: BCF INTCON,2MOVLW 0X14MOVWF TMR0INCF T01MMOVLW .20;1ms刷新一次显示XORWF T01M,0BTFSS STA TUS,ZGOTO INTOUTCLRF T01MCLRF PORTDMOVLW .8SUBWF DSPC,0;DSPC起到显示指针的作用BTFSC STA TUS,CCLRF DSPCMOVF DSPC,0ADDLW DIS0MOVWF FSRBTFSC FLAG1,6;移位标志BTFSS FLAG1,5;闪烁标志GOTO NSHFTMOVLW .5BTFSC FLAG1,1MOVLW .2MOVWF SHIFT1MOVF SHIFT,0BTFSC STA TUS,ZGOTO NSHFTSUBWF SHIFT1,0XORWF DSPC,0BTFSS STA TUS,ZGOTO NSHFTCLRF ICOMMOVLW ICOMMOVWF FSRNSHFT: MOVLW H'E8'ANDWF PORTAMOVF DSPC,0IORWF PORTAMOVF INDF,0MOVWF PORTDINCF DSPCDECFSZ T020MGOTO INTOUTMOVLW .23MOVWF T020MBSF FLAG1,7DECFSZ T01SGOTO INTOUTMOVLW .39MOVWF T01SINCF SECONDMOVLW .60XORWF SECOND,0BTFSS STA TUS,ZGOTO INTOUTCLRF SECONDINCF MINUTEMOVLW .60XORWF MINUTE,0BTFSS STA TUS,ZGOTO INTOUTCLRF MINUTEINCF HOURMOVLW .24XORWF HOUR,0BTFSS STA TUS,ZGOTO INTOUTCLRF HOURGOTO INTOUT;************************************************* MAIN: CALL INITGOTO KEYSCAN;*******待分解数据在com0中,显示单元在FSR中******** LEDS: SW APF COM0,0ANDLW H'0F'CALL LEDDISMOVWF INDFINCF FSRMOVF COM0,0ANDLW H'0F'CALL LEDDISMOVWF INDFINCF FSRRETURN;***********************************************LEDDIS: ADDWF PCLDT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6FDT 0X77,0X7C,0X39,0X5E,0X79,0X71;****************************;************除十,被除数存入com3,出口:com3为商,com5为余数DIV10: MOVLW D'10'MOVWF COM4CLRF COM5MOVLW D'8'MOVWF COM6DIV101: BCF STA TUS,CRLF COM3RLF COM5BSF COM3,0MOVF COM4,0SUBWF COM5BTFSS STA TUS,CCALL ADDDECFSZ COM6GOTO DIV101RETURNADD: MOVF COM4,0ADDWF COM5BCF COM3,0RETURN;********************************************************** MUL10: MOVF COM3,0;八位乘10MOVWF COM4BCF STA TUS,CRLF COM3RLF COM3RLF COM3RLF COM4,0ADDWF COM3,0RETURNKEYSCAN:BTFSS FLAG1,7GOTO DISBCF FLAG1,7;定时20msGOTO $+9INCF T0SHMOVLW .15XORWF T0SH,0;BTFSS STA TUS,ZGOTO $+4CLRF T0SHMOVLW H'20'XORWF FLAG1;每隔半秒左右取反flag1,5MOVF PORTB,0ANDLW H'F0'XORLW H'F0'BTFSC STA TUS,Z;判断是否有键按下GOTO NKEYMOVWF KEYCOM0INCF KEYCMOVLW .30XORWF KEYC,0BTFSS STA TUS,ZGOTO DISCLRF KEYC;按键计时单元BTFSC KEYCOM0,KEY2GOTO KADDBTFSC KEYCOM0,KEY3GOTO KSUBGOTO DISNKEY: CLRF KEYCBTFSC KEYCOM0,KEY0GOTO KSETBTFSC KEYCOM0,KEY1GOTO SHFTBTFSC KEYCOM0,KEY2GOTO KADDBTFSS KEYCOM0,KEY3GOTO DISKSUB: BTFSC FLAG1,0BTFSS FLAG1,6GOTO KOUTMOVLW MINUTEBTFSC FLAG1,1MOVLW HOURMOVWF FSRMOVLW .1MOVLW .10SUBWF INDFMOVLW .59BTFSC FLAG1,1MOVLW .23BTFSC INDF,7;无论哪个键按下,处理后都要清KEYCOM0键值寄存器MOVWF INDFGOTO KOUTKSET: BTFSC FLAG1,0GOTO KSET1BSF FLAG1,0GOTO KOUTKSET1: INCF FLAG1BSF FLAG1,0CLRF SHIFTBTFSC FLAG1,2CLRF FLAG1GOTO KOUTSHFT: BTFSS FLAG1,0GOTO KOUTINCF SHIFTMOVLW .3SUBWF SHIFT,0BTFSS STA TUS,CGOTO $+3MOVLW .1MOVWF SHIFTBSF FLAG1,6GOTO KOUTKADD: BTFSC FLAG1,0BTFSS FLAG1,6GOTO KOUTMOVLW MINUTEBTFSC FLAG1,1MOVLW HOURMOVWF FSRMOVLW .1BTFSC SHIFT,1MOVLW .10ADDWF INDFMOVLW .60BTFSC FLAG1,1MOVLW .24BTFSC STA TUS,CCLRF INDFGOTO KOUTKOUT: CLRF KEYCOM0DIS: MOVF SECOND,0MOVWF COM3CALL DIV10MOVF COM5,0CALL LEDDISMOVWF DIS7MOVF COM3,0CALL LEDDISMOVWF DIS6MOVF MINUTE,0MOVWF COM3CALL DIV10MOVF COM5,0CALL LEDDISMOVWF DIS4MOVF COM3,0CALL LEDDISMOVWF DIS3MOVF HOUR,0MOVWF COM3CALL DIV10MOVF COM5,0CALL LEDDISMOVWF DIS1MOVF COM3,0CALL LEDDISMOVWF DIS0GOTO KEYSCANINIT: CLRF INTCON;初始化函数CLRF PIR1CLRF PIR2CLRF FLAG1CLRF FLAG2MOVLW .1MOVWF T01SMOVWF T020MMOVWF T0TMMOVWF T01MBANKSEL TRISACLRF PIE1CLRF PIE2MOVLW H'F0'MOVWF TRISBCLRF TRISACLRF TRISDMOVLW H'0F'MOVWF OPTION_REGBANKSEL PORTAMOVLW H'06'MOVWF DIS0MOVLW H'66'MOVWF DIS1MOVLW H'40'MOVWF DIS5MOVWF DIS2MOVLW H'7F'MOVWF DIS4MOVLW H'6D'MOVWF DIS3MOVLW H'4F'MOVWF DIS6MOVLW H'3F'MOVWF DIS7MOVLW .14MOVWF HOURMOVLW .58MOVWF MINUTEMOVLW .30MOVWF SECONDMOVLW H'14'MOVWF TMR0MOVLW H'E0'MOVWF INTCONRETURNEND。
北方民族大学电子制作报告学院电气信息工程专业测控技术与仪器班级测控一班课程名称数字电子技术设计题目名称按键式加减计数器组长姓名及学号余金权 20120425组员姓名及学号马涛 20120399 李波 20120382 许鑫凯 20120422 顾磊 20120377 马俊 20120395 起止时间2013年11月17号至 2013年12月30号北方民族大学电气信息工程学院制摘要计数器是数字电路中最为基本的一个单元电路。
本次实验的目标是要我们参考资料设计一个十进制按键式加减计数器,学会利用软件(Proteus)对电路进行仿真,并会简单的dxp制板操作。
实验报告简要地陈述了电路结构,然后就对其有关理论知识作了一些简要的介绍,设计出整体电路图并且在软件Proteus中进行仿真,最后通过protel 做出电路板验证是否达到技术要求,总结实验体会。
关键字:计数器,脉冲,按键式目录1.设计任务与要求 (1)2.参考电路及完善 (2)2.1参考电路 (2)2.2完善的电路图 (3)3.电路原理 (4)3.1脉冲发生电路 (4)3.2加减计数器电路 (7)3.3时间显示电路 (8)4.Proteus仿真 (9)5.制板与调试 (10)5.1DXP注意事项 (10)5.2制作PCB板的流程 (11)5.3注意事项 (11)5.4调试结果与分析 (12)6.实验总结 (12)1.设计任务及要求1.1设计任务用一个拨动开关控制加减,用按键或一个秒脉冲发生器来产生时钟脉冲,当开关拨动到加时,按键实现加计数,当开关拨动到减时,按键实现减计数。
该设计包括秒脉冲发生器电路(或按键)、计数器加减控制、显示译码器和数码管4个部分。
通过一个开关来控制加减计数控制,通过按键来实现加减计数。
显示译码器驱动数码显示对应时间,秒脉冲电路给计数器提供时钟脉冲。
1.2设计要求(1)要做出multisim或proteus仿真图。
(2)要做出protel原理图和PCB图,设置最小线宽及线间距大于等于8mil (0.2mm),焊盘内径为20mil-40mil(0.6-1mm),焊盘外径大于等于60mil (1.5mm)。
单片机实验一一、实验目的1.学习多字节压缩BCD 码加减法运算的程序设计;2.学习单字节有符号数加减运算的程序设计。
二、实验设备统一电子开发平台三、实验要求1.编写通用4 字节压缩BCD 码的加、减法运算程序;2.编写通用单字节有符号二进制数加、减法运算程序;四、实验原理对于简单的8 位加减可以直接调用指令就可以了。
例如加法可以使用指令ADD 以及带进位加ADDC,但单字节加减法只能在256 之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数据。
该实验介绍单片机BCD 码多字节加、减运算通用程序的设计。
1.多字节无符号压缩BCD 码加法运算假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计算结果的地址于被加数相同。
◆入口参数:R0:被加数地址指针;R1:加数地址指针;len:字节数。
◆出口参数:@R0:计算结果;rLen:计算结果字节数。
◆使用资源:ACC,R0、R1,内部RAM 单元len、rlen 及存放被加数、加数、计算结果的内存单元。
示例程序如下:;多字节无符号压缩BCD 码加法运算rlen data 30h; 存放计算结果字节数len data 31h; 存放相加字节数; r0 定位40h,r1 定位50h; 此处的程序的问题是前面字节的进位没有处理,; 只是对最后字节相加处理了进位ORG 0000h;ADDl: PUSH PSW ;保护标志寄存器内容CLR C ;进位位清0MOV rlen,#00H ;和的字节数先清0ADD: MOV A,@R0 ;取被加数ADD A,@R1 ;求和DA A ;十进制调整MOV @R0,A ;保存INC R0 ;地址增1INC R1INC rlen ;字节数增1DJNZ len,ADD ;所有字节未加完继续,否则向下执行JNC ADD20 ;和的最高字节无进位转ADD20MOV @R0,#01H ;和的最高字节地址内容为01HINC rlenADD20: POP PSWRETEND多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD 码,最大不超过99,而99+99+1(进位)=199,此时不需要使用ADDC 指令,但当两字节当最低两字节相加后,必须使用“DA A”进行十进制调整,调整后产生进位。
单片机按键加减报告
单片机实验报告
一、实验目的
1、学习利用单片机设计简单加减计数,并学会定时/计数器T0/T1的使用。
2、学习使用keil和proteus软件。
3、熟悉汇编语言并能利用汇编语言编写程序。
二、实验思路
用T0、T1设计10位以内的按键加减计数:
利用T0/T1计数功能实现每次按键的中断,且采用方式2,可以自动重载初值,较为方便。
这里不考虑优先级的问题。
再分别对T0、T1编写中断处理的程序。
要注意的是,加法时, 9加1显示0的情况;减法时,0减1显示9的情况。
三、实验原理
(以下不考虑T2的情况)
1、中断的概念
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU 将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。
2、定时/计数器
(1)中断控制寄存器(TCON)
TCON的高4位用于控制定时/计数器的启动和中断申请。
其格式如下:
TF1(TCON.7):T1溢出中断请求标志位。
T1计数溢出时由硬件自动置TF1为1。
CPU响应中断后TF1由硬件自动清0。
T1工作时,CPU可随时查询TF1的状态。
所以,TF1可用作查询测试的标志。
TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。
TR1置1时,T1开始工作;TR1置0时,T1停止工作。
TR1由软件置1或清0。
所以,用软件可控制定时/计数器的启动与
停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。
本次试验要用到T0、T1,即TR0、TR1置1。
(2)中断允许控制(IE)
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断1允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7),CPU中断允许(总允许)位。
以上都是为1时开启,为0时关闭。
本次试验需要开启EA、ET1、ET0,即令IE为8AH。
(3)工作方式寄存器TMOD
GATE:门控位。
GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。
C/T:定时/计数模式选择位。
C/T=0为定时模式;C/T =1为计数模式。
M1M0:工作方式设置位。
定时/计数器有四种工作方式,由M1M0进行设置。
这次试验需要计数模式且为方式二,所以,TMOD值设为66H。
3、数码管
在这里我们使用的是7SEG-COM-AN-GRN数码管,由7个发光管组成的8字形构成的,如下图所示,左边接线顺序下来分别命名为ABCDEFG
数码管的接线为共阳接法,即低电平亮,高电平灭。
实验中用P0.0-P0.6
控制数码管的7段,P0口的八位与发光管的对应关系见下表所示。
显示P0.
7
P0.
6
P0.
5
P0.
4
P0.
3
P0.
2
P0.
1
P0.
0 HE
X —
—
G F E D C B A
0 0 1 0 0 0 0 0 0 40H
1 0 1 1 1 1 0 0 1 79H
2 0 0 1 0 0 1 0 0 24H
3 0 0 1 1 0 0 0 0 30H
4 0 0 0 1 1 0 0 1 19H
5 0 0 0 1 0 0 1 0 12H
6 0 0 0 0 0 0 1 0 02H
7 0 1 1 1 1 0 0 0 78H
8 0 0 0 0 0 0 0 0 00H
9 0 0 0 1 1 0 0 0 18H
四、设计流程
N
Y
Y
N Y N
(a)主程序 (b)中断响应
五、原理图
存数寄
存器
中断初
开始
数码管
等待中
按键
R0
是否为加法
R0是否为9
R0是否为0
R0
R0
R0
中断
运行后,初始如上图所示,当按一下第一个键时,数码管显示1,此后每按一次数码管显示数值加1,当数码管显示为9时,按下第一个键,显示为0;初始状态下,当按下第二个键时,数码管显示9,此后每按一次第二个键,数码管显示数值减1。
说明实验成功
六、汇编程序
ORG 0000H
JMP MAIN
ORG 000BH //T0(加法)中断入口
JMP T0_ADD
ORG 001BH //T1(减法)中断入口
JMP T1_SUB
MAIN: //主程序
MOV TMOD,#66H //设置T1、T0方式2计数
MOV TL1,#0FFH //为T1、T0设置初值
MOV TH1,#0FFH
MOV TL0,#0FFH
MOV TH0,#0FFH
MOV IE,#8AH //CPU、T0、T1开启中断
SETB TR1 //启动T1计数器
SETB TR0 //启动T0计数器
MOV R0,#0 //设置显示的初始值及其地址
MOV DPTR,#TAB
LOOP:
MOV A,R0 //输出显示数值
MOVC A,@A+DPTR
MOV P0,A
SJMP LOOP //等待中断
T0_ADD:
CJNE R0,#9,T_END0 //是否需要进位
MOV R0,#0
RETI
T1_SUB:
CJNE R0,#0,T_END1 //是否需要借位
MOV R0,#9
RETI
T_END0:
INC R0 //加1
RETI
T_END1:
DEC R0 //减1
RETI
TAB: //选择0-9的输出
DB 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18
END
七、小结
这次实验中,我进一步加深了对单片机及其应用的了解。
通过查找资料和老师的帮助,进一步熟练了对keil和proteus软件的操作。
在编写程序的过程中也遇到了一些问题,一些语句的使用不够熟练,但现在对它们有了更深的记忆。
在编写程序的过程中,我加深了对中断概念和对计数器工作原理的理解。
同时,感受了设计程序的流程,为以后的实验积累了一定经验。