给出可用的AT89C52单片机程序
时间: 2024-01-07 22:05:05 浏览: 108
基于Keil C平台的源程序,是针对AT89ls52的4×4键盘扫描程序,采用查询方式进行.zip
以下是一个简单的AT89C52单片机程序,实现了题目中的功能:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^2; // 按键S2连接到P3.2引脚
sbit SHCP = P2^0; // 74HC595时钟引脚
sbit DS = P2^1; // 74HC595数据引脚
sbit STCP = P2^2; // 74HC595锁存引脚
// 数码管字模表
uchar code digit[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
void delay(uint t)
{
while(t--);
}
void shiftOut(uchar dat)
{
uchar i;
for(i = 0; i < 8; i++)
{
DS = dat & 0x80;
SHCP = 0;
dat <<= 1;
SHCP = 1;
}
}
void display(uchar num)
{
STCP = 0;
shiftOut(digit[num]);
STCP = 1;
}
void main()
{
uchar i = 0, j = 0;
P1 = 0xFF; // P1口设置为输出
P2 = 0x00; // P2口设置为输出,初始状态下不输出数码管信号
P3 = 0xFF; // P3.2口设置为输入
while(1)
{
if(key == 0) // 按键按下
{
delay(1000); // 消除按键抖动,延时一段时间再进行判断
if(key == 0) // 确认按键按下
{
if(i == 0) // 第1次按下
{
for(j = 0; j < 8; j++)
{
P1 = ~(1 << j);
delay(50000);
}
i = 1;
display(8);
}
else // 第2次按下
{
for(j = 0; j < 3; j++)
{
P1 = 0xFE;
delay(50000);
P1 = 0xFF;
delay(50000);
}
i = 0;
display(3);
}
}
while(!key); // 等待按键释放
}
else // 没有按键按下
{
P1 = 0x00; // 所有灯亮
display(0); // 数码管熄灭
}
}
}
```
需要注意的是,AT89C52单片机与51单片机的指令集和寄存器不完全相同,因此程序中的部分指令和寄存器可能需要进行修改。
阅读全文