c语言实现单片机的键盘程序.doc
#include "SST89x5x4.H"#include <INTRINS.H>#define uchar unsigned char #define uint unsigned int #define _Nop() _nop_()unsigned char code Key_Value_Table16=0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff;void Key_Init(void);unsigned char GetScanKey(void);unsigned char GetKey(void);void LCD_Init(void);void LCD_Init2(void);/void WriteW(uint a);void CheckBF(void);unsigned char Key_ASC2(unsigned char);void WritD(unsigned char);void Delay_ns(int i);void Delay_ms(int ms);unsigned char key;unsigned char key_asc2;unsigned char bKeyUp_Flag;uchar xdata *ptr;void Key_Init(void) bKeyUp_Flag=1; unsigned char GetScanKey(void)unsigned char key, i, temp;unsigned char xdata * ptr;key=0xff;for (i=1; i<0x10; i<<=1) /i ptr=0x8fff; * ptr =i; temp = * ptr; /temp &= 0x0f; / if (temp!=0x00) / key = i<<4; /key|=temp; / break; return key; / /unsigned char code Key_Value_Table16=0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff;unsigned char GetKey(void)unsigned char key, temp;if (!bKeyUp_Flag) key=GetScanKey();if (key=0xff) bKeyUp_Flag=1;else /return 0xff; key=GetScanKey();if (key=0xff) return key;else / temp=key; /Delay_ms(20); /延时20ms 消抖key=GetScanKey();if(key!=temp) key=0xff;return key;elsetemp=Key_Value_Tablekey>>4; /* if (temp=0xff)key=0xff;return key;temp=Key_Value_Tablekey&0x0f;/*if (temp=0xff)key=0xff;return key;key=Key_Value_Tablekey>>4*4+Key_Value_Tablekey&0x0f;/行对应的中间值的四倍与列对应的中间if (key>15)key=0xff;return key;bKeyUp_Flag=0;return key; void CheckBF(void)int i;while(1)ptr=0xAFF1;/RS=0,R/W=1i=*ptr;i &= 0x80;if(i=0)break;void WriteW(uint a)ptr=0xAFF0; /RS=0,R/W=0*ptr=a;void LCD_Init(void)CheckBF();WriteW(0x38);CheckBF();WriteW(0x01);CheckBF();WriteW(0x06);CheckBF();WriteW(0x0F);CheckBF();WriteW(0x80);unsigned char code ASC2_Value_Table16=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46; unsigned char Key_ASC2(unsigned char key)unsigned char key_asc2;key_asc2=ASC2_Value_Tablekey;return key_asc2;void LCD_Init2(void)CheckBF();WriteW(0x0F);CheckBF();WriteW(0xC0);void WritD(unsigned char key_asc2)CheckBF();ptr=0xAF02;*ptr=key_asc2;void Delay_ns(int i) while(i-)_Nop();_Nop();void Delay_ms(int ms) uint i;while(ms-)for(i = 0; i<250; i+)_Nop();_Nop();_Nop();_Nop();void main() unsigned char key;Key_Init();LCD_Init();while(1)key=GetKey();if (key=0xFF)continue;elsekey=Key_ASC2(key); WriteW(0x01);WritD(key);