用汇编语言 在msc-51单片机的p0、p2口,设计一个8位led数码管显示器,动态显示方式;在p1口,设计一个8个按键的独立式键盘控制;上电或复位后显示信息 “p.“ 设计要求: (1)按下某个按键,“p.”从左往右,按照秒频率循环移动; (2)、按下某个按键,“p.”从右往左,按照秒频率循环移动; (3)、按下某个按键,"p"在原始位置,按照秒频率闪烁; (4)、按下某个按键“p”在原始位置常亮,“”按照秒频率闪烁; (5)、假设键盘上的8个按键,分别代表数字键 “0” 、“1”、“2” 、“3”、“4”、“5”、“6”、“7”,则要求在连续按下不同数字按键时,从右往左以此显示按下的数字键键值; (6)、假设键盘上的8个按键,分别代表数字键 “0” 、“1”、“2” 、“3”、“4”、“5”、“6”、“7”,则要求在连续按下不同数字按键时,从左往右以此显示按下的数字键键值。


下面是一个用汇编语言实现上述要求的示例程序: ``` ORG 0 ; 程序起始地址 MOV P0, #0FFH ; 设置 P0 口为输出口 MOV P2, #0FFH ; 设置 P2 口为输出口 MOV P1, #0FFH ; 设置 P1 口为输入口 MOV TMOD, #01H ; 设置计时器 0 为模式 1 MAIN: MOV A, P1 ; 读取 P1 口状态 CPL A ; 取反,使按键按下时 A=0 JB KEY_0, P0_LEFT_TO_RIGHT ; 如果按下 KEY_0,则执行从左往右的移动 JB KEY_1, P0_RIGHT_TO_LEFT ; 如果按下 KEY_1,则执行从右往左的移动 JB KEY_2, P0_BLINK ; 如果按下 KEY_2,则执行闪烁 JB KEY_3, P0_STEADY_BLINK ; 如果按下 KEY_3,则执行常亮 JB KEY_4, P0_SHOW_KEY ; 如果按下 KEY_4,则显示按键键值从右往左 JB KEY_5, P0_SHOW_KEY_RIGHT ; 如果按下 KEY_5,则显示按键键值从左往右 JMP MAIN ; 循环读取按键状态 P0_LEFT_TO_RIGHT: MOV P0, #01H ; 设置 P0 口的最低位置高电平 ACALL DELAY ; 延时 MOV P0, #02H ; 设置 P0 口的次低位置高电平 ACALL DELAY ; 延时 MOV P0, #04H ; 设置 P0 口的中间位置高电平 ACALL DELAY ; 延时 MOV P0, #08H ; 设置 P0 口的次高位置高电平 ACALL DELAY ; 延时 MOV P0, #10H ; 设置 P0 口的最高位置高电平 ACALL DELAY ; 延时 JMPS P0_LEFT_TO_RIGHT ; 无限循环 P0_RIGHT_TO_LEFT: MOV P0, #10H ; 设置 P0 口的最高位置高电平 ACALL DELAY ; 延时 MOV P0, #08H ; 设置 P0 口的次高位置高电平 ACALL DELAY ; 延时 MOV P0, #04H ; 设置 P0 口的中间位置高电平 ACALL DELAY ; 延时 MOV P0, #02H ; 设置 P0 口的次低位置高电平 ACALL DELAY ; 延时 MOV P0, #01H ; 设置 P0 口的最低位置高电平 ACALL DELAY ; 延时 JMPS P0_RIGHT_TO_LEFT ; 无限循环 P0_BLINK: SETB P0 ; 设置 P0 口为高电平 ACALL DELAY ; 延时 CLR P0 ; 设置 P0 口为低电平 ACALL DELAY ; 延时 JMPS P0_BLINK ; 无限循环 P0_STEADY_BLINK: MOV P0, #01H ; 设置 P0 口为高电平 ACALL DELAY ; 延时 ACALL DELAY ; 延时 ACALL DELAY ; 延时 ACALL DELAY ; 延时 CLR P0 ; 设置 P0 口为低电平 ACALL DELAY ; 延时 ACALL DELAY ; 延时 ACALL DELAY ; 延时 ACALL DELAY ; 延时 JMPS P0_STEADY_BLINK ; 无限循环 P0_SHOW_KEY: MOV A, P1 ; 读取 P1 口状态 JNB KEY_0, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_0 没有按下,则显示“0” MOV P0, #01H ; 如果 KEY_0 按下,则显示“1” ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 TICK_TO_LEFT_FROM_RIGHT: JNB KEY_1, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_1 没有按下,则显示“1” MOV P0, #02H ; 如果 KEY_1 按下,则显示“2” ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 TICK_TO_LEFT_FROM_RIGHT: JNB KEY_2, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_2 没有按下,则显示“2” MOV P0, #04H ; 如果 KEY_2 按下,则显示“3” ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 TICK_TO_LEFT_FROM_RIGHT: JNB KEY_3, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_3 没有按下,则显示“3” MOV P0, #08H ; 如果 KEY_3 按下,则显示“4” ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 TICK_TO_LEFT_FROM_RIGHT: JNB KEY_4, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_4 没有按下,则显示“4” MOV P0, #10H ; 如果 KEY_4 按下,则显示“5” ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 TICK_TO_LEFT_FROM_RIGHT: JNB KEY_5, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_5 没有按下,则显示“5” MOV P0, #20H ; 如果 KEY_5 按下,则显示“6” ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 TICK_TO_LEFT_FROM_RIGHT: JNB KEY_6, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_6 没有按下,则显示“6” MOV P0, #40H ; 如果 KEY_6 按下,则显示“7” ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 TICK_TO_LEFT_FROM_RIGHT: JNB KEY_7, TICK_TO_LEFT_FROM_RIGHT ; 如果 KEY_7 没有按下,则显示“7” CLR P0 ; 如果 KEY_7 按下,则不显示 ACALL DELAY ; 延时 JMP P0_SHOW_KEY ; 继续循环 P0_SHOW_KEY_RIGHT: MOV A, P1 ; 读取 P1 口状态 JNB KEY_7, TICK_TO_RIGHT ; 如果 KEY_7 没有按下,则显示“7” CLR P0 ; 如果 KEY_7 按下,则不显示 ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 TICK_TO_RIGHT: JNB KEY_6, TICK_TO_RIGHT ; 如果 KEY_6 没有按下,则显示“6” MOV P0, #40H ; 如果 KEY_6 按下,则显示“6” ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 TICK_TO_RIGHT: JNB KEY_5, TICK_TO_RIGHT ; 如果 KEY_5 没有按下,则显示“5” MOV P0, #20H ; 如果 KEY_5 按下,则显示“5” ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 TICK_TO_RIGHT: JNB KEY_4, TICK_TO_RIGHT ; 如果 KEY_4 没有按下,则显示“4” MOV P0, #10H ; 如果 KEY_4 按下,则显示“4” ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 TICK_TO_RIGHT: JNB KEY_3, TICK_TO_RIGHT ; 如果 KEY_3 没有按下,则显示“3” MOV P0, #08H ; 如果 KEY_3 按下,则显示“3” ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 TICK_TO_RIGHT: JNB KEY_2, TICK_TO_RIGHT ; 如果 KEY_2 没有按下,则显示“2” MOV P0, #04H ; 如果 KEY_2 按下,则显示“2” ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 TICK_TO_RIGHT: JNB KEY_1, TICK_TO_RIGHT ; 如果 KEY_1 没有按下,则显示“1” MOV P0, #02H ; 如果 KEY_1 按下,则显示“1” ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 TICK_TO_RIGHT: JNB KEY_0, TICK_TO_RIGHT ; 如果 KEY_0 没有按下,则显示“0” MOV P0, #01H ; 如果 KEY_0 按下,则显示“0” ACALL DELAY ; 延时 JMP P0_SHOW_KEY_RIGHT ; 继续循环 DELAY: MOV TH0, #0 ; 设置定时器 0 的初始值 MOV TL0, #0 ; 设置定时器 0 的初始值 SETB TR0 ; 启动定时器 0 WAIT: JNB TF0, WAIT ; 等待定时器 0 溢出 CLR TF0 ; 清除定时器 0 溢出标志 RET ; 返回 ; 定义按键值的常量 KEY_0 EQU P1.0 KEY_1 EQU P1.1 KEY_2 EQU P1.2 KEY_3 EQU P1.3 KEY_4 EQU P1.4 KEY_5 EQU P1.5 KEY_6 EQU P1.6 KEY_7 EQU P1.7 END ``` 请注意,以上汇编代码是针对 MSC-51 单片机(也称为 8051 单片机)的,所以可能需要根据具体的单片机型号的特性做一些适当的调整。此外,代码中使用了一些特定的寄存器、端口以及定时器等,这些也需要根据实际硬件进行相应的修改。最后,还需要对代码进行适当的调试和测试,确保其在指定硬件上运行正常。 [2024-11-27 19:25:23 | AI写代码神器 | 3929点数解答]
- 外部中断 0 由边沿触发,控制 P2 口的 8 个发光二极管依次点亮。C51 程序如下: #include <reg51.h> void ex0_isr() interrupt 0 { static unsigned char led = 0x01; P2 = led; led = (led << 1) | (led >> 7); } void main() { IT0 = 1; EX0 = 1; EA = 1; P2 = 0x01; while(1); } (228点数解答 | 2025-06-22 23:18:42)55
- 循环点亮 led 灯: (1) 使用定时器to 的方式 1,实现 8个 led 由上至下间隔 1s 流动,其中每个 led 亮 0.5s,灭0.5s,一直重复。。 (2) 使用定时器 to 的方式 1,实现 8个 led 逐个点亮,间隔 1s,一直重复。。(1193点数解答 | 2024-12-27 15:10:29)169
- #include <reg51.h> void ex0_isr() interrupt 0 { static unsigned char led = 0x01; P2 = led; led = (led << 1) | (led >> 7); } void main() { IT0 = 1; EX0 = 1; EA = 1; P2 = 0x01; while(1); }(214点数解答 | 2025-06-22 23:19:09)63
- #include <reg51.h> 3 sbit button=p1^0; 4 sbit led=pl^1; 5 6 bit led_state=0; 7 8日void delay(unsigned int ms){ 9 unsigned int i,j: 10 for(i=ms;i>0;i--) 11 for(j=110;j>0;j--); 12 } 13 14日void main(){ 15 while(1){ 16 白 if (button==0){ 17 delay(20); 18 if (button-=0){ 19 while (button==ah; 20 led state=~led state; 21 led=led state; 22 } 写详细注释(697点数解答 | 2024-10-29 14:54:31)194
- 如下图,p1口(p1.0~p1.7)接了8个开关,p2口(p2.0~p2.7)接了8个发光二极管led,p3.3(/int1)外接消抖电路用于产生中断请求信号,当消抖电路的开关来回拔动一次将产生一个下降沿信号,通过p3.3(/int1)向cpu申请中断。要求:初始时发光二极管全黑,每中断一次,p1.0~p1.7所接的开关状态反映到p2.0~p2.7所接的8个发光二极管上,且要求开关合上的对应发光二极管闪烁5次后常亮(约1秒闪一次),开关断开的对应发光二极管熄灭。试编程实现之。(421点数解答 | 2024-11-11 12:43:19)133
- 如下图,p1口(p1.0~p1.7)接了8个开关,p2口(p2.0~p2.7)接了8个发光二极管led,p3.3(/int1)外接消抖电路用于产生中断请求信号,当消抖电路的开关来回拔动一次将产生一个下降沿信号,通过p3.3(/int1)向cpu申请中断。要求:初始时发光二极管全黑,每中断一次,p1.0~p1.7所接的开关状态反映到p2.0~p2.7所接的8个发光二极管上,且要求开关合上的对应发光二极管闪烁5次后常亮(约1秒闪一次),开关断开的对应发光二极管熄灭。(1343点数解答 | 2024-11-11 19:35:36)225
- p1口(p1.0~p1.7)接了8个开关,p2口(p2.0~p2.7)接了8个发光二极管led,p3.3(/int1)外接消抖电路用于产生中断请求信号,当消抖电路的开关来回拔动一次将产生一个下降沿信号,通过p3.3(/int1)向cpu申请中断。要求:初始时发光二极管全黑,每中断一次,p1.0~p1.7所接的开关状态反映到p2.0~p2.7所接的8个发光二极管上,且要求开关合上的对应发光二极管闪烁5次后常亮(约1秒闪一次),开关断开的对应发光二极管熄灭。使用c52编程(1029点数解答 | 2024-11-11 19:37:19)188
- p1口(p1.0~p1.7)接了8个开关,p2口(p2.0~p2.7)接了8个发光二极管led,p3.3(/int1)外接消抖电路用于产生中断请求信号,当消抖电路的开关来回拔动一次将产生一个下降沿信号,通过p3.3(/int1)向cpu申请中断。要求:初始时发光二极管全黑,每中断一次,p1.0~p1.7所接的开关状态反映到p2.0~p2.7所接的8个发光二极管上,且要求开关合上的对应发光二极管闪烁5次后常亮(约1秒闪一次),开关断开的对应发光二极管熄灭。使用c51编程(1077点数解答 | 2024-11-11 19:37:27)216
- #include <reg51.h> sbit LED = P1^0; sbit KEY = P1^1; void delay(unsigned int ms) { unsigned int i; for(; ms>0; ms--) for(i=0; i<120; i++); } void main() { while(1) { if(KEY == 0) { delay(20); if(KEY == 0) { LED = ~LED; while(KEY == 0); } } } } (326点数解答 | 2025-06-22 23:19:40)72
- 使用继承,实现“剪刀石头布的游戏”。 小时候很喜欢玩一个游戏,“剪刀石头布”,可以是出拳的形式,或跳格子的形式。现在我们用计算机来玩这个游戏。 电脑用随机数产生剪刀石头布,游戏玩家用输入1,2,3的方式出拳。 游戏玩家输入1或2或3,分别 代表剪刀(1)石头(2)布(3)。 电脑胜出时,显示"winner is computerplayer." 游戏玩家胜出时,显示“winner is personplayer.” 平局时显示"a draw." 函数接口定义: 根据主方法内容,实现三个类的定义,分别是是computerplayer、personplayer、game类。 其中computerplayer、personplayer要继承player类。 根据主方法中的用法,实现game类。 裁判测试程序样例: import java.util.scanner; class player{ string name; player(string name){ this.name = name; } int show() { //出拳方法(451点数解答 | 2024-10-20 19:57:58)278
- #include <reg51.h> 1 2 3 sbit button=p1^0; 4 sbit led=p1^1; 5 bit led state=0; 6 7 8日void delay(unsigned int ms){ 9 unsigned int i,j; 10 for(i=ms;i>0;i--) 11 for(j=110;j>0;j--); 1213 14 void main()【 15 while(1){ 16 if (button==0){ 17 delay(20); 18 if (button==0){ 19 1ed=0; 20 21 } 做详细注释(830点数解答 | 2024-10-29 15:29:41)191
- #include <reg51.h> 1 2 3 sbit button=p1^0; 4 sbit led=p1^1; 5 bit led state=0; 6 7 8日void delay(unsigned int ms){ 9 unsigned int i,j; 10 for(i=ms;i>0;i--) 11 for(j=110;j>0;j--); 1213 14 void main()【 15 while(1){ 16 if (button==0){ 17 delay(20); 18 if (button==0){ 19 1ed=0; 20 21 } 做注释(693点数解答 | 2024-10-29 15:31:00)299