单片机==矩阵键盘-逻辑键值(11)
2016-09-30 19:20
85 查看
#include <reg52.h> #include "delay.h" #define KEYPORT P0 #define SEGPORT P1 sbit seg_select = P2^1; sbit bit_select = P2^0; unsigned char segdata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char tempdata[2] = {0x3f,0x3f}; void timer0_init(void) { EA = 1; TMOD |= 0x01; TH0 = (65536 - 10000) / 256; TL0 = (65536 - 10000) % 256; ET0 = 1; TR0 = 1; } void display() { static unsigned char i = 0; SEGPORT = 0x0; seg_select = 1; seg_select = 0; SEGPORT = 0xff; bit_select = 1; bit_select = 0; SEGPORT = tempdata[i]; seg_select = 1; seg_select = 0; SEGPORT = bitdata[i]; bit_select = 1; bit_select = 0; i++; if(2 == i) { i = 0; } } void timer0_isr(void) interrupt 1 { TH0 = (65536 - 10000) / 256; TL0 = (65536 - 10000) % 256; display(); } unsigned char key_scan(void) { unsigned char keyvalue; KEYPORT = 0xf0; if(0xf0 != KEYPORT) { delay_ms(10); if(0xf0 != KEYPORT) { KEYPORT = 0xfe; if(0xfe != KEYPORT) { keyvalue = KEYPORT; keyvalue &= 0xf0; keyvalue += 0x0e; while(0xfe != KEYPORT); delay_ms(10); while(0xfe != KEYPORT); return keyvalue; } KEYPORT = 0xf7; if(0xf7 != KEYPORT) { keyvalue = KEYPORT; keyvalue &= 0xf0; keyvalue += 0x07; while(0xf7 != KEYPORT); delay_ms(10); while(0xf7 != KEYPORT); return keyvalue; } KEYPORT = 0xfd; if(0xfd != KEYPORT) { keyvalue = KEYPORT; keyvalue &= 0xf0; keyvalue += 0x0d; while(0xfd != KEYPORT); delay_ms(10); while(0xfd != KEYPORT); return keyvalue; } KEYPORT = 0xfb; if(0xfd != KEYPORT) { keyvalue = KEYPORT; keyvalue &= 0xf0; keyvalue += 0x0b; while(0xfb != KEYPORT); delay_ms(10); while(0xfb != KEYPORT); return keyvalue; } } } return 0xff; } unsigned char key_pro() { unsigned char keynum; keynum = key_scan(); switch(keynum) { case 0x7e : return 0;break; case 0xbe : return 1;break; case 0xde : return 2;break; case 0xee : return 3;break; case 0x7d : return 4;break; case 0xbd : return 5;break; case 0xdd : return 6;break; case 0xed : return 7;break; case 0x7b : return 8;break; case 0xbb : return 9;break; case 0xdb : return 10;break; case 0xeb : return 11;break; case 0x77 : return 12;break; case 0xb7 : return 13;break; case 0xd7 : return 14;break; case 0xe7 : return 15;break; default : return 16;break; } } void main() { unsigned char key; timer0_init(); while(1) { key = key_pro(); if(16 != key) { tempdata[0] = segdata[key / 10]; tempdata[1] = segdata[key % 10]; } } }
相关文章推荐
- Pyke 逻辑编程入门(11):规则之“反向推理”
- 理解JAVA程序逻辑及面向对象编程思想简单总结(11)
- 简洁精美源于分析透彻,构思明确、求精,逻辑练达。(11)
- 11新建群聊逻辑的完成一
- c++入门笔记(11)逻辑判断
- !金尚网上商城10~11-业务逻辑分析+逻辑(编码)设计
- 计算机程序的思维逻辑 (11) - 初识函数
- 一步一步学DataGuard(11)逻辑standby之准备创建
- Win32ASM学习[11]:逻辑运算
- 疯狂Activiti6.0连载(11)Activiti6的流程控制逻辑
- 数理逻辑:公理化算术(11)递归谓词
- 数理逻辑:证明论初步(11)算术中完全归纳公理的独立性
- 计算机程序的思维逻辑 (11) - 初识函数
- 数理逻辑:谓词逻辑(11)一元谓词逻辑
- 数理逻辑3 -- 形式数论11
- 11.条件与逻辑
- 疯狂Activiti6连载(11)Activiti6的流程控制逻辑
- 图解 CSS (11): 理解样式表的逻辑
- 数理逻辑:命题逻辑(11)多值逻辑
- 你知道注册表中常用的键值吗