AiP1948是中微爱芯的LED驱动控制芯片,与AiP1628指令完全兼容。
下面是一个完整的51单片机DEMO程序:
#include <reg52.h>
#include <intrins.h>
// 引脚定义(根据实际硬件连接修改)
sbit AIP_CLK = P1^0; // 时钟线
sbit AIP_DIO = P1^1; // 数据线
sbit AIP_STB = P1^2; // 片选线
// 段码表(共阴极数码管0-9)
unsigned char code SEG_TABLE[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, // 0-4
0x6D, 0x7D, 0x07, 0x7F, 0x6F // 5-9
};
// 延时函数
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
// 向AiP1948写一个字节数据
void AIP1948_WriteByte(unsigned char dat) {
unsigned char i;
AIP_CLK = 1;
for(i = 0; i < 8; i++) {
AIP_CLK = 0;
if(dat & 0x01)
AIP_DIO = 1;
else
AIP_DIO = 0;
dat >>= 1;
AIP_CLK = 1;
}
}
// 从AiP1948读取按键数据
unsigned char AIP1948_ReadKey(void) {
unsigned char i, key_data = 0;
AIP_STB = 0;
AIP1948_WriteByte(0x42); // 读按键命令
AIP_DIO = 1; // 释放数据线
for(i = 0; i < 8; i++) {
AIP_CLK = 0;
key_data >>= 1;
if(AIP_DIO)
key_data |= 0x80;
AIP_CLK = 1;
}
AIP_STB = 1;
return key_data;
}
// 设置显示模式(16段16位模式)
void AIP1948_SetDisplayMode(void) {
AIP_STB = 0;
AIP1948_WriteByte(0x00); // 显示模式设置:16段16位
AIP_STB = 1;
}
// 设置数据命令(地址自动加1)
void AIP1948_SetDataCommand(void) {
AIP_STB = 0;
AIP1948_WriteByte(0x40); // 数据命令:写数据到显示寄存器,地址自动加1
AIP_STB = 1;
}
// 设置显示地址
void AIP1948_SetAddress(unsigned char addr) {
AIP_STB = 0;
AIP1948_WriteByte(0xC0 | addr); // 地址命令:设置显示地址
AIP_STB = 1;
}
// 设置显示控制(亮度0-7级)
void AIP1948_SetBrightness(unsigned char brightness) {
AIP_STB = 0;
AIP1948_WriteByte(0x88 | (brightness & 0x07)); // 显示控制:开启显示,设置亮度
AIP_STB = 1;
}
// 显示数字(在指定位置显示0-9)
void AIP1948_DisplayNum(unsigned char pos, unsigned char num) {
if(num > 9) return;
AIP1948_SetDataCommand();
AIP1948_SetAddress(pos * 2); // 每个数字占2个字节
AIP_STB = 0;
AIP1948_WriteByte(SEG_TABLE[num]); // 写段码低字节
AIP1948_WriteByte(0x00); // 写段码高字节(无小数点)
AIP_STB = 1;
AIP1948_SetBrightness(7); // 最大亮度
}
// 清屏
void AIP1948_Clear(void) {
unsigned char i;
AIP1948_SetDataCommand();
AIP1948_SetAddress(0x00);
AIP_STB = 0;
for(i = 0; i < 32; i++) { // 16位×2字节=32字节
AIP1948_WriteByte(0x00);
}
AIP_STB = 1;
AIP1948_SetBrightness(7);
}
// 主函数
void main() {
unsigned char i;
unsigned char key;
// 初始化
AIP_CLK = 1;
AIP_DIO = 1;
AIP_STB = 1;
delay_ms(100); // 上电延时
// 设置显示模式
AIP1948_SetDisplayMode();
// 清屏
AIP1948_Clear();
// 主循环
while(1) {
// 示例1:依次显示0-9
for(i = 0; i < 10; i++) {
AIP1948_DisplayNum(0, i); // 在第0位显示数字
delay_ms(1000);
}
// 示例2:多位显示(如显示"1234")
AIP1948_DisplayNum(0, 1);
AIP1948_DisplayNum(1, 2);
AIP1948_DisplayNum(2, 3);
AIP1948_DisplayNum(3, 4);
delay_ms(2000);
// 示例3:读取按键(如果有按键矩阵)
key = AIP1948_ReadKey();
if(key != 0) {
// 根据按键值执行相应操作
// 这里简单地在第0位显示按键值
AIP1948_DisplayNum(0, key & 0x0F);
}
}
}
核心功能
三线串口通信:使用CLK、DIO、STB三个引脚与AiP1948通信
显示驱动:支持16段16位或24段8位显示模式
按键扫描:支持16×2按键矩阵读取
亮度调节:8级亮度可调(0-7级)
指令兼容性
AiP1948与AiP1628指令完全兼容,主要指令包括:
x00:显示模式设置(16段16位)
x40:数据命令(地址自动加1)
x42:读按键命令
xC0:地址命令
x88:显示控制(开启显示+亮度)
硬件连接
单片机 AiP1948
P1.0 (CLK) → PIN 11 (CLK)
P1.1 (DIO) ↔ PIN 10 (DIO)
P1.2 (STB) → PIN 12 (STB)
根据实际硬件连接修改引脚定义
如需使用24段8位模式,将显示模式命令改为0x01
按键读取需要在STB低电平期间完成
显示刷新建议在定时器中断中进行,避免闪烁
|