
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上显示相应数值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)