单片机C语言按键开关程序

单片机C语言按键开关程序,第1张

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

void delay_ms(uint)

sbit led0=P0^0

sbit led1=P0^1

sbit key1=P3^2

sbit key2=P3^3

void main()

{

   uchar i=0

   uchar j=0

    while(1)

    {

       if(key1==0)//按键1

       {

        delay_ms(10)

        if(key1==0)

        {

            i++

            i=i%2

            switch(i)

            {

                 case 0: led0=1 break//关小灯

                 case 1: led0=0 break//开小灯

                 default:  break

            }

        }

        while(!key1)

        }

        

        if(key2==0)//按键2

       {

        delay_ms(10)

        if(key2==0)

        {

            j++

            j=j%2

            switch(j)

            {

                 case 0: led1=1 break//关小灯

                 case 1: led1=0 break//开小灯

                 default:  break

            }

        }

        while(!key2)

        }

    }

}

void delay_ms(uint z)  //延时子程序

{  

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

if(keypress==true)检测有键按下 {delay_us(50) 延迟50us,软件滤波防抖动if(keypress==true) 检测有键被按下 key_value=P1提取键值 {switch(key_value) 识别是那个键被按下了 case 0x01: XXX;breakcase 0x02:XXXBREAK进入对应工步或者动作即可。 ...... } } }

P1口接键盘进行扫描,P2口接数码管的位码,P0口接数码管的段码

ORG 0000H

LJMP START

ORG 0030H

START:

MOV 30H,#10H 第8个数码管显示数据缓存寄存器

MOV 31H,#10H 第7个数码管显示数据缓存寄存器

MOV 32H,#10H 第6个数码管显示数据缓存寄存器

MOV 33H,#10H 第5个数码管显示数据缓存寄存器

MOV 34H,#10H 第4个数码管显示数据缓存寄存器

MOV 35H,#10H 第3个数码管显示数据缓存寄存器

MOV 36H,#10H 第2个数码管显示数据缓存寄存器

MOV 37H,#10H 第1个数码管显示数据缓存寄存器

MAIN:

LCALL SAOMIAO 调用键盘扫描寄存器

LCALL DISPLAY 调用显示寄存器

LJMP MAIN

SAOMIAO:

MOV P1,#11111110B 将P1.4-P1.7口做为输入检测口,屏蔽P1.0-P1.3三行按键,扫描P0.0行的按键

JNB P1.4,A0第一行第一个按键被按下,则跳至A0

JNB P1.5,A1第一行第二个按键被按下,则跳至A1

JNB P1.6,A2第一行第三个按键被按下,则跳至A2

JNB P1.7,A3第一行第四个按键被按下,则跳至A3

MOV P1,#11111101B 扫描P0.1接的第二行

JNB P1.4,A4第二行第一个按键被按下,则跳至A4

JNB P1.5,A5

JNB P1.6,A6

JNB P1.7,A7

MOV P1,#11111011B

JNB P1.4,A8

JNB P1.5,A9

JNB P1.6,A10

JNB P1.7,A11

MOV P1,#11110111B

JNB P1.4,A12

JNB P1.5,A13

JNB P1.6,A14

JNB P1.7,A15

RET

A0:

LJMP AN0 由于JNB指令的跳转范围仅为8位,所以用LJMP跳入按键处理子程序

A1:

LJMP AN1

A2:

LJMP AN2

A3:

LJMP AN3

A4:

LJMP AN4

A5:

LJMP AN5

A6:

LJMP AN6

A7:

LJMP AN7

A8:

LJMP AN8

A9:

LJMP AN9

A10:

LJMP AN10

A11:

LJMP AN11

A12:

LJMP AN12

A13:

LJMP AN13

A14:

LJMP AN14

A15:

LJMP AN15

AN0:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.4,AN0 按键消抖

MOV 3FH,#0 将按键值送入按键缓存寄存器

LJMP YIDONG调用移动子程序

AN1:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.5,AN1

MOV 3FH,#1

LJMP YIDONG

AN2:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.6,AN2

MOV 3FH,#2

LJMP YIDONG

AN3:

LCALL DISPLAY

MOV P1,#11111110B

JNB P1.7,AN3

MOV 3FH,#3

LJMP YIDONG

AN4:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.4,AN4

MOV 3FH,#4

LJMP YIDONG

AN5:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.5,AN5

MOV 3FH,#5

LJMP YIDONG

AN6:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.6,AN6

MOV 3FH,#6

LJMP YIDONG

AN7:

LCALL DISPLAY

MOV P1,#11111101B

JNB P1.7,AN7

MOV 3FH,#7

LJMP YIDONG

AN8:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.4,AN8

MOV 3FH,#8

LJMP YIDONG

AN9:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.5,AN9

MOV 3FH,#9

LJMP YIDONG

AN10:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.6,AN10

MOV 3FH,#10

LJMP YIDONG

AN11:

LCALL DISPLAY

MOV P1,#11111011B

JNB P1.7,AN11

MOV 3FH,#11

LJMP YIDONG

AN12:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.4,AN12

MOV 3FH,#12

LJMP YIDONG

AN13:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.5,AN13

MOV 3FH,#13

LJMP YIDONG

AN14:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.6,AN14

MOV 3FH,#14

LJMP YIDONG

AN15:

LCALL DISPLAY

MOV P1,#11110111B

JNB P1.7,AN15

MOV 3FH,#15

LJMP YIDONG

YIDONG: 移动子程序,将数码管数字向左移动一位

MOV 37H,36H

MOV 36H,35H

MOV 35H,34H

MOV 34H,33H

MOV 33H,32H

MOV 32H,31H

MOV 31H,30H

MOV 30H,3FH

RET

DISPLAY:

MOV DPTR,#TAB

MOV A,30H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11101111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,31H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11011111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,32H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#10111111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,33H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#01111111B

LCALL DELAY

MOV DPTR,#TAB

MOV A,34H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111110B

LCALL DELAY

MOV DPTR,#TAB

MOV A,35H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111101B

LCALL DELAY

MOV DPTR,#TAB

MOV A,36H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11111011B

LCALL DELAY

MOV DPTR,#TAB

MOV A,37H

MOVC A,@A+DPTR

MOV P0,A

MOV P2,#11110111B

LCALL DELAY

RET

TAB:

DB 03H 9FH 25H 0DH 99H 49H 41H 1FH 03H到071H是表示0到F

DB 01H 19H 11H 0C1H 0E5H 85H 21H 71H

DB 0FFH“0”——“F”再加上不显示,一共十七个代码

DELAY:

MOV R6,#5

D1:

MOV R7,#255

DJNZ R7,$

DJNZ R6,D1

RET


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

原文地址: http://outofmemory.cn/yw/11847122.html

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

发表评论

登录后才能评论

评论列表(0条)

保存