51单片机c语言编程子函数调用问题 程序功能是实现四个独立按键控制数码管四个位的段选来动态扫描

51单片机c语言编程子函数调用问题 程序功能是实现四个独立按键控制数码管四个位的段选来动态扫描,第1张

你的显示子程序的名称是:

void DigDispaly()

可是在主程序调用时,却写成了

DigDisplay();

比较一下,这两个一样吗,难道都不是你自己写的吗?

首先调用键盘扫描程序,返回按键值,要是4X4矩阵,键值最好设置为0~F,即十进制数的0~15,不按键时,返回16。这样,如果返回值为16,就是没有按键,不作任何处理。通常前十个键为数字键0~9,其余6个可定义成功能键,这6个功能可以随便定义的,如果按键上有字符最好,例如,你要的清屏,要写一个清屏的子程序,凡是功能键对应的功能都要写成一个子程序。调用键盘程序,判断返回的键值,小于10为数字键,用于输入数字。大于9为功能键,假如定义键值等于10的为清屏键,则写成

if(key_num==10){ clear_lcd ( ); }//清屏

else if(key_num==11){ //定义另一个功能 }

依此类推

//电路说明如下。

//单片机:使用51系列兼容的即可;

//4×4矩阵键盘:接在P1口;

//两位数码显示器: P0口输出七段码,P2口输出位选码。

//==============================================================

//C语言程序如下。

/

文件名: KEY_LEDc

功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。

/

#include <reg51h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

/

名称 : Delay_1ms()

功能 : 延时子程序,延时时间为 1ms x

输入 : x (延时一毫秒的个数)

输出 : 无

/

void Delay_1ms(uint x)

{

uint i;

uchar j;

for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);

}

/

名称: Keyscan()

功能: P1外接4×4按键, 按照扫描法读出键值

输出: 按键值0~15/如无键按下, 返回16

/

uchar Keyscan(void)

{

uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};

for(j = 0; j < 4; j++) { //循环四次

P1 = Buffer[j]; //在P1高四位分别输出一个低电平

temp = 0x01; //计划先判断P10位

for(i = 0; i < 4; i++) { //循环四次

if(!(P1 & temp)) //从P1低四位,截取1位

return (i + j 4); //返回取得的按键值

temp <<= 1; //判断的位,左移一位

} }

return 16; //判断结束,没有键按下,返回16

} //呵呵,实质性的语句不过8行,就是这么简练!

/

名称: Display(uchar k)

功能: 将参数分成十位、个位分别显示

输入: k (键盘数值)

输出: P0口输出七段码,P2口输出位选码

/

void Display(uchar k)

{

P2 = 0; //消隐

P0 = table[k / 10];

P2 = 0x02; Delay_1ms(5); //显示5ms十位

P2 = 0; //消隐

P0 = table[k % 10];

P2 = 0x01; Delay_1ms(5); //显示5ms个位

}

/

名称 : Main()

功能 : 主函数

/

void Main(void)

{

uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值

while(1) {

//---------以下读入按键、消掉、等待按键释放

P1 = 0xff;

Key_Temp1 = Keyscan(); //先读入按键

if(Key_Temp1 != 16) { //如果有键按下

//Delay_1ms(10); //延时一下

Display(Key_Value); //可用显示代替延时

Key_Temp2 = Keyscan(); //再读一次按键

if (Key_Temp1 == Key_Temp2)//必须是两次相等

Key_Value = Key_Temp1; //才保存下来,这就是消除抖动

while(Keyscan() <= 16); //等待按键释放

}

//---------以下是对按键的处理

Display(Key_Value); //显示键值

}

}

定义一个按键缓冲区

用普通的按键扫描程序,当扫描到有按键按下的时候。按键键的值写入缓冲区。继续扫描直到完成。

然后返回缓冲区地址就可以得到多个按键的数据了。

这样只要定义16字节的缓冲区全部按键都能检测到。(一般不需要那么多6个足够)

还有一种方式 是 如果只返回2个按键的话。

可以这样

常规按键扫描 返回范围在0-15也就是0-F

读取到一个值后把这个值左移4位

再继续读取。当读取到第二个值的时候与上第一个值。就能获取2个按键的值了。

以上就是关于51单片机c语言编程子函数调用问题 程序功能是实现四个独立按键控制数码管四个位的段选来动态扫描全部的内容,包括:51单片机c语言编程子函数调用问题 程序功能是实现四个独立按键控制数码管四个位的段选来动态扫描、矩阵键盘反转法行列扫描,怎么给单个按键定义功能,如按下一个键数码管有清屏效果、关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误,请各位帮帮忙,把错误给修改下。谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9412404.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存