UID478796
威望20
金钱19793
交易诚信度15
主题175
帖子910
注册时间2008-3-18
最后登录2025-4-30
高级会员
   
交易诚信度15
注册时间2008-3-18
|

楼主 |
发表于 2025-3-23 23:04
|
显示全部楼层
本帖最后由 乡村猎手 于 2025-3-23 23:05 编辑
这里是单片机的源码, 有兴趣的可以看看。
#include "reg52.h"
#include <intrins.h>
#include <math.h>
#include "i2c.h"
sfr INT_CLKO = 0x8F;
//#define is226 1
/*
K8B显示屏的相关说明
输入数据
插座位数第一个空置的不算,左声道都是双色 ,白色加对应右气道的基他它颜色,所以 说明就是左声道的颜色 。
1位 白色, 似乎是地线,但却没直接 接地, 到时要测试一下。
DRIVER PULSE: H 2位 灰色 :驱动的脉冲,680Hz(实测551), 这里为了加强输出 ,用了IC8几路的缓冲。
SERIAL OUTPUT : 测试点Q,插座第3位,紫色 :这里就是声频 信号 的串行数据
STROBE: L 4位 蓝色(左右声道直连的) 闪光灯 , H的下降沿延迟一点后产生一个正脉冲,宽度是10us 100k,两人脉冲间隔是551Hz
PEAK INPUT:V 5位 黄色 峰值输入 这里了不用了(这里给个高电平, 这样再测试第6位就行了, 6位有脉冲就清空,否则就是操持峰值)
PEAK OUTPUT: W 6位 橙 峰值输出, 如果是自动 reset , 每隔一段时间会清除峰值
-5V 棕色 35K 8位
+5V 黑色 + 5 9位
手册上的颜色和实际不对 手册上的 白灰紫蓝黄黑橙红棕 实际是 白灰紫蓝黄橙红棕黑 , 上面是按实际来的
需要
白,紫色, 蓝色*2 ,黄色 ,橙 ,黑色
*/
//SFR定义
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
//sfr P4 = 0xc0;
sfr AUXR = 0x8e;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
unsigned char I2cParm[9] = {0,0,0,0,0,0,0,0,0};
unsigned long data1,data2;
unsigned char code l_seg[64] = {7, 8, 8, 7, 7, 8, 8, 7 ,7 ,8, 8, 7, 7, 8, 8, 7, 5, 6, 6 ,5 ,5 ,6, 6, 5, 5, 6, 6, 5, 5, 6, 6 ,5};
unsigned char code l_bit[64] = {7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1 ,1 ,0, 0, 7 ,7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0};
//unsigned char code l_seg[64] = {7, 8, 8, 7, 7, 8, 8, 7 ,7 ,8, 8, 7, 7, 8, 8, 7, 6, 5, 5 ,6 ,6 ,5, 5, 6, 6, 5, 5, 6, 6, 5, 5 ,6};
//unsigned char code l_bit[64] = {7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1 ,1 ,0, 0, 7 ,7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0};
unsigned char code r_seg[64] = {1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1 ,3, 4, 4, 3, 3, 4, 4, 3, 3, 4, 4, 3, 3, 4, 4, 3};
unsigned char code r_bit[64] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7};
char level_l,level_r,count_l,count_r,peak_l,peak_r;
void Delay10ms(void) //@20.000MHz
{
unsigned char data i, j;
i = 195;
j = 138;
do
{
while (--j);
} while (--i);
}
void loadL(char level, char peak)
{
char i ;
char temp_1 ;
temp_1 = 1;
for (i = 0;i<32; i++ )
{
if ( level > i || peak == i + 1 /*显示峰值 */) //左声道显示
I2cParm[l_seg] = I2cParm[l_seg]| (temp_1<<l_bit);
}
}
void loadR(char level, char peak)
{
char i ;
char temp_1 ;
temp_1 = 1;
for (i = 0;i<32; i++ )
{
if ( level > i || peak == i + 1 /*显示峰值 */) //左声道显示
I2cParm[r_seg] = I2cParm[r_seg]| (temp_1<<r_bit);
}
}
void refresh ( ) //刷新显示
{
I2cParm[1] = 0;
I2cParm[2] = 0;
I2cParm[3] = 0;
I2cParm[4] = 0;
I2cParm[5] = 0;
I2cParm[6] = 0;
I2cParm[7] = 0;
I2cParm[8] = 0;
loadL(level_l,peak_l);
loadR(level_r,peak_r);
I2cParm[0] = 144 ; //发送控制字段 10010000 第1个1表示双背极模式 , 中间那个(第4、5)00表示边屏的子地址 后面的 000 表示段地址
i2cWrite(116,9);
I2cParm[0] = 0 ; //清空命令码,会使用默认的命令码
//高位的在另一个芯片
I2cParm[1] = 0;
I2cParm[2] = 0;
I2cParm[3] = 0;
I2cParm[4] = 0;
I2cParm[5] = 0;
I2cParm[6] = 0;
I2cParm[7] = 0;
I2cParm[8] = 0;
loadL(level_l-32,peak_l-32);
loadR(level_r-32,peak_r-32);
I2cParm[0] = 128 ; //发送控制字段 10010000 第1个1表示双背极模式 , 中间那个(第4、5)00表示边屏的子地址 后面的 000 表示段地址
i2cWrite(116,9);
}
void C_L()
{
//mcu第3脚 P3.5
//左声道计数
count_l ++;
if( count_l >64 )
{count_l = 64;}
}
void C_R()
{
//用做右声道的电平输入计数
count_r ++;
//右声道计数
if( count_r > 64 )
{count_r = 64 ;}
}
void COUNT()
{
//mcu第1脚 P3.4
//这个用来刷新电平,这里不要接灰色第2脚要接第4脚蓝色, 因为这个蓝色脉冲要比电平脉冲要晩一点,这样不会丢失最后位
//在清空前得到值
level_l = count_l;
level_r = count_r ;
//因为网格线在第一位, 所以最少显示一位
if (level_l < 1)
{level_l =1}
if (level_r < 1)
{level_r =1}
if (peak_l < level_l)
{peak_l = level_l;}
if (peak_r < level_r)
{peak_r = level_r;}
//清空计数
count_l = 0 ;
count_r = 0 ;
}
void RESET()
{
//mcu第1脚 P3.4
//这个用来刷新电平,这里不要接灰色第2脚要接第4脚蓝色, 因为这个蓝色脉冲要比电平脉冲要晩一点,这样不会丢失最后位
//在清空前得到值
peak_l = 0;
peak_r = 0;
}
void exint0() interrupt 0 //INT0中断入口
{
COUNT();
}
//中断服务程序
void exint1() interrupt 2 //INT1中断入口
{
RESET();
}
void exint2() interrupt 10 //外部中断2的中断函数
{
C_R();
}
void exint3() interrupt 11 //外部中断3的中断函数
{
C_L();
}
void Init()
{
P3M0 = 0x00; P3M1 = 0x3c;
}
void Init_int () //初始化中断
{
//IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
//EX0 = 1; //使能INT0中断
//P3^2 = 1;
IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0 = 1; //使能INT0中断
//P3^3 = 1;
IT1 = 1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX1 = 1; //使能INT1中断
INT_CLKO |= 0x10; //(EX2 = 1)使能INT2中断
INT_CLKO |= 0x20; //(EX3 = 1)使能INT3中断
//INT_CLKO |= 0x40; //(EX3 = 1)使能INT3中断
EA=1;//打开总中断
}
void main(void)
{
//char i ;
Init() ;
Init_int() ;
SDA1 = 0 ;
SCL1= 0 ;
while(1)
{
if (level_l>0 )
{refresh ( );}
Delay10ms( );
}
}
|
|