用汇编语言(包括:键处理子程序、p1口数据处理子程序、键盘扫描子程序key、系统监控程序) 在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”,则要求在连续按下不同数字按键时,从左往右以此显示按下的数字键键值。


以下是一种可能的汇编语言代码实现,实现了给定的显示和按键控制要求。这里使用Keil C51编译器进行编译。 ``` ORG 0H ; 代码存储器起始地址 MOV P1, #FFH ; P1口设置为输入口 MOV P2, #00H ; P2口设置为输出口,并置0 MOV P0, #00H ; P0口设置为输出口,并置0 MOV A, #12H ; 将需要显示的字符 "p." 存入寄存器A MOV R0, #0AH ; 将循环计数器初始化为10 ; 循环显示 "p.",左移 LEFT_SHIFT: ACALL DISPLAY ; 调用显示子程序 RLC A ; 将 A 中的数据进行循环左移 DJNZ R0, LEFT_SHIFT ; 循环计数器减1,如果不为0,继续循环 MOV A, #12H ; 将需要显示的字符 "p." 存入寄存器A MOV R0, #0AH ; 将循环计数器初始化为10 ; 循环显示 "p.",右移 RIGHT_SHIFT: ACALL DISPLAY ; 调用显示子程序 RRC A ; 将 A 中的数据进行循环右移 DJNZ R0, RIGHT_SHIFT ; 循环计数器减1,如果不为0,继续循环 JB P1.0, BLINK_ON ; 如果按键1被按下,跳转到闪烁子程序 JB P1.1, LIGHT_ON ; 如果按键2被按下,跳转到常亮子程序 JB P1.2, LEFT_MOVE ; 如果按键3被按下,跳转到从右往左移动子程序 JB P1.3, RIGHT_MOVE ; 如果按键4被按下,跳转到从左往右移动子程序 BLINK: ACALL DISPLAY ; 调用显示子程序 ACALL DELAY ; 调用延时子程序 MOV P2, #00H ; 关闭LED数码管 ACALL DELAY ; 调用延时子程序 SJMP BLINK ; 跳转到循环闪烁 BLINK_ON: MOV P2, #F0H ; 将P2口的高4位置1,低4位置0,点亮LED数码管 ACALL BLINK ; 跳转到闪烁子程序 LIGHT_ON: MOV P2, #FFH ; 将P2口全部置1,全亮LED数码管 ACALL BLINK ; 跳转到闪烁子程序 LEFT_MOVE: MOV A, #01H ; 将数字 1 存入寄存器 A JB P1.4, LEFT_MOVE ; 如果按键5被按下,继续跳转到从右往左移动子程序 SJMP BLINK ; 否则跳转到闪烁子程序 RIGHT_MOVE: MOV A, #01H ; 将数字 1 存入寄存器 A JB P1.5, RIGHT_MOVE ; 如果按键6被按下,继续跳转到从左往右移动子程序 SJMP BLINK ; 否则跳转到闪烁子程序 DISPLAY: MOV P0, A ; 将寄存器 A 中的数据存入 P0 口,显示在LED数码管上面 RET DELAY: MOV R1, #0FFH ; 初始化循环计数器为255 LOOP: DJNZ R1, LOOP ; 循环计数器减1,如果不为0,继续循环 RET END ; 结束定义 ``` 这段程序是一个简单的示例,可能需要根据具体的硬件配置和需求做一些修改和优化。注意,上述代码只是给出了一个基本框架,具体的实现可能需要根据硬件平台和编译器的要求进行调整。 [2024-11-27 19:27:27 | AI写代码神器 | 1408点数解答]
- 外部中断 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> 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
- #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
- 实现哈希表创建及查找算法,哈希函数使用除余法,用线性探测法处理冲突。 函数接口定义: void createhash(hashtable ht[],int n); //输入不大于m的n个不为0(0表示空值)的数,用线性探查法解决冲突构造散列表 int searchhash(hashtable ht[],int key); //输入一个值key,在散列表中查找key位置 其中 ht 表示哈希表, n表示记录数,key要查找的关键字 裁判测试程序样例: #include<iostream> using namespace std; #define m 16 #define nullkey 0 //单元为空的标记 struct hashtable{ int key; }; void createhash(hashtable ht[],int n); int searchhash(hashtable ht[],int key); int main() { int value,key; int result; int i,j,n; hashtable ht[m]; for(i=0;i<m;i++) ht[i].key=0; cin >> n; if(n>m) return 0; createhash(ht,n); cin >> key; result=searchhash(ht,key); if(result!=-1) cout << "search success,the key is located in "<< result+1; else cout << "search failed"; return 0; } /* 请在这里填写答案 */ 输入样例: 12 19 14 23 1 68 20 84 27 55 11 10 79 55 输出样例: 输出拓扑序列。 search success,the key is located in 6(504点数解答 | 2024-12-21 16:14:58)152
- 实现哈希表创建及查找算法,哈希函数使用除余法,用线性探测法处理冲突。 函数接口定义: void createhash(hashtable ht[],int n); //输入不大于m的n个不为0(0表示空值)的数,用线性探查法解决冲突构造散列表 int searchhash(hashtable ht[],int key); //输入一个值key,在散列表中查找key位置 其中 ht 表示哈希表, n表示记录数,key要查找的关键字 裁判测试程序样例: #include<iostream> using namespace std; #define m 16 #define nullkey 0 //单元为空的标记 struct hashtable{ int key; }; void createhash(hashtable ht[],int n); int searchhash(hashtable ht[],int key); int main() { int value,key; int result; int i,j,n; hashtable ht[m]; for(i=0;i<m;i++) ht[i].key=0; cin >> n; if(n>m) return 0; createhash(ht,n); cin >> key; result=searchhash(ht,key); if(result!=-1) cout << "search success,the key is located in "<< result+1; else cout << "search failed"; return 0; } /* 请在这里填写答案 */ 输入样例: 12 19 14 23 1 68 20 84 27 55 11 10 79 55 输出样例: 输出拓扑序列。 search success,the key is located in 6(328点数解答 | 2024-12-21 16:15:59)210
- 实现哈希表创建及查找算法,哈希函数使用除余法,用线性探测法处理冲突。 函数接口定义: void createhash(hashtable ht[],int n); //输入不大于m的n个不为0(0表示空值)的数,用线性探查法解决冲突构造散列表 int searchhash(hashtable ht[],int key); //输入一个值key,在散列表中查找key位置 其中 ht 表示哈希表, n表示记录数,key要查找的关键字 裁判测试程序样例: #include<iostream> using namespace std; #define m 16 #define nullkey 0 //单元为空的标记 struct hashtable{ int key; }; void createhash(hashtable ht[],int n); int searchhash(hashtable ht[],int key); int main() { int value,key; int result; int i,j,n; hashtable ht[m]; for(i=0;i<m;i++) ht[i].key=0; cin >> n; if(n>m) return 0; createhash(ht,n); cin >> key; result=searchhash(ht,key); if(result!=-1) cout << "search success,the key is located in "<< result+1; else cout << "search failed"; return 0; } /* 请在这里填写答案 */ 输入样例: 12 19 14 23 1 68 20 84 27 55 11 10 79 55 输出样例: 输出拓扑序列。 search success,the key is located in 6(282点数解答 | 2024-12-21 16:16:03)188