单片机AT81C51程序设计

单片机程序设计,要求使用汇编语言,使用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次。

img

#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++);
  }
}