历史上的今天
今天是:2025年03月06日(星期四)
2020年03月06日 | 51单片机-矩阵键盘模块-长短按键&数码管显示-编程模板
2020-03-06 来源:eefocus
1.视频
bilibili视频地址:
https://www.bilibili.com/video/av90715834
51单片机-矩阵键盘模块-长短按键&数码管显示-模块化编程模版
2.文件
代码文件下载地址:
https://download.csdn.net/download/weixin_43130546/12180191
3.说明
此段代码体现了模块化编程思想,具有很好的可移植性。
用到的知识点包括:矩阵键盘扫描,长短按键,按键动作识别;数码管动态扫描,数码管高位不显示;LED;BUZZER;片内片外RAM。
89C52:
有 8K FLASH(存程序.hex文件的地方 );
有512BRAM(程序运行过程中,存临时数据的地方);
分为128B片内RAM;128B片内扩展RAM;256B片外RAM;
RAM:
data: 片内RAM,直接调用。从 0x00 到 0x7F 共 128B 。(默认用这个)
idata: 片内扩展RAM,寄存器寻址间接调用。从 0x80 到 0xFF 共 128B 。(一般用于中断,函数调用的堆栈)
pdata: 片外扩展RAM,1个寄存器寻址间接调用。从 0x00 到 0xFF 共 256B 。(一般用于定义很大很多的数)
pdata: 片外扩展RAM,2个寄存器寻址间接调用。从 0x0000 到 0xFFFF 共 64K 。(一般用于定义很大很多的数)(89C52没有这么多)
4.代码
#include sbit BUZZER = P2^3; sbit DULA = P2^6; sbit WELA = P2^7; sbit KEYOUT1 = P3^0; sbit KEYOUT2 = P3^1; sbit KEYOUT3 = P3^2; sbit KEYOUT4 = P3^3; sbit KEYIN1 = P3^4; sbit KEYIN2 = P3^5; sbit KEYIN3 = P3^6; sbit KEYIN4 = P3^7; unsigned char code DUTable[16] = { 0x3F,0x06,0x5B,0x4F, 0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C, 0x39,0x5E,0x79,0x71 }; unsigned char code WETable[8] = { ~0x80,~0x40,~0x20,~0x10, ~0x08,~0x04,~0x02,~0x01 }; unsigned char LedBuff[8] = { 0x3F,0x00,0x00,0X00, 0X00,0X00,0X00,0X00 }; unsigned char code KeyCode[4][4] = { {0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15} }; unsigned char KeyStay[4][4] = { {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1} }; unsigned long pdata KeyTime[4][4] = { {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0} }; unsigned long number = 0; void ConfigTimer0(void); void KeyDriver(void); void main(void) { ConfigTimer0(); while(1) { KeyDriver(); } } void ConfigTimer0(void) { TH0 = 0xFC; TL0 = 0x67; EA = 1; ET0 = 1; TMOD &= 0xF0; TMOD |= 0x01; TF0 = 0; TR0 = 1; } void ShowNum(unsigned char num) { char i; static unsigned char buff[7]; for(i=0; i<7; i++) { buff[i] = num % 10; num /= 10; } for(i=6; i>=1; i--) { if(0 == buff[i]) { LedBuff[i] = 0x00; } else { break; } } for(; i>=0; i--) { LedBuff[i] = DUTable[buff[i]]; } } void KeyAction(unsigned char KeyCoder) { number++; ShowNum(number); LedBuff[7] = DUTable[KeyCoder]; } void KeyDriver(void) { unsigned char i,j; static unsigned char KeyBack[4][4] = { {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1} }; static unsigned long pdata KeyTimer[4][4] = { {1000,1000,1000,1000},{1000,1000,1000,1000}, {1000,1000,1000,1000},{1000,1000,1000,1000} }; for(i=0; i<4; i++) { for(j=0; j<4; j++) { if(KeyStay[i][j] != KeyBack[i][j]) { if(1==KeyBack[i][j]) { P1 = 0x00; KeyAction(KeyCode[i][j]); } else { P1 = 0xFF; } KeyBack[i][j] = KeyStay[i][j]; } if(KeyTime[i][j]>0) { if(KeyTime[i][j]>=KeyTimer[i][j]) { KeyTimer[i][j] += 200; KeyAction(KeyCode[i][j]); BUZZER = 0; } } else { KeyTimer[i][j] = 1000; BUZZER = 1; } } } } void LedScan(void) { static unsigned char i = 0; P0 = 0x00; DULA = 1; DULA = 0; P0 = WETable[i]; WELA = 1; WELA = 0; P0 = LedBuff[i]; DULA = 1; DULA = 0; i++; if(i>=8) { i = 0; } } void KeyScan(void) { unsigned char i; static unsigned char KeyOut = 0; static unsigned char KeyBuff[4][4] = { {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF} }; KeyBuff[KeyOut][0] = (KeyBuff[KeyOut][0]<<1) | KEYIN1; KeyBuff[KeyOut][1] = (KeyBuff[KeyOut][1]<<1) | KEYIN2; KeyBuff[KeyOut][2] = (KeyBuff[KeyOut][2]<<1) | KEYIN3; KeyBuff[KeyOut][3] = (KeyBuff[KeyOut][3]<<1) | KEYIN4; for(i=0; i<4; i++) { if(0x00 == (KeyBuff[KeyOut][i] & 0x0F)) { KeyStay[KeyOut][i] = 0; KeyTime[KeyOut][i] += 4; } else if(0x0F == (KeyBuff[KeyOut][i] & 0x0F)) { KeyStay[KeyOut][i] = 1; KeyTime[KeyOut][i] = 0; } } KeyOut++; KeyOut &= 0x03; switch(KeyOut) { case 0 : KEYOUT4 = 1; KEYOUT1 = 0; break; case 1 : KEYOUT1 = 1; KEYOUT2 = 0; break; case 2 : KEYOUT2 = 1; KEYOUT3 = 0; break; case 3 : KEYOUT3 = 1; KEYOUT4 = 0; break; default : break; } } void InterruptTimer0(void) interrupt 1 { TH0 = 0xFC; TL0 = 0x67; LedScan(); KeyScan(); }
史海拾趣
|
如题。就是在*.bib文件下添加dll 属性是SH,(系统隐藏),可是在wince windows目录下是可以copy的,要怎么搞啊。。… 查看全部问答> |
|
WinCE5.0系统加载完之后,屏幕还显示Logo,采用的是研华的嵌入式主板,Flash芯片采用M-System ,硬件驱动都是研华提供以及BSP, 我采用Hive-based注册表方式, [code] [HKEY_LOCAL_MACHINE\\init\\BootVars] \"SystemHive\"=\"Docume ...… 查看全部问答> |
|
我通过BOOL NTLMSetUserInfo( LPTSTR pszUser, LPTSTR pszPassword )这个函数给系统添加了用户名和密码,请问如何通过过程序来获取这个密码呢?我看了看Ntlmssp.h 这个头文件,好像没有类似NTLMGetUserInfo函数用来获取用户信息的。 … 查看全部问答> |
|
为了解决DIM3517的显示问题(因为板子没有代LCD),坛主建议我买一块LCD,最后她可以买回,坛主一片盛情,买一个LCD虽然不贵,但是只用一次的话显得太浪费,不符合一个开发者的做法,寻找廉价方案,另外一个方案:HDMI转AV,因为我的电视机有AV接口 ...… 查看全部问答> |
|
我买的stm32f103zet6最小系统板,在设置中断的时候,发现不论我把外部中断设置在哪个端口,都会在端口A上面反映,比如说我设置PB.2为外部中断, 但写程序的时候,PB.2不会响应中断,而PA.2则会,就算我把A的时钟关了,它也会相应中断。 就相当于 ...… 查看全部问答> |
|
反复折腾,摄像头终于可以工作了。发现1.12版的可以,1.19版的不行。主要区别也就在main.c文件上,用1.12版的main.c文件替换1.19版的也可以工作。对比文件后,发现主要问题在于OV2640_JPEG_Dis()函数,将它从93行的if前移到if语句中就可以了。 ...… 查看全部问答> |




