编写汇编程序,利用led灯亮暗表示按键按下次数,按一次加一,用二进制

编写汇编程序,利用led灯亮暗表示按键按下次数,按一次加一,用二进制,第1张

LED EQU P0

KEY EQU P10

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV LED,#0

CLR A

LOOP:

JB KEY,$

JNB KEY,$

INC A

MOV LED,A

SJMP LOOP

END

如果是8086汇编,调用DOS中断就可以了,int 21h,ah=0a时输入,ah=09时输出

如:

assume cs:code, ds:data

data segment

buffer db 256, 00

buf_con db 256 dup(0), '$'

data ends

code segment

start:

mov ax, data

mov ds, ax

mov dx, buffer

mov ah, 0a

int 21h

mov dx, buf_con

mov ah, 09

int 21h

mov ax, 4c00h

int 21h

code ends

end start

汇编语言的科学定义,其实就是介于机器码(各种01)和高级语言(如C)之间的一种语言。你用C语言写一段程序,其实要在机器上运行的话,机器是不懂的,要经过编译器、汇编器编译,变成汇编,最终再变成机器码,机器根据这些机器码的01可以控制硬件电路完成你程序想执行的 *** 作。

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

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

}

}

//

有问题,当按下多个按键时,消抖都没用了。有计数法,但是需要消耗的内存。可以识别具体的键位,键的按下d起状态,消抖。每个按键状态独立识别,无需等待延时。typedefenum{Key_No,Key_Down,Key_Up,}KeyStateEnum;vkey[4]={0};//4组按键ucharkeyDownNum[16]={0};//按下计数ucharkeyDownUp[16]={0};//d起计数//判断键状态ucharstateKey(ucharkeySta,uchardownNum,ucharupNum,uchardel){ucharsta=Key_No;if(keySta){upNum[0]=0;if(downNum[0]==del){sta=Key_Down;}if(downNum[0]>4);}}voidmain(){while(1){Readkey();//ScanKey();}}

//晶振12M

KEY  BIT  P32   ;按键接P32

LED_bits BIT P31;个位显示控制端

LED_ten  BIT  P30;十位显示控制端

DATA_bits   DATA    30H;个位

DATA_ten    DATA    31H;十位

ORG   00H

LJMP  MAIN

ORG  30H

MAIN: ;主程序

SETB LED_bits

SETB LED_ten

SETB KEY

MOV DATA_bits,#0

MOV DATA_ten,#0

LOOP:

ACALL DISPLAY;显示

ACALL KEY_COUNT;键控

LJMP LOOP

KEY_COUNT:;键控计数

JB KEY, KEY_END

ACALL DELAY10MS

JNB  KEY,$

ACALL COUNT

KEY_END:

RET

COUNT:  ;计数

INC DATA_bits

MOV A,DATA_bits

CJNE A,#10,COUNT_END

MOV DATA_bits,#0

INC DATA_ten

MOV A,DATA_ten

CJNE A,#10,COUNT_END

MOV DATA_ten,#0

COUNT_END:

RET

DISPLAY: ;显示

MOV A,DATA_bits

MOV DPTR,#LEDSHOW

MOVC A,@A+DPTR

MOV P2,A

CLR LED_bits

ACALL DELAY1MS

SETB LED_bits

MOV A,DATA_ten

MOV DPTR,#LEDSHOW

MOVC A,@A+DPTR

MOV P2,A

CLR LED_ten

ACALL DELAY1MS

SETB LED_ten

RET

DELAY10MS:   ;误差 0us

MOV R7,#01H

DL1:

MOV R6,#26H

DL0:

MOV R5,#82H

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

RET

DELAY1MS:   ;误差 0us

MOV R7,#01H

DL3:

MOV R6,#8EH

DL2:

MOV R5,#02H

DJNZ R5,$

DJNZ R6,DL2

DJNZ R7,DL3

RET

LEDSHOW:

DB        03FH;0

DB        006H;1

DB        05BH;2

DB        04FH;3

DB        066H;4

DB        06DH;5

DB        07DH;6

DB        007H;7

DB        07FH;8

DB        06FH;9

END

#include <stdioh>

void main()

{

char i='a';

char I='A';

for(;i<='z';i++)

{

printf("%c 十进制:%d 八进制:%o 十六进制:%x \n",i,i,i,i);

}

for(;I<='Z';I++)

{

printf("%c 十进制:%d 八进制:%o 十六进制:%x \n",I,I,I,I);

}

}

以上就是关于编写汇编程序,利用led灯亮暗表示按键按下次数,按一次加一,用二进制全部的内容,包括:编写汇编程序,利用led灯亮暗表示按键按下次数,按一次加一,用二进制、汇编语言输入命令怎么编,就是从键盘上能直接敲入 屏幕能显示、用汇编语言实现3*3键盘(1-9),当相应键按下时,LED上显示相应数值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存