欢迎来到天天文库
浏览记录
ID:59224198
大小:11.61 KB
页数:5页
时间:2020-09-09
《利用反转法进行矩阵式按键及键值转换详解.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、利用反转法进行矩阵式按键扫描及键值转换详解/******************************************************************************///工程名:键盘实验*//工程描述:在实验板上连接小键盘接口的连线,采用反转法(查询方式)识别小键盘上按下的各键,//并将其对应的按键状态用八个发光二极管来显示,并在超级终端上显示。//注意:本程序实现的硬件平台为MC9S12XDP512应用开发平台。应用开发平台使用16MHZ的有源晶振*//说明:程序使用的片上系统时钟频
2、率,总线时钟由锁相环产生,总线时钟为片上系统时钟的//一半,其换算的公式为:fpllclk=2*fosclk*(SYNR+1)/(REFDV+1)//其中fosclk为振荡器频率,SYNR为时钟合成寄存器的值,REFDV为时钟分频寄存器的值/******************************************************************************/#include/*commondefinesandmacros*/#include3、2.h>/*derivativeinformation*/#pragmaLINK_INFODERIVATIVE"mc9s12xdp512"voidSCI_Init(void);voiddely(void);unsignedcharKeyDecoe(unsignedchari);voidput_char(unsignedcharc);voidMCUInit(void){asmseiSYNR=0x02;//时钟合成寄存器REFDV=0x01;//时钟分频寄存器//锁相环产生的时钟频率f=2*foscclk*(SYNR+1)/4、(REFDV+1)//对于S12XDP51216MHz外部晶体振荡器,总线时钟为24MHz//片内系统时钟为48MHz/*等待锁相环频率锁定*/while((CRGFLG&0x08)!=0x08);CLKSEL5、=0x80;//时钟选择寄存器asmcli}voidmain(void){unsignedcharx,y,k;unsignedcharKB_Value;MCUInit();//初始化系统时钟SCI_Init();DDRB=0XFF;PORTB=0XFF;for(;;){DDRA=0xff;//将A口设置为输出状态6、PORTA=0x0f;//PA7..PA4输出0,PA3...PA0输出1//这时按键的电平状态//7、8、9、10、//11、112、213、314、4//0PA4-----15、-----16、-----17、-----18、----//19、520、621、722、8//0PA5-----23、-----24、-----25、-----26、----//27、928、1029、1130、12//0PA6-----31、-----32、-----33、-----34、----//35、1336、1437、1538、16//0PA7-----39、-----40、-----41、-----42、----//PA0PA1PA2PA3//1111DDRA=043、X0f;//PA7..PA4设置为输入,PA3...PA0设置为输出asmNOP//空指令延时用asmNOP//空指令延时用x=PORTA;//取按键值(行值)//例如://下图ABCD任意位置有按下下的按键,也就是PA4和PA0或PA1或PA2或PA3接一块了,//又因为PA7...PA4为输入,那么,这时PA0或PA1或PA2或PA3输出的1就被PA4读入,//也就是说单片机能够判断出:PA4这一条横线上有按键按下;//44、45、46、47、//48、149、250、351、4//0PA4-----A-----B-----C-----D----/52、/53、554、655、756、8//0PA5-----57、-----58、-----59、-----60、----//61、962、1063、1164、12//0PA6-----65、-----66、-----67、-----68、----//69、1370、1471、1572、16//0PA7-----73、-----74、-----75、-----76、----//PA0PA1PA2PA3//1111//这样检测到PA4有按键按下了,即PA4=1;PA5=0;PA6=0;PA7=0;x&=0Xf0;//判断取的按键是否取到值(即是否有键按下)//这时x=0x10;(即二进制的00010000)if(x)//77、如果行上检测到有按键按下了,再进去检测按下的按键在哪一列上{dely();//经过一个小延时,再进行检测DDRA=0xff;//将A口设置为输出状态PORTA=0Xf0;//PA7..PA4输出1,PA3...PA0输出0//这时按键的电平状态//78、79、80、81、//82、183、284、385、4//1PA4-----86、-----87、---
3、2.h>/*derivativeinformation*/#pragmaLINK_INFODERIVATIVE"mc9s12xdp512"voidSCI_Init(void);voiddely(void);unsignedcharKeyDecoe(unsignedchari);voidput_char(unsignedcharc);voidMCUInit(void){asmseiSYNR=0x02;//时钟合成寄存器REFDV=0x01;//时钟分频寄存器//锁相环产生的时钟频率f=2*foscclk*(SYNR+1)/
4、(REFDV+1)//对于S12XDP51216MHz外部晶体振荡器,总线时钟为24MHz//片内系统时钟为48MHz/*等待锁相环频率锁定*/while((CRGFLG&0x08)!=0x08);CLKSEL
5、=0x80;//时钟选择寄存器asmcli}voidmain(void){unsignedcharx,y,k;unsignedcharKB_Value;MCUInit();//初始化系统时钟SCI_Init();DDRB=0XFF;PORTB=0XFF;for(;;){DDRA=0xff;//将A口设置为输出状态
6、PORTA=0x0f;//PA7..PA4输出0,PA3...PA0输出1//这时按键的电平状态//
7、
8、
9、
10、//
11、1
12、2
13、3
14、4//0PA4-----
15、-----
16、-----
17、-----
18、----//
19、5
20、6
21、7
22、8//0PA5-----
23、-----
24、-----
25、-----
26、----//
27、9
28、10
29、11
30、12//0PA6-----
31、-----
32、-----
33、-----
34、----//
35、13
36、14
37、15
38、16//0PA7-----
39、-----
40、-----
41、-----
42、----//PA0PA1PA2PA3//1111DDRA=0
43、X0f;//PA7..PA4设置为输入,PA3...PA0设置为输出asmNOP//空指令延时用asmNOP//空指令延时用x=PORTA;//取按键值(行值)//例如://下图ABCD任意位置有按下下的按键,也就是PA4和PA0或PA1或PA2或PA3接一块了,//又因为PA7...PA4为输入,那么,这时PA0或PA1或PA2或PA3输出的1就被PA4读入,//也就是说单片机能够判断出:PA4这一条横线上有按键按下;//
44、
45、
46、
47、//
48、1
49、2
50、3
51、4//0PA4-----A-----B-----C-----D----/
52、/
53、5
54、6
55、7
56、8//0PA5-----
57、-----
58、-----
59、-----
60、----//
61、9
62、10
63、11
64、12//0PA6-----
65、-----
66、-----
67、-----
68、----//
69、13
70、14
71、15
72、16//0PA7-----
73、-----
74、-----
75、-----
76、----//PA0PA1PA2PA3//1111//这样检测到PA4有按键按下了,即PA4=1;PA5=0;PA6=0;PA7=0;x&=0Xf0;//判断取的按键是否取到值(即是否有键按下)//这时x=0x10;(即二进制的00010000)if(x)//
77、如果行上检测到有按键按下了,再进去检测按下的按键在哪一列上{dely();//经过一个小延时,再进行检测DDRA=0xff;//将A口设置为输出状态PORTA=0Xf0;//PA7..PA4输出1,PA3...PA0输出0//这时按键的电平状态//
78、
79、
80、
81、//
82、1
83、2
84、3
85、4//1PA4-----
86、-----
87、---
此文档下载收益归作者所有