基于8051的扫描式键盘驱动和串并转换式显示编程实现人机I/O(键盘输入,数码管输出)
2014-05-23 21:23
375 查看
#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define SCANPORT P1 //定义键盘扫描的端口P1口 #define NOP _nop_() sbit SDA = P3^1; sbit SHIFT_CP = P3^0; sbit ST_CP = P3^2; uchar i=0; uchar uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F}; //列线扫描电压,分为第1,2,3,4根列线(实验中接p1.4-p1.7)为低电平0,其他为高电平1。 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极接法,0~9,a~f void delay(uint k) { uint j; for (; k > 0; k--) for (j = 0; j < 50; j++); } void SerialSendData(uchar dat) { uchar ii; uchar sdata=dat; for(ii=0;ii<8;ii++) { if(sdata&0x80)SDA=1; else SDA = 0; sdata<<=1; SHIFT_CP =0; NOP; NOP; SHIFT_CP = 1; NOP; NOP; } ST_CP = 1; NOP; NOP; ST_CP = 0; } uchar ucKeyScan() { uchar Temp=0; uchar ucRow=0,ucLine=0; for(ucLine=0;ucLine<4;ucLine++) //列线扫描电压 (逐行进行) { SCANPORT=uca_LineScan[ucLine]; Temp=SCANPORT & 0x0F; //屏蔽低4位(低4位是行线,高4位是列线) if(Temp!=0x0F) //判断该列是否有按键(低4位不全为1,则键被按下)。若按下,return (uckeycode)。 { //返回按键坐标(ucline是行数) if(Temp==0x0E)return ucLine*4+0; //返回值【0,4,8,12】 : 代表键值分别为【0,4,8,c】 if(Temp==0x0D)return ucLine*4+1; //返回值【1,5,9,13】 :代表键值分别为【1,5,9,d】 if(Temp==0x0B)return ucLine*4+2; //返回值【2,6,10,14】:代表键值分别为【2,6,a,e】 if(Temp==0x07)return ucLine*4+3; //返回值【3,7,11,15】:代表键值分别为【3,7,b,f】 } } return 16; } void vKeyProcess(unsigned char ucKeyCode) { switch(ucKeyCode)//16种情况 { case 0:SerialSendData(table[0]);break; case 1:SerialSendData(table[1]);break; case 2:SerialSendData(table[2]);break; case 3:SerialSendData(table[3]);break; case 4:SerialSendData(table[4]);break; case 5:SerialSendData(table[5]);break; case 6:SerialSendData(table[6]);break; case 7:SerialSendData(table[7]);break; case 8:SerialSendData(table[8]);break; case 9:SerialSendData(table[9]);break; case 10:SerialSendData(table[10]);break; case 11:SerialSendData(table[11]);break; case 12:SerialSendData(table[12]);break; case 13:SerialSendData(table[13]);break; case 14:SerialSendData(table[14]);break; case 15:SerialSendData(table[15]);break; default:break; } } void InitSerialPort(void) { SDA = 0; SHIFT_CP = 0; ST_CP = 0; } void main() { InitSerialPort(); while(1) { vKeyProcess(ucKeyScan()); delay(500); i=(i+1)%8; } }
相关文章推荐
- 利用汇编语言编程实现在键盘上输入两个一位数,在屏幕上显示它们的积。
- 编程实现由键盘输入一个字符后,在屏幕上输出该字符
- 用80x86汇编语言编程:键盘输入与显示输出
- 基于WinIO 3.0实现驱动级键盘模拟输入
- 7.4.采用穷举法,用函数编程实现计算两个正整数的最小公倍数的函数,在主函数中调用该函数计算并输出从键盘任意输入的两个数的最小公倍数。
- 从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。
- 51 单片机 C 语言编程:矩阵键盘输入,显示在数码管
- 各位大神,求解求解!!小女初接触编程,有多多不解,该程序显示无错误,为什么无论输入a>b还是b>a输出结果均为A>B??
- 编程:从键盘输入一个字符串 最终以读的方式在显示屏输出
- 《第九周任务一》定义Complex类中的《《和》》运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然
- 基于visual c++之windows核心编程代码分析(34)WinIo驱动级模拟按键的实现
- 在VC中实现模拟键盘,输入内容并显示在ListBox中。
- 第九周实验报告 任务2 定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
- linux 2.6 输入子系统 键盘驱动的实现
- Linux2.6内核下键盘输入设备驱动的实现
- 键盘输入的数字在串口调试助手显示,然后再到数码管(C语音版本)
- 记录从键盘输入的字符串,计算字符串的长度并用指针实现对字符串的逆向输出
- linux 2.6 输入子系统之键盘驱动的实现
- 关于一道J笔试或者机试题的Java实现:从键盘输入一串字符,翻转后输出(要求不使用string相关类即对象)
- arm11 Tiny6410 gpio驱动实现输入和输出