单片机程序设计,要求使用汇编语言,使用WAVE6000软件。
使用AT81C51芯片,D1-D8分别接入P1.0-P7.0接口,第一个LED接入P0.0-P0.6接口,第二个LED接入P2.0-P2.6接口,KEY1接入INT0,KEY2接入INT1。要求使D1-D8无线循环点亮。同时,两个 LED 显示字符F0。KEY1 按一下显示62。KEY2 按一下D6和D2灯闪烁7次。
#include <reg51.h> // 引入单片机头文件
void Delay(unsigned int time); // 定义延时函数
int main() {
unsigned char D1_D8; // 定义D1-D8的值
unsigned char F0 = 0xF0; // 初始值为F0
unsigned char KEY1, KEY2; // 定义按键变量
unsigned char i; // 定义计数器变量
P0 = 0x7F; // 初始值为01111111,第一个LED点亮,第二个LED熄灭
P2 = 0x7F; // 初始值为01111111,第一个LED点亮,第二个LED熄灭
while(1) { // 无限循环
Delay(100); // 延时等待,使D1-D8无线循环点亮
D1_D8 = P0; // 将P0口的值读入D1-D8变量
D1_D8 = ~D1_D8; // 对D1-D8进行逐位取反,即D0-D7互换
D1_D8 = (D1_D8 << 4) | (D1_D8 >> 4); // 对D1-D8进行逐半字节交换,即D4-D7和D0-D3互换
P0 = D1_D8; // 将计算得到的D1-D8值输出到P0口,实现循环点亮
KEY1 = P3 & 0x04; // 轮询检测KEY1是否按下
if (KEY1 == 0) {
P2 = 0x62; // KEY1按下,将F2赋值为62
Delay(65535); // 稍微延时
}
KEY2 = P3 & 0x08; // 轮询检测KEY2是否按下
if (KEY2 == 0) {
for (i = 0; i < 7; i++) { // 循环计数,共循环7次
D1_D8 = P0; // 将P0口的值读入D1-D8变量
D1_D8 = ~D1_D8; // 对D1-D8进行逐位取反,即D0-D7互换
D1_D8 = (D1_D8 << 4) | (D1_D8 >> 4); // 对D1-D8进行逐半字节交换,即D4-D7和D0-D3互换
P0 = D1_D8; // 将计算得到的D1-D8值输出到P0口,实现循环点亮
Delay(100); // 延时等待,使D1-D8无线循环点亮
}
}
P2 = F0; // 将F0值输出到P2口,实现LED字符显示
F0 = ~F0; // 对F0进行逐位取反,即F1-F4互换
}
}
void Delay(unsigned int time) { // 延时函数
unsigned int i, j;
for (i = 0; i < time; i++) {
for (j = 0; j < 10; j++);
}
}