微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 矩阵键盘反转扫描(中断触发)数码管新认识

矩阵键盘反转扫描(中断触发)数码管新认识

时间:12-01 来源:互联网 点击:
1、电 路 图

2、效 果 图
3、代 码
4、小 结(数码管)



代 码

#include

sbit dm = P2^2; //段码

sbit wm = P2^3; //位码

sbit led =P3^7;

unsigned char hc[8];

unsigned char jj=0;

unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9

unsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码。显示的位置

void DelayUs2x(unsigned char t)

{

while(--t);

}

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

void sm()

{

unsigned char ii=0;

while(8!=ii && hc[ii]!=0)

{

P1 = 0; //消影

dm = 1;

dm = 0;

P1 = WM[ii]; //写入位码

wm = 1;

wm = 0;

P1 = hc[ii]; //写入段码

dm = 1;

dm = 0;

DelayUs2x(10);

ii++;

}

}

/*以下函数就是反转扫描的精华*/

unsigned char jpsm() //矩阵键盘反转扫描

{

unsigned char i=0; //用于接收按键数值

P0 = 0x0f; //检测低4位

if(0x0f != P0) //检测按键是否按下

{

DelayMs(10); //去抖

if(0x0f != P0) //在次判断按键是否真的按下而不是其他干扰

{

i = P0; //把低4位赋值给i

P0 = 0xf0; //检测高4位

DelayUs2x(5); //稍微延时。。这条语句可以去掉

i = i | P0; //把低4位和高4位组合成完整的按键数值

while( 0xf0 != P0 ) //检测按键是否松开

{

sm();

}

return i; //返回按键数值

}

}

return 0; //按键没有按下返回0

}

unsigned char hcxr(unsigned char i) //按键解码函数

{

switch(i)

{

case 0x77:hc[jj]=DM[0];break; //0

case 0x7e:hc[jj]=DM[1];break; //1

case 0xbe:hc[jj]=DM[2];break; //2

case 0xde:hc[jj]=DM[3];break; //3

case 0x7d:hc[jj]=DM[4];break; //4

case 0xbd:hc[jj]=DM[5];break; //5

case 0xdd:hc[jj]=DM[6];break; //6

case 0x7b:hc[jj]=DM[7];break; //7

case 0xbb:hc[jj]=DM[8];break; //8

case 0xdb:hc[jj]=DM[9];break; //9

/*case 0xee: //+

case 0xed: //-

case 0xeb: //*

case 0xe7: ///

case 0xd7: //=

case 0xb7: //.*/

default :return 0;

}

if(jj<7)

{

jj++;

hc[jj]=0;

}

else

jj=0;

}

void csh_wbzd_0() //初始化外部中断0

{

IT0=0; //外部中断0下降沿触发

EX0=1; //启用外部中断0

EA=1; //打开总中断

}

void wbzd_0() interrupt 0 //外部中断服务函数

{

unsigned char i;

i=jpsm(); //接收按键值

hcxr(i); //按键值解码

}

void main()

{

csh_wbzd_0(); //初始化外部中断0

P0=0xf0; //这里很重要用于中断检测

while(1)

{

sm(); //循环扫描数码管

}

}

小结
1、数码管的缓存数据一般有两个地方 。
1)是在单片机里我们自己声明的。
2)是在锁存器里也有数据。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top