系统上电,P2.2端LED指示灯闪烁; 3、按下P3.2端控制的按键,P0.0-P0.7控制的端点阵屏依次移动显示12位学号、开、爱心图形,LED指示灯常亮; 4、再次按下按键,点阵屏立即停止显示,LED指示灯闪烁。请按照以上要求写一个在Vision4上运行的程序代码
时间: 2024-03-17 14:46:15 浏览: 143
基于STM32F103单片机GPIO实现控制LED灯闪烁的程序代码0001
好的,以下是一个基于Keil和STC89C52单片机的程序代码,可以实现上述功能要求:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P2^2; // LED指示灯
sbit KEY = P3^2; // 控制按键
uchar code DATA[4][12] = { // 学号和图形点阵数据
{0x7E,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x7E}, // 1
{0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00}, // 开
{0x18,0x24,0x42,0x81,0x81,0x81,0x42,0x24,0x18,0x00,0x00,0x00}, // 爱心
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} // 空白
};
uchar pos = 0; // 当前显示的位置
void delay(uint t) // 延时函数
{
uint i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 125; j++);
}
void init() // 初始化函数
{
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0x3C; // 定时器初值
TL0 = 0xB0;
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 开启定时器0
LED = 0; // LED指示灯初始状态为闪烁
}
void display() // 显示函数
{
uchar i, j, k, temp;
for(i = 0; i < 4; i++) // 扫描4个点阵屏
{
P0 = 0xFF; // 先清空端口
P1 = ~(0x01 << i); // 打开对应的点阵屏
temp = DATA[i][pos]; // 获取需要显示的字模
for(j = 0; j < 8; j++) // 扫描8行
{
P0 = ~(0x01 << j); // 选择对应的行
for(k = 0; k < 12; k++) // 显示12列
if(temp & (0x01 << k)) // 判断当前列是否需要点亮
P0 &= ~(0x01 << k); // 点亮对应的列
delay(1); // 延时一段时间,控制移动速度
P0 = 0xFF; // 清空端口
}
}
pos++; // 更新显示位置
if(pos >= 12) // 如果已经显示完所有内容
pos = 0; // 重新从头开始显示
}
void main()
{
init(); // 初始化
while(1)
{
if(KEY == 0) // 检测按键是否按下
{
LED = 1; // LED指示灯常亮
pos = 0; // 从头开始显示
while(KEY == 0) // 等待按键释放
display(); // 显示内容
}
else
LED = ~LED; // LED指示灯闪烁
}
}
void Timer0_ISR() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0x3C;
TL0 = 0xB0;
display(); // 定时器触发显示函数
}
```
以上代码实现了系统上电时LED指示灯闪烁,按下控制按键时点阵屏依次移动显示12位学号、开、爱心图形,并且LED指示灯常亮,再次按下按键时点阵屏立即停止显示,LED指示灯闪烁的功能需求。
阅读全文