1、行线列线独立键盘矩阵键盘GND5V5V5k4 列线 n1 n2 n3 n4行线m1m2m3m4+5VVDD MCU内部上拉电阻PTA0PTA1PTA2PTA3PTA7PTA6PTA5PTA4 列线 n1 n2 n3 n4行线m1 m2m3m4 1 2 3 A 4 5 6 B 7 8 9 C *0#D 1 EE 2 DE 3 BE A 7E 4 ED 5 DD 6 BD B 7D 7 EB 8 DB 9 BB C 7B*E7 0 D7#B7 D 77定义值键值(1)键值计算方法)键值计算方法按上图的接法可以得出键值表,按上图的接法可以得出键值表,如下图。键值可以通过扫描法如下图。键值可以通过扫描
2、法获得,由键值通过查表法编程获得,由键值通过查表法编程得到定义值。得到定义值。(2)键盘编程汇编语言子程序)键盘编程汇编语言子程序表表8-1 键盘中断汇编工程文件键盘中断汇编工程文件工程文件名工程文件名KeyBoard_Int.prj所在路径所在路径MC08Ex2007GP32GP32SS04_键盘中断编程键盘中断编程文件类型文件类型文件名文件名功能简述功能简述讲解章节讲解章节头文件头文件GP32ASM.h芯片头文件芯片头文件汇编工程文件组织汇编工程文件组织4.3Includes.h总头文件总头文件汇编工程文件组织汇编工程文件组织4.3KB.h键盘子程序定义头文件键盘子程序定义头文件本章本章S
3、CI.h串行通信头文件串行通信头文件参见本工程实例参见本工程实例汇编语言汇编语言子程序文件子程序文件MCUinit.s芯片初始化文件芯片初始化文件初始化及初始化及PLL编程实例编程实例 14.2.5EnDisInt.s开放或禁止开放或禁止MCU各模块各模块参见本工程实例参见本工程实例Vectors08.s中断处理子程序与中断向量表中断处理子程序与中断向量表文件文件本章本章SCI.s串行通信文件串行通信文件参见本工程实例参见本工程实例KB.s键盘子程序定义文件键盘子程序定义文件本章本章汇编语言主程序文汇编语言主程序文件件Main.s主程序文件主程序文件本章本章/-*/工工 程程 名名:KeyBo
4、ard_Int.prj */硬件连接硬件连接:*/(1)MCU的的A口接键盘口接键盘(见见“KB.s“文件中的说明文件中的说明)*/程序描述程序描述:按下键盘按键按下键盘按键,串口发送串口发送 对应的键值对应的键值 */目目 的的:键盘中断键盘中断,键盘扫描键盘扫描,键值识键值识 别别,键值转换键值转换 */注注 意意:如果键盘插在实验板的上如果键盘插在实验板的上 排插孔排插孔,无须连线无须连线,若插在若插在 */下排插孔下排插孔,需手工接线需手工接线 */日日 期期:2007.07 */-清华清华2007版版嵌入式技术基础嵌入式技术基础 与实践与实践实例实例-*/头文件头文件.include
5、 Includes.h /总头文件总头文件/主程序主程序.area flash(abs).org FlashStartAddr MainInit:/复位后从此处执行复位后从此处执行(见见Vectors08.s文件末尾处文件末尾处)SEI /关总中断关总中断 /1.堆栈初始化为堆栈初始化为RAM最高端最高端 LDHX#RAMendAddr+1 /HX=#RAMendAddr+1 TXS /HX-1-SP /2.系统初始化系统初始化 JSR MCUinit /初学时跳过此处初学时跳过此处 /3.串行口初始化串行口初始化 JSR SCIinit /4.键盘初始化键盘初始化 JSR KBinit JS
6、R EnableKBint /开放键盘中断开放键盘中断 CLI /开总中断开总中断/程序总循环入口程序总循环入口MainLoop:NOP NOP BRA MainLoop/包含本工程的其他文件包含本工程的其他文件-.include MCUinit.s /芯片初始化芯片初始化.include SCI.s /串行通信串行通信.include KB.s /键盘子程序键盘子程序.include EnDisInt.s /允许允许/禁止禁止MCU各模块中断各模块中断/包含中断处理子程序与中断向量表文件包含中断处理子程序与中断向量表文件Vectors08.s-/注意注意:这个包含语句的存放位置必须放在最后这
7、个包含语句的存放位置必须放在最后.include Vectors08.s /中断处理子程序与中断向量表中断处理子程序与中断向量表/Vectors08.s/Vectors08.s中断处理子程序与中断向量表中断处理子程序与中断向量表-*/功能功能:*/(1)/(1)定义中断处理子程序定义中断处理子程序 */(2)/(2)放置中断向量表放置中断向量表 */本文件包含本文件包含:*/(1)/(1)键盘中断处理函数键盘中断处理函数 */(2)/(2)未定义的中断处理函数未定义的中断处理函数 */说明说明:该文件与芯片具体型号有关该文件与芯片具体型号有关 */(1)/(1)芯片型号芯片型号MC68HC90
8、8GP32 MC68HC908GP32 */(2)/(2)注意本文件内容的顺序不能变动注意本文件内容的顺序不能变动 */-/-*/isrKeyBoard:/isrKeyBoard:键盘中断处理程序键盘中断处理程序-*/功能功能:识别按键并发送键值识别按键并发送键值,把键值转换成对应的把键值转换成对应的 *定义值定义值,再从再从 */串口发送出去串口发送出去 */调用子程序调用子程序:*/(1)/(1)扫描法读取键值子程序扫描法读取键值子程序(KBScan)(KBScan)*/(2)/(2)键值转为定义值子程序键值转为定义值子程序(KBDef)(KBDef)*/-/-*isrKeyBoard:i
9、srKeyBoard:SEI /SEI /关总中断关总中断 PSHH /HPSHH /H进栈进栈(保护寄存器保护寄存器H)H)BSET#1,INTKBSCR /BSET#1,INTKBSCR /禁止键盘中断禁止键盘中断 JSR KBScan /JSR KBScan /扫描键盘扫描键盘,读取键值读取键值-A-A JSR SCISend1 /JSR SCISend1 /发送键值发送键值 JSR KBDef /JSR KBDef /转成相应的定义值转成相应的定义值-A-A JSR SCISend1 /JSR SCISend1 /发送定义值发送定义值 JSR KBInit /JSR KBInit /键
10、盘初始化键盘初始化 BCLR#1,INTKBSCR /BCLR#1,INTKBSCR /开放键盘中断开放键盘中断(IMASKK=0)(IMASKK=0)PULH /H PULH /H出栈出栈(恢复寄存器恢复寄存器H)H)CLI /CLI /开总中断开总中断 RTIRTI/未定义的中断处理子程序未定义的中断处理子程序,本子程序不能删除本子程序不能删除isrDummy:isrDummy:RTI RTI/中断矢量表中断矢量表,用户若需开放某中断用户若需开放某中断,可修改下表中的相应项目可修改下表中的相应项目/(interrupt service routine,isr/(interrupt serv
11、ice routine,isr 中断处理程序中断处理程序).area memory(abs).area memory(abs).org 0 xffdc /.org 0 xffdc /中断向量表起始地址中断向量表起始地址(注意注意:与芯片型号有关与芯片型号有关)vectab:vectab:/省略其他未使用的中断向量定义省略其他未使用的中断向量定义 .word isrKeyBoard/.word isrKeyBoard/键盘中断键盘中断/省略其他未使用的中断向量定义省略其他未使用的中断向量定义 (3)键盘中断编程的键盘中断编程的PC机方程序机方程序利用串口调试工具,接收按键后的键值,通过它可以清楚
12、地知道定义利用串口调试工具,接收按键后的键值,通过它可以清楚地知道定义值与键值的对应关系,若显示不对,可以修改键值转为定义值子程序值与键值的对应关系,若显示不对,可以修改键值转为定义值子程序中的键值表。中的键值表。表表8-2 键盘中断键盘中断08C工程文件工程文件工程文件名工程文件名KeyBoard_Int.prj所在路径所在路径MC08Ex2007GP32GP32CC04_键盘中断编程键盘中断编程文件类型文件类型文件名文件名功能简述功能简述讲解章节讲解章节头文件头文件GP32C.hGP32 MCU映像寄存映像寄存名定义头文件名定义头文件08C工程文件组织工程文件组织5.3EnDisInt.h
13、开放或禁止开放或禁止MCU各模块中断各模块中断头文件头文件08C工程文件组织工程文件组织5.3Type.h类型别名定义头文件类型别名定义头文件用用typedef定义类型定义类型5.2.1008C工程文件组织工程文件组织5.3Includes.h总头文件总头文件08C工程文件组织工程文件组织5.3KB.h键盘函数定义头文件键盘函数定义头文件本章本章SCI.h串行通信头文件串行通信头文件串行通信子函数串行通信子函数7.4.1C语言语言子函数文件子函数文件MCUInit.c芯片初始化文件芯片初始化文件初始化及初始化及PLL编程实例编程实例 14.2.5SCI.c串行通信文件串行通信文件串行通信子函数
14、串行通信子函数7.4.1KB.c键盘驱动文件键盘驱动文件本章本章Vectors08.c中断处理函数与中断向量表中断处理函数与中断向量表文件文件08C工程文件组织工程文件组织5.3C语言主函数语言主函数Main.c主函数文件主函数文件本章本章/KB.h/KB.h键盘函数定义头文件键盘函数定义头文件-#include GP32C.h /MCU#include GP32C.h /MCU映像寄存器名定义映像寄存器名定义#include EnDisInt.h /#include EnDisInt.h /开放或禁止开放或禁止MCUMCU各模块中断的宏定义各模块中断的宏定义#include Type.h /
15、#include Type.h /类型别名定义类型别名定义/键盘控制引脚定义键盘控制引脚定义#define KB_P PTA /#define KB_P PTA /键盘接在键盘接在PTAPTA口上口上#define KB_D DDRA /#define KB_D DDRA /相应的方向寄存器相应的方向寄存器#define KB_PUE PTAPUE /#define KB_PUE PTAPUE /相应的上拉电阻允许寄存器相应的上拉电阻允许寄存器#define ACKKBit 2 /#define ACKKBit 2 /键盘中断应答位键盘中断应答位/函数声明函数声明void KBInit(voi
16、d);/void KBInit(void);/键盘初始化键盘初始化INT8U KBScan(void);/INT8U KBScan(void);/扫描读取键值扫描读取键值INT8U KBDef(INT8U valve);/INT8U KBDef(INT8U valve);/键值转为定义值键值转为定义值/KB.c/KB.c键盘函数定义键盘函数定义-*/本文件包含本文件包含:*/(1)KBInit:/(1)KBInit:初始化键盘控制及中断的相关寄存器初始化键盘控制及中断的相关寄存器 */(2)KBScan:/(2)KBScan:扫描扫描4 4*4 4键盘键盘,读取键值读取键值-A -A */(3
17、)KBDef:/(3)KBDef:键值转为定义值键值转为定义值 */硬件连接硬件连接:*/PTA7-4/PTA7-4接键盘接键盘4 4根列线根列线,PTA3-0,PTA3-0接键盘接键盘4 4根行线根行线 */-/-*#include KB.h /#include KB.h /该头文件包含键盘控制引脚定义及该头文件包含键盘控制引脚定义及KB.cKB.c用到的相关头文件用到的相关头文件/KBInit:/KBInit:键盘初始化函数键盘初始化函数-*/功能功能:初始化键盘控制及中断的相关寄存器初始化键盘控制及中断的相关寄存器,但未开放键盘中断但未开放键盘中断 */参数参数:无无 */返回返回:无无
18、 */-/-*void KBInit(void)void KBInit(void)/复位相应寄存器复位相应寄存器 KB_P =0 x00;KB_P =0 x00;KB_D =0b00001111;/KB_D =0b00001111;/使列线使列线(7-4(7-4位位)为输入为输入,使行线使行线(3-0(3-0位位)为输出为输出 KB_PUE=0b11110000;/KB_PUE=0b11110000;/输入引脚输入引脚(列线列线)有内部上拉电阻有内部上拉电阻 DisableKBInt();/DisableKBInt();/屏蔽键盘中断屏蔽键盘中断(IMASKK=1)(IMASKK=1)INTK
19、BIER =0b11110000;/INTKBIER =0b11110000;/允许输入引脚的中断可进入允许输入引脚的中断可进入 INTKBSCR|=(1 ACKKBit);/INTKBSCR|=(1 ACKKBit);/清除键盘中断请求清除键盘中断请求(ACKK=1)(ACKK=1)/KBScan:/KBScan:扫描读取键值函数扫描读取键值函数-*/功能功能:扫描扫描4 4*4 4键盘键盘,返回扫描到的键值返回扫描到的键值,若无按键若无按键,返回返回0 xff 0 xff */参数参数:无无 */返回返回:扫描到的键值扫描到的键值 */-/-*INT8U KBScan(void)INT8U
20、 KBScan(void)INT8U line,i,tmp;INT8U line,i,tmp;line=0b11111110;/line=0b11111110;/使第一根行线为使第一根行线为0(0(低电平低电平)for(i=1;i=4;i+)/for(i=1;i=4;i+)/最多将扫描最多将扫描4 4根行线根行线 /当前扫描的一行当前扫描的一行,输出低电平输出低电平 tmp =KB_P;tmp =KB_P;tmp|=0b00001111;tmp|=0b00001111;KB_P=tmp&line;KB_P=tmp&line;asm(NOP);asm(NOP);asm(NOP);asm(NOP)
21、;/读取键盘口数据寄存器读取键盘口数据寄存器 tmp =KB_P;tmp =KB_P;/通过观察通过观察4 4根列线中是否出现低电平来判断当前行有无按键根列线中是否出现低电平来判断当前行有无按键 tmp&=0b11110000;/tmp&=0b11110000;/仅保留列线的值仅保留列线的值 if(tmp!=0 xf0)/if(tmp!=0 xf0)/当前行有键按下当前行有键按下 tmp=KB_P;/tmp=KB_P;/读取扫描到的键值读取扫描到的键值 break;/break;/退出循环不再扫描退出循环不再扫描 else /else /当前行无按键当前行无按键,准备扫描下一行准备扫描下一行
22、line=(line 1)|0 x01;line=(line 1)|0 x01;if(i=5)/if(i=5)/无按键无按键,以后将返回以后将返回0 xff0 xff tmp=0 xff;tmp=0 xff;return(tmp);return(tmp);/KBDef:/KBDef:键值转为定义值函数键值转为定义值函数-*/功能功能:键值转为定义值键值转为定义值 */参数参数:键值键值 */返回返回:键定义值键定义值 */-/-*/键盘定义表键盘定义表const INT8U KBTable=const INT8U KBTable=0 xEE,1,0 xDE,2,0 xBE,3,0 x7E,A,
23、0 xEE,1,0 xDE,2,0 xBE,3,0 x7E,A,0 xED,4,0 xDD,5,0 xBD,6,0 x7D,B,0 xED,4,0 xDD,5,0 xBD,6,0 x7D,B,0 xEB,7,0 xDB,8,0 xBB,9,0 x7B,C,0 xEB,7,0 xDB,8,0 xBB,9,0 x7B,C,0 xE7,0 xE7,*,0 xD7,0,0 xB7,#,0 x77,D,0 xD7,0,0 xB7,#,0 x77,D,0 x00 0 x00;INT8U KBDef(INT8U valve)INT8U KBDef(INT8U valve)INT8U KeyPress;/IN
24、T8U KeyPress;/键定义值键定义值 INT8U i;INT8U i;i=0;i=0;KeyPress=0 xff;KeyPress=0 xff;while(KBTablei!=0 x00)/while(KBTablei!=0 x00)/在键盘定义表中搜索欲转换的键值在键盘定义表中搜索欲转换的键值,直至表直至表尾尾 if(KBTablei=valve)/if(KBTablei=valve)/在表中找到相应的键值在表中找到相应的键值 KeyPress=KBTablei+1;/KeyPress=KBTablei+1;/取出对应的键定义值取出对应的键定义值 break;break;i+=2;
25、/i+=2;/指向下一个键值指向下一个键值,继续判断继续判断 return KeyPress;return KeyPress;/-/-*/工工 程程 名名:KeyBoard_Int.prj :KeyBoard_Int.prj */硬件连接硬件连接:*/(1)MCU/(1)MCU的的A A口接键盘口接键盘(见见KB.sKB.s文件中的说明文件中的说明)*/程序描述程序描述:按下键盘按键按下键盘按键,串口发送对应的键值串口发送对应的键值 */目目 的的:键盘中断键盘中断,键盘扫描键盘扫描,键值识别键值识别,键值转换键值转换 */说说 明明:*/注注 意意:如果键盘插在实验板的上排插孔如果键盘插在实
26、验板的上排插孔,无须连线无须连线,若若 *插在下排插在下排 */插孔插孔,需手工接线需手工接线 */日日 期期:2007.01.03 :2007.01.03 */-/-清华清华20072007版版嵌入式技术基础与实践嵌入式技术基础与实践实例实例-*#include Includes.h /#include Includes.h /总头文件总头文件/主函数主函数void main()void main()DisableMCUInt();/DisableMCUInt();/禁止总中断禁止总中断 MCUInit();/MCUInit();/芯片初始化芯片初始化 SCIInit();/SCIInit(
27、);/串行口初始化串行口初始化 KBInit();/KBInit();/键盘初始化键盘初始化 EnableKBInt();/EnableKBInt();/开放键盘中断开放键盘中断 EnableMCUInt();/EnableMCUInt();/开放总中断开放总中断 /主循环主循环 while(1)while(1)/Vectors08.c/Vectors08.c中断处理函数与中断向量表中断处理函数与中断向量表-*/功能功能:*/(1)/(1)定义中断处理子程序定义中断处理子程序 */(2)/(2)放置中断向量表放置中断向量表 */本文件包含本文件包含:*/(1)/(1)键盘中断处理函数键盘中断处
28、理函数 */(2)/(2)未定义的中断处理函数未定义的中断处理函数 */说明说明:该文件与芯片具体型号有关该文件与芯片具体型号有关 */(1)/(1)芯片型号芯片型号MC68HC908GP32 MC68HC908GP32 */-/-*/头文件头文件#include Type.h /#include Type.h /类型别名定义类型别名定义#include EnDisInt.h /#include EnDisInt.h /开放或禁止开放或禁止MCUMCU各模块中断的宏定义各模块中断的宏定义#include SCI.h /#include SCI.h /该头文件包含串行通信函数声明该头文件包含串行
29、通信函数声明#include KB.h /#include KB.h /该头文件包含键盘模块函数声明该头文件包含键盘模块函数声明/isrKeyBoard:/isrKeyBoard:键盘中断处理函数键盘中断处理函数-*/功能功能:识别按键并发送键值识别按键并发送键值,把键值转换成对应的定义值把键值转换成对应的定义值,再从串口发送出去再从串口发送出去 */调用函数调用函数:*/(1)/(1)扫描法读取键值函数扫描法读取键值函数(KBScan)(KBScan)*/(2)/(2)键值转为定义值函数键值转为定义值函数(KBDef)(KBDef)*/-/-*#pragma interrupt_handle
30、r isrKeyBoard#pragma interrupt_handler isrKeyBoardvoid isrKeyBoard(void)void isrKeyBoard(void)INT8U valve;INT8U valve;DisableMCUInt();/DisableMCUInt();/关总中断关总中断 DisableKBInt();/DisableKBInt();/屏蔽键盘中断屏蔽键盘中断 valve=KBScan();/valve=KBScan();/扫描键值扫描键值,存于存于valuevalue中中 SCISend1(valve);/SCISend1(valve);/发送
31、键值发送键值 SCISend1(KBDef(valve);/SCISend1(KBDef(valve);/键值转化为定义值并发送键值转化为定义值并发送 KBInit();/KBInit();/键盘初始化键盘中断键盘初始化键盘中断 EnableKBInt();/EnableKBInt();/开放键盘中断开放键盘中断 EnableMCUInt();/EnableMCUInt();/开总中断开总中断 提问与解答环节Questions And Answers谢谢聆听 学习就是为了达到一定目的而努力去干,是为一个目标去战胜各种困难的过程,这个过程会充满压力、痛苦和挫折Learning Is To Achieve A Certain Goal And Work Hard,Is A Process To Overcome Various Difficulties For A Goal