#include #include <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
/********************/ unsigned char table[]= {0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管 0-9 表 /********************/ sbit seclet_A = P1^0; //管脚定义 74-138 3-8 控制信号线 sbit seclet_B = P1^1; sbit seclet_C = P1^2; /********************/ //宏定义 #define SM_1 seclet_C=0;seclet_B=0;seclet_A=0 #define SM_2 seclet_C=0;seclet_B=0;seclet_A=1 #define SM_3 seclet_C=0;seclet_B=1;seclet_A=0 #define SM_4 seclet_C=0;seclet_B=1;seclet_A=1 #define SM_5 seclet_C=1;seclet_B=0;seclet_A=0 #define SM_6 seclet_C=1;seclet_B=0;seclet_A=1 #define SM_7 seclet_C=1;seclet_B=1;seclet_A=0 #define SM_8 seclet_C=1;seclet_B=1;seclet_A=1
bit flag; //定义中断 标志位 //==================================键盘程序 code unsigned char key_tab[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7, 0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};
unsigned char ReadKey(void); //扫描键盘 返回键值
//============= void main(void) { EA="1"; //开启总中断 EX0=1; //开启外部中断 0 IT0=1; // 设置成 下降沿触发方式 SM_1; while(1) { P0=0XF0; //预置P0 口准备读取键值 if(flag) //检测时候 进入中断 { P2=table[ReadKey()]; //读取键值,并附给P2口显示 flag=0; //清除 标志位 } } } //========**************===== void key_scan() interrupt 0 //外部中断 0 的优先级最高 { // 所以用 0 flag=1; //置标志位为 1 } //========**************===== //这个程序有一定的难度 unsigned char ReadKey(void) { unsigned char i,j,key; j=0xfe; //预置 准备 扫描 for(i=0;i<4;i++) //循环四次 扫描 { P0=j; //附值给P0 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if((P0&0xf0)!=0xf0) //如果有按键 按下 { key=P0; //读取键值 break; //跳出for 循环 或者 while 循环 } j=_crol_(j,1); //循环左移 处理 key="0xff"; } for(i=0;i<16;i++) //循环16次 查表的到相应的键值 if(key==key_tab) return i; //返回键值
return 0x10; //否则 返回错码 } |
文章评论(0条评论)
登录后参与讨论