单片机键盘输入数字

单片机键盘输入数字,第1张

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

#define DD P0

sbit Rs=P0^0;

sbit Rw=P0^1;

sbit E=P0^2;

uchar key_led;

unsigned char code disp_code[]=;

unsigned char code key_code[]={

0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };//注意这里你自己看下你电路是怎么连得,对应改一下表单里的值

//

/

/

/ 延时子程序

/

/

/

//

void delay(int ms)

{

int i;

while(ms--)

{

for(i = 0; i< 250; i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

void delay_1ms(unsigned char i) //最小延时1ms

{ unsigned char j;

while(i--)

for(j=0;j<125; j++);

}

void delay_10ns(unsigned char i) //最小延时10ns

{

unsigned char j;

while(i--)

for(j=0;j<10; j++);

}

void write_com(unsigned char com,bit p) //写指令

{if(p)

delay_10ns(5);

E=0;

Rs=0;

Rw=0;

DD=com;

delay_10ns(50); //>40ns

E=1;

delay_1ms(2); //>150ns

E=0;

delay_10ns(4); //>25+10ns

}

void write_date(unsigned char DATA) //写数据

{

delay_10ns(50);

E=0;

Rs=1;

Rw=0;

DD=DATA;

delay_10ns(50);

E=1;

delay_10ns(50);

E=0;

delay_10ns(4);

}

void addr_x_y(unsigned char x,bit y) //写坐标,定位置

{

unsigned char temp=0x80;

if(y)

{

temp|=0x40;

}

temp|=x;

write_com(temp,0);

}

void desplay_char(unsigned char x,bit y,unsigned char p)

//在指定位置显示一个字符。

{

addr_x_y(x,y);

write_date(p);

}

void lcd_init(void)

{

delay_1ms(15);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,0);

delay_1ms(5);

write_com(0x38,1);

write_com(0x08,1);

write_com(0x01,1);

write_com(0x06,1);

write_com(0x0c,1);

}

/

键盘扫描子函数

/

uchar keyscan()

{

uchar scan1,scan2,keycode,j;

P1=0xf0;

scan1=P1;

if((scan1&0xf0)!=0xf0) //判键是否按下

{

delay(30); //延时30ms

scan1=P1;

if((scan1&0xf0)!=0xf0) //二次判键是否按下

{

P1=0x0f;

scan2=P1;

keycode=scan1|scan2; //组合成键编码

for(j=0;j<=15;j++)

{

if(keycode== key_code[j]) //查表得键值

{

delay(30);

key_led=j;

}

}

}

}

else return(16) ;

}

/

判键是否按下子函数

/

void keydown()

{

P1=0xf0;

if((P1&0xf0)!=0xf0)

{

keyscan();

}

}

//

/

/

/ 主程序

/

/

/

//

void main(void)

{

lcd_init(); // 初始化LCD

key_led=16;

while(1)

{

keydown();

desplay_char(0,0,disp_code[key_led]);

}

}

第一次认真回答,不采纳没有小鸡鸡。。。。。。。。。。

#include <reg52H>

#include<intrinsh>

#define uint unsigned int

#define uchar unsigned char

//心形显示

//unsigned char code tabP0[]={0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00};

//unsigned char code tabP2[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};

//圆形显示

unsigned char code tabP0[]={0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00};

unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

//菱形显示

//unsigned char code tabP0[]={0x00,0x08,0x14,0x22,0x41,0x22,0x14,0x08};

//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

//叉形显示

//unsigned char code tabP0[]={0x00,0x41,0x22,0x14,0x08,0x14,0x22,0x41};

//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

//中字显示

//unsigned char code tabP0[]={0x00,0x1e,0x12,0x12,0x7f,0x12,0x12,0x1e};

//unsigned char code tabP2[]={0x7F,0xBF,0x0DF,0x0EF,0x0F7,0x0FB,0x0FD,0x0FE};

/

名称 : Delay_1ms()

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

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

输出 : 无

/

void Delay_1ms(uchar i)//1ms延时

{

uchar x,j;

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

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

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void main()

{

int i;

while(1)

{

for(i=0;i<8;i++)

{

P0=0;

P2=tabP2[i];

P0=tabP0[i];

Delay_1ms(2);

}

}

}

下列程序已经调好,按键显示电路可见:

//单片机:使用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] = ;

uchar sec, t_50ms;

/

名称 : 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++);

}

/

名称: 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个位

}

/

名称: Keyscan()

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

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

/

uchar Keyscan(void)

