#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int
uchar key_vaul=1; uchar code DSY_CODE[]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00 }; uchar code key_code[4][4]={{0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}}; DelayMS(uint ms) { uchar t; while(ms--) { for(t=0;t<1;t++); } }
void key_scan(void) { uchar row,line,tmp1,tmp2; //tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0 P1=0x0f; tmp1=0x10; if(P1!=0x0f) { for(line=0;line<4;line++) // 行检测 { P1 =~tmp1; // 使P1.4~p1.7中有一个为0 tmp1=_crol_(tmp1,1); // tmp1左移一位 if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(row =0;row<4;row++) // 列检测 { if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 { key_vaul =key_code[row][line]; // 获取键值,识别按键;key_Map为按键的定义表 return ; // 退出循环 } tmp2=_crol_(tmp2,1); // tmp2左移一位 } } } } }
void main() { P0 = 0x00; while(1) { key_scan(); P0 = ~DSY_CODE[key_vaul]; DelayMS(1); } }
我想做一个按一次键显示一个数值,但仿真时数值无变化。求解
|