急急急!单片机汇编高手进!!本人这里有考试用的程序,急需要详细注释~最好逐行翻译!先说声谢谢哈~

ORG0000HLJMPSTARTORG000BH;定时器/计数器0中断LJMPTORG0030HSTART:;MOVTCON,#00H;定时器初始化MOVTMOD,#0... ORG 0000H
LJMP START
ORG 000BH ;定时器/计数器0中断
LJMP T
ORG 0030H
START: ;MOV TCON,#00H ;定时器初始化
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV IE,#82H

MOV SP,#60H ;重置堆栈
MOV 50H,#55
MOV 51H,#59
MOV 52H,#23
MOV 53H,#07
MOV R1,#50H
MOV R2,#0FEH
MOV R3,#0
MOV R4,#0
MOV R0,#20
SETB TR0
MAIN: MOV B,#10
MOV A,R2
MOV P2,A
RL A
MOV R2,A

MOV A,@R1
DIV AB
MOV R3,A

MOV A,B
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查段码表
MOV P0,A
LCALL DELAY

MOV A,R2
MOV P2,A
RL A
MOV R2,A

MOV A,R3
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查段码表
MOV P0,A
LCALL DELAY
INC R1
INC R4
CJNE R4,#4,MAIN
MOV R4,#0
MOV R1,#50H
LJMP MAIN
T: MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R0,EXIT
MOV R0,#20
INC 50H
MOV A,50H
CJNE A,#60,EXIT
MOV 50H,#00
INC 51H
MOV A,51H
CJNE A,#60,EXIT
MOV 51H,#00
INC 52H
MOV A,52H
CJNE A,#24,EXIT
MOV 52H,#00
INC 53H
MOV A,53H
CJNE A,#08,EXIT
MOV 53H,#01
EXIT: RETI
DELAY: MOV R5,#10
DELAY1: MOV R6,#1
DELAY2: MOV R7,#20
DJNZ R7,$
DJNZ R6,DELAY2
DJNZ R5,DELAY1
RET
TAB: DB 3FH,06H,05BH,04FH,66H,6DH,7DH,07H ;段码表
; 0 1 2 3 4 5 6 7 对应内容
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
; 8 9 A B C D E F
end
展开
 我来答
613xnkuzt
2011-06-15 · TA获得超过932个赞
知道小有建树答主
回答量:1409
采纳率:50%
帮助的人:594万
展开全部
下列程序已经调好,按键显示电路可见:

//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//两位数码显示器: P0口输出七段码,P2口输出位选码。
/========================================
//C语言程序如下。
/*************************************************************
* 文件名: KEY_LED.c
* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
**************************************************************/
#include <reg51.h>
#include <intrins.h>
#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; //计划先判断P1.0位
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;
}
}
/*************************************************************/
追问
呵呵~谢谢!有心了!O(∩_∩)O~
唯一不足的就是我们考试要求用汇编~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式