{

uchar i, j, temp, Buffer[4] = ;

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行,就是这么简练!

/

名称: GetKey()

功能: 读出按键、消抖、等待按键释放

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

/

uchar GetKey(void)

{

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

P1 = 0xff;

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

if(Key_Temp1 == 16) return 16; //没有键按下,返回16

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

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

if(Key_Temp1 != Key_Temp2) return 16; //不同,返回16

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

Display(sec); //等待期间显示

return Key_Temp1;

}

/

名称 : Main()

功能 : 主函数

/

void Main(void)

{

uchar Key_Value; //读出的键值

sec = 0;

TMOD = 0x01;

TH1 = (65536-50000)/256;

TL1 = (65536-50000)%256;

TR0 = 1;

ET0 = 1;

EA = 1;

while(1) {

Display(sec); //显示

if (GetKey() == 10) {

TR0 = 0;

while (TR0 == 0) {

Display(sec); //显示

Key_Value = GetKey();

if (Key_Value < 10) {

sec %= 10;

sec = sec 10 + Key_Value;

}

if (Key_Value == 10) TR0 = 1;

} } }

}

/

名称 : T0_INT()

功能 : T0中断函数

/

void T0_INT() interrupt 1

{

TH1 = (65536-50000)/256;

TL1 = (65536-50000)%256;

t_50ms++;

if(t_50ms >= 20) {

t_50ms = 0;

sec++;

sec %= 60;

}

}

//

写程序之前一定要先从系统的级别构建一下程序的结构。

你的程序中,有数码管扫描显示、按键扫描两部分。

在构建程序结构的时候,考虑到几个部分的特点,一般情况如下:

1、为了保证显示不闪,应在20ms内完成一次显示刷新,假设你用了10个数码管数字。

2、按键是随机的,需要检测,一般按键按下的时间不小于50ms,可以考虑在10ms检测一次按键。

程序可以定义一个1ms的定时器,设置几个变量对定时器进行计数。

每个1ms定时到时,自加对定时器的计数,并更新数码管显示,10ms更新完10个数码管。

每到10ms检测一次按键,记录状态,与上次状态进行比较,如果连续两次或三次检测到按键按下,设置按键动作的标记,并确定如何更改显示,改变显存。

如果数码管需要调整亮度,可以将1ms定时器改为100us,分给每个数码管的1ms内,改变其点亮的时间,就可以调出十种亮度。

用这种架构做这个程序,处理器负担很轻,对所有的外设的响应一样迅速。你会感到51单片机还是能干很多活的。比如你的程序增加一个RTC模块,可以每100ms刷新一下RTC时间到显存,就可以实现显示时间。

程序功能能否实现你自己验证,先把错误给你改了,已编译通过。#include<reg51h>#include<intrinsh>#define

dig

P2#define

uint

unsigned

int#define

uchar

unsigned

char

codeuchar

number[10]={0xc0,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbit

K1=P0^0;sbit

K2=P0^1;//10sbit

K3=P0^2;sbit

K4=P0^3;sbit

K5=P0^4;sbit

K6=P0^5;sbit

K7=P0^6;sbit

K8=P0^7;void

anjian();//这里没分号void

yanshi(uint

nms);void

main()//20{P0=0xff;//初始化anjian();//这里多void

少分号}/按键程序/

//30void

anjian(){uint

i;//这以后的错误是变量i没定义if(K1==0){yanshi(10);if(K1==0){dig=number[1];while((K1==0)&&(i<50)){//40yanshi(10);i++;}i=0;}}if(K2==0){yanshi(10);if(K2==0)//50{dig=number[2];while((K2==0)&&(i<50)){yanshi(10);i++;}i=0;}}//60if(K3==0){yanshi(10);if(K3==0){dig=number[3];while((K3==0)&&(i<50)){yanshi(10);i++;//70}i=0;}}if(K4==0){yanshi(10);if(K4==0){dig=number[4];//80while((K4==0)&&(i<50)){yanshi(10);i++;}i=0;}}if(K5==0){//90yanshi(10);if(K5==0){dig=number[5];while((K5==0)&&(i<50)){yanshi(10);i++;}i=0;//100}}if(K6==0){yanshi(10);if(K6==0){dig=number[6];while((K6==0)&&(i<50)){//110yanshi(10);i++;}i=0;}}if(K7==0){yanshi(10);if(K7==0)//130{dig=number[7];while((K7==0)&&(i<50)){yanshi(10);i++;}i=0;}}//140if(K8==0){yanshi(10);if(K8==0){dig=number[8];while((K8==0)&&(i<50)){yanshi(10);i++;//150}i=0;}}}/延时子程序/void

yanshi(uint

xms)//160{uint

a,b;for(a=xms;a>0;a--)for(b=110;b>0;b--);}

以上就是关于单片机键盘输入数字全部的内容,包括:单片机键盘输入数字、求 51单片机 4*4矩阵键盘 控制8*8点阵 显示 的语音 程序。、用汇编语言实现3*3键盘(1-9),当相应键按下时,LED上显示相应数值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存