标题:
PT6311 HT1628的avr单片机详细例程
[打印本页]
作者:
zuozuo1024
时间:
2019-5-27 13:32
标题:
PT6311 HT1628的avr单片机详细例程
PT6311 HT1628的详细例程,连续地址读写,按键扫描,LED显示都有详细的例程包。欢迎交流,例程都经过了验证是OK的。
0.png
(10.05 KB, 下载次数: 68)
下载附件
2019-5-28 04:50 上传
单片机源程序如下:
/*----------------------------------------------------------------------------*/
// Tools : ICC-AVR6.31A
// File : Main.C
// Target : M8
// Crystal : 8.000MHz
// Date : 2015-03-13 18:36:18
// Amend : 2015-03-16 11:26:09
// Function: ET6226-LED、HT1628-LED、PT6311-VFD面板测试
// Notes : 5P/6P、7P/8P接口, 效果灯控制, IR接收自动测试
/*----------------------------------------------------------------------------*/
// 包含头文件
#include <macros.h>
#include <iom8v.h>
#include "ICCAVRMACRO.H" // AVR 宏定义
#include "ICCAVRIO.H" // IO口配置
#include "Timer2.H" // 38K载波调制
#include "FD650.H" // ET6226 驱动
#include "HT1628.H" // HT1628 驱动
#include "PT6311.H" // PT6311 驱动
/*----------------------------------------------------------------------------*/
// 数据区
unsigned char IR_PASS[4] = {19, 10, 5, 5}; // "PASS"
unsigned char IR_FAIL[4] = {15, 10, 1, 17}; // "FAIL"
/*----------------------------------------------------------------------------*/
// 函数声明
void Delay_1mS(void);
void Delay_mS(unsigned int n);
void GPIO_Init(void);
void Boot_Show(void);
// ET6226
void IR_Test_ET6226(void);
void Device_Test_ET6226(void);
unsigned char Device_Check_ET6226(void);
// HT1628
void IR_Test_HT1628(void);
void Device_Test_HT1628(void);
unsigned char Device_Check_HT1628(void);
// PT6311
void IR_Test_PT6311(void);
void Device_Test_PT6311(void);
unsigned char Device_Check_PT6311(void);
/*----------------------------------------------------------------------------*/
// 延时函数定义
void Delay_1mS(void) // 8MHz
{
unsigned char i, j = 9;
do{i = 221; do{i--;}while(i); j--;}while(j);
}
void Delay_mS(unsigned int n)
{
while(n--)
{
Delay_1mS();
}
}
/*----------------------------------------------------------------------------*/
// GPIO初始化
void GPIO_Init(void)
{
DDRB = 0x00; // 输入
DDRC = 0x00;
DDRD = 0x00;
PORTB = 0xFF; // 上拉
PORTC = 0xFF;
PORTD = 0xFF;
LED_B_OUT; // 输出
LED_B_OFF; // 蓝灭
LED_IR_OUT; // 输出
LED_IR_OFF; // IR关
}
/*----------------------------------------------------------------------------*/
// LED 闪烁指示
// num: 闪烁次数
void LED_Blink(unsigned char num)
{
while(num--)
{
LED_B_ON; Delay_mS(150);
LED_B_OFF; Delay_mS(150);
}
}
/*----------------------------------------------------------------------------*/
// 系统初始化
void Boot_Show(void)
{
GPIO_Init(); // GPIO 初始化
TC2_Init(); // TIMER2 初始化
LED_Blink(2); // LED闪烁、等待上电稳定
}
/*----------------------------------------------------------------------------*/
// 主函数
void main(void)
{
unsigned char device = NULL;
Boot_Show();
while(1)
{
FD_Init(); // 初始化 ET6226
device = Device_Check_ET6226(); // 设备检测 ET6226
if(device) // 有设备插入
{
Device_Test_ET6226(); // 设备测试
}
HT_Init(); // 初始化 HT1628
device = Device_Check_HT1628(); // 设备检测 HT1628
if(device) // 有设备插入
{
Device_Test_HT1628(); // 设备测试
}
VFD_Init(); // 初始化 PT6311
device = Device_Check_PT6311(); // 设备检测 PT6311
if(device) // 有设备插入
{
Device_Test_PT6311(); // 设备测试
}
Delay_mS(500); // 每隔0.5S检测一次是否有设备插入
}
}
/*----------------------------------------------------------------------------*/
// 设备检测
// ret: ( 0 ~ 1 ) 0 = no, 1 = yes
unsigned char Device_Check_ET6226(void)
{
unsigned char Input_device;
unsigned char FD_Ack = 1;
FD_IIC_Start(); // 开始总线
FD_IIC_Write_8bits(FD650_GET_KEY); // 写入指令0x4F
FD_Ack = FD_IIC_Get_Ack(); // 接收应答位
FD_IIC_Read_8bits(); // 读出数据
FD_IIC_Set_Ack(1); // 发送应答位,不应答,接收数据结束
FD_IIC_Stop(); // 结束总线
if(FD_Ack) { Input_device = NULL; }// 无设备插入
else { Input_device = TRUE; }// 有设备插入
return (Input_device);
}
/*----------------------------------------------------------------------------*/
// IR接收测试
void IR_Test_ET6226(void)
{
unsigned char i;
unsigned char IR_high_level;// IR 采样高电平个数
unsigned char IR_status; // IR 初始状态
IR_high_level = 0; // 初始化数据
FD_UnInit(); // SDA设置为输入
Delay_mS(10); // 延时等待电平稳定
for(i = 0; i < 20; i++) // 采样20个点(20 * 5mS = 100mS)
{
Delay_mS(5); // 延时
if(FD_SDA_TST) // 采样
IR_high_level++;// 正常
}
if(IR_high_level >= 5) // 至少有5个高电平
{
IR_status = 1; // 正常
}
else
{
IR_status = 0; // 短路
}
TC2_START(); // 38K ON
Delay_mS(50); // 延时
if(IR_status)
{
if(!FD_SDA_TST) // IR 接收成功OK
{
FD_LED_ON; // 效果灯亮
FD_Power_Led(0);// 红灯灭
FD_Lock_Led(1); // 绿灯亮
FD_Background_Led(1); // 蓝灯亮
FD_Prints(IR_PASS, 1);
}
else // IR 接收失败NG
{
FD_LED_OFF; // 效果灯灭
FD_Power_Led(1);// 红灯亮
FD_Lock_Led(0); // 绿灯灭
FD_Background_Led(0); // 蓝灯灭
FD_Prints(IR_FAIL, 1);
}
}
else // IR 对地短路
{
FD_LED_OFF; // 效果灯灭
FD_Power_Led(1); // 红灯亮
FD_Lock_Led(0); // 绿灯灭
FD_Background_Led(0); // 蓝灯灭
FD_Prints(IR_FAIL, 1);
}
TC2_STOP(); // 38K OFF
LED_IR_OFF;
}
/*----------------------------------------------------------------------------*/
// 设备测试
void Device_Test_ET6226(void)
{
unsigned char i;
unsigned char tmp;
unsigned char device; // 检测设备
unsigned char led_status; // LED状态
unsigned char key_val[4]; // 按键数据 显示用
unsigned char key; // 按键键值 检测用
LED_Blink(1); // 设备插入指示
// ----------------------------------
// 变量初始化
{
for(i = 0; i < 4; i++)
{
key_val[i] = 0x00;
}
i = 0;
key = 0;
tmp = 0;
device = NULL;
led_status = 0;
}
// ----------------------------------
// FD650 全亮全灭测试
device = Device_Check_ET6226(); // 插入设备检测
if(device)
{
FD_Init(); // 初始化
for(i = 0; i < 10; i++) // 10 * 200mS = 2000mS
{
FD_Set_Brightness(5); // 开启显示和键盘,8段显示方式,5级亮度
FD_Full(); // 数码管全部置高
FD_LED_ON; // 效果灯亮
Delay_mS(200); // 全亮
}
FD_Null(); // 清显示
FD_LED_OFF; // 效果灯灭
Delay_mS(500); // 全灭
}
// ----------------------------------
// FD650 数码管位测试----
device = Device_Check_ET6226(); // 插入设备检测
if(device)
{
for(i = 0; i < 4; i++) // 共四位
{
FD_Printc(i, 0x40, 0); // 输出'-'
Delay_mS(150);
FD_Printc(i, 0x00, 0); // 输出' '
}
Delay_mS(150);
}
// ----------------------------------
// FD650 数码管段测试----
device = Device_Check_ET6226(); // 插入设备检测
if(device)
{
for(i = 0; i < 7; i++) // 共七段
{
tmp = 0x01 << i;
FD_Fill(tmp); // 输出段码
FD_Update(); // 刷新显示
Delay_mS(150);
}
Delay_mS(150);
FD_Null(); // 清显示
}
// ----------------------------------
// FD650 LED灯测试----
device = Device_Check_ET6226(); // 插入设备检测
if(device)
{
// 秒点闪烁
FD_Set_Led(1, 1); // 亮
Delay_mS(200);
FD_Set_Led(1, 0); // 灭
// 三个LED灯依次闪烁(绿、红、蓝)
for(i = 0; i < 4; i++)
{
if(i != 1)
{
FD_Set_Led(i, 1); // 亮
Delay_mS(200);
FD_Set_Led(i, 0); // 灭
}
}
// 效果灯闪烁
FD_LED_ON; // 亮
Delay_mS(200);
FD_LED_OFF; // 灭
}
// ----------------------------------
// FD650 按键和IR测试
do{
FD_Set_Brightness(5); // 开启显示和键盘,8段显示方式,5级亮度
tmp = FD_Get_Key(); // 读取按键
if((tmp < 29) && (tmp > 0)) // 按键有效
{
if(key != tmp) // 键值不同
{
key = tmp; // 键值同步
for(i = 0; i < 4; i++)
key_val[i] = tmp;
FD_Prints(key_val, 1); // 显示键值
led_status ^= 0x01; // 灯状态取反
FD_Lock_Led(led_status);
FD_Power_Led(led_status);
FD_Background_Led(led_status);
if(led_status) { FD_LED_ON; }
else { FD_LED_OFF; }
if(tmp == 2) // Power按键
{
Delay_mS(100); // 显示键值延时
IR_Test_ET6226(); // IR接收测试
}
}
}
Delay_mS(20); // 按键扫描延时
device = Device_Check_ET6226(); // 插入设备检测
}while(device); // 循环检测按键,直到设备断开
FD_LED_OFF; // 效果灯灭
LED_Blink(1); // 设备拔出指示
}
/*----------------------------------------------------------------------------*/
// 设备检测
// ret: ( 0 ~ 1 ) 0 = no, 1 = yes
unsigned char Device_Check_HT1628(void)
{
unsigned char i;
unsigned char key;
HT_Write_Command(RD_DAT | ADD_AUTO | MODE_NORMAL); // 读按键操作命令
NOP(); NOP(); NOP();
for(i = 0; i < 5; i++)
{
key = HT_Read_Data();
NOP(); NOP();
if(key) { break; }
}
HT_STB_SET;
if(key == 0xFF)
return (0);
else
return (1);
}
/*----------------------------------------------------------------------------*/
// IR接收测试
void IR_Test_HT1628(void)
{
unsigned char i;
unsigned char IR_high_level;// IR 采样高电平个数
unsigned char IR_status; // IR 初始状态
IR_high_level = 0; // 初始化数据
HT_DIO_IN; // DIO设置为输入
Delay_mS(10); // 延时等待电平稳定
for(i = 0; i < 20; i++) // 采样20个点(20 * 5mS = 100mS)
{
Delay_mS(5); // 延时
if(HT_DIO_TST) // 采样
IR_high_level++;// 正常
}
if(IR_high_level >= 5) // 至少有5个高电平
{
IR_status = 1; // 正常
}
else
{
IR_status = 0; // 短路
}
TC2_START(); // 38K ON
Delay_mS(50); // 延时
if(IR_status)
{
if(!HT_DIO_TST) // IR 接收成功OK
{
HT_LED_ON; // 效果灯亮
HT_LOCK_ON; // 信号灯亮
HT_Prints(IR_PASS, 1);
}
else // IR 接收失败NG
{
HT_LED_OFF; // 效果灯灭
HT_LOCK_OFF; // 信号灯灭
HT_Prints(IR_FAIL, 1);
}
}
else // IR 对地短路
{
HT_LED_OFF; // 效果灯灭
HT_LOCK_OFF; // 信号灯灭
HT_Prints(IR_FAIL, 1);
}
TC2_STOP(); // 38K OFF
LED_IR_OFF;
}
/*----------------------------------------------------------------------------*/
// 设备测试
void Device_Test_HT1628(void)
{
unsigned char i;
unsigned char tmp;
unsigned char device; // 检测设备
unsigned char led_status; // LED状态
unsigned char key_val[4]; // 按键数据 显示用
unsigned char key; // 按键键值 检测用
LED_Blink(1); // 设备插入指示
// ----------------------------------
// 变量初始化
{
for(i = 0; i < 4; i++)
{
key_val[i] = 0x00;
}
i = 0;
key = 0;
tmp = 0;
device = NULL;
led_status = 0;
}
// ----------------------------------
// HT1628 全亮全灭测试
device = Device_Check_HT1628(); // 插入设备检测
if(device)
{
HT_Init(); // 初始化
for(i = 0; i < 10; i++) // 10 * 200mS = 2000mS
{
HT_Write_Command(MODE_N_DIG); // 显示模式: 5位12段
HT_Set_Brightness(3); // 3级亮度
HT_Full(); // 数码管全部置高
HT_LED_ON; // 效果灯亮
HT_LOCK_ON; // 信号灯亮
Delay_mS(200); // 全亮
}
HT_Null(); // 清显示
HT_LED_OFF; // 效果灯灭
HT_LOCK_OFF; // 信号灯灭
Delay_mS(500); // 全灭
}
// ----------------------------------
// HT1628 数码管位测试----
device = Device_Check_HT1628(); // 插入设备检测
if(device)
{
for(i = 0; i < 4; i++) // 共四位
{
HT_Printc(i, 0x40, 0); // 输出'-'
Delay_mS(150);
HT_Printc(i, 0x00, 0); // 输出' '
}
Delay_mS(150);
}
// ----------------------------------
// HT1628 数码管段测试----
device = Device_Check_HT1628(); // 插入设备检测
if(device)
{
for(i = 0; i < 7; i++) // 共七段
{
tmp = 0x01 << i;
HT_Fill(tmp); // 输出段码
HT_Update(); // 刷新显示
Delay_mS(150);
}
Delay_mS(150);
HT_Null(); // 清显示
}
// ----------------------------------
// HT1628 LED灯测试----
device = Device_Check_HT1628(); // 插入设备检测
if(device)
{
HT_Second(1); // 秒点亮
Delay_mS(200);
HT_Second(0); // 秒点灭
HT_LOCK_ON; // 信号灯亮
Delay_mS(200);
HT_LOCK_OFF; // 信号灯灭
HT_LED_ON; // 效果灯亮
Delay_mS(200);
HT_LED_OFF; // 效果灯灭
}
// ----------------------------------
// HT1628 按键和IR测试
do{
HT_Write_Command(MODE_N_DIG); // 显示模式: 5位12段
HT_Set_Brightness(3); // 3级亮度
tmp = HT_Get_Key(); // 读取按键
if((tmp < 21) && (tmp > 0)) // 按键有效
{
if(key != tmp) // 键值不同
{
key = tmp; // 键值同步
for(i = 0; i < 4; i++)
key_val[i] = tmp;
HT_Prints(key_val, 1); // 显示键值
led_status ^= 0x01; // 灯状态取反
if(led_status)
{
HT_LOCK_ON; // 信号灯亮
HT_LED_ON; // 效果灯亮
}
else
{
HT_LOCK_OFF; // 信号灯灭
HT_LED_OFF; // 效果灯灭
}
if(tmp == 2) // Power按键
{
Delay_mS(100); // 显示键值延时
IR_Test_HT1628(); // IR接收测试
}
}
}
Delay_mS(20); // 按键扫描延时
device = Device_Check_HT1628(); // 插入设备检测
}while(device); // 循环检测按键,直到设备断开
HT_LED_OFF; // 效果灯灭
HT_LOCK_OFF; // 信号灯灭
LED_Blink(1); // 设备拔出指示
}
/*----------------------------------------------------------------------------*/
// 设备检测
// ret: ( 0 ~ 1 ) 0 = no, 1 = yes
unsigned char Device_Check_PT6311(void)
{
unsigned char i;
unsigned char key;
PT_Write_Command(RD_DAT | ADD_AUTO | MODE_NORMAL); // 读按键操作命令
NOP(); NOP(); NOP();
for(i = 0; i < 6; i++)
{
key = PT_Read_Byte();
NOP(); NOP();
if(key) { break; }
}
PT_STB_SET;
if(key == 0xFF)
return (0);
else
return (1);
}
/*----------------------------------------------------------------------------*/
// IR接收测试
void IR_Test_PT6311(void)
{
unsigned char i;
unsigned char IR_high_level;// IR 采样高电平个数
unsigned char IR_status; // IR 初始状态
IR_high_level = 0; // 初始化数据
Delay_mS(10); // 延时等待电平稳定
for(i = 0; i < 20; i++) // 采样20个点(20 * 5mS = 100mS)
{
Delay_mS(5); // 延时
if(PT_DOUT_TST) // 采样
IR_high_level++;// 正常
}
if(IR_high_level >= 5) // 至少有5个高电平
{
IR_status = 1; // 正常
}
else
{
IR_status = 0; // 短路
}
TC2_START(); // 38K ON
Delay_mS(50); // 延时
if(IR_status)
{
if(!PT_DOUT_TST) // IR 接收成功OK
{
VFD_Null(); // 清屏
PT_LED_ON; // 效果灯亮
VFD_Power_Led(0); // 红灯灭
VFD_Lock_Led(1); // 绿灯亮
VFD_RedBlue_Led(1); // 蓝灯亮
VFD_Background_Led(1); // 导光亮
VFD_Printsf(4, "PASS");
}
else // IR 接收失败NG
{
VFD_Null(); // 清屏
PT_LED_OFF; // 效果灯灭
VFD_Power_Led(1); // 红灯亮
VFD_Lock_Led(0); // 绿灯灭
VFD_RedBlue_Led(0); // 蓝灯灭
VFD_Background_Led(0); // 导光灭
VFD_Printsf(4, "FAIL");
}
}
else // IR 对地短路
{
VFD_Null(); // 清屏
PT_LED_OFF; // 效果灯灭
VFD_Power_Led(1); // 红灯亮
VFD_Lock_Led(0); // 绿灯灭
VFD_RedBlue_Led(0); // 蓝灯灭
VFD_Background_Led(0); // 导光灭
VFD_Printsf(4, "FAIL");
}
TC2_STOP(); // 38K OFF
LED_IR_OFF;
}
/*----------------------------------------------------------------------------*/
// 设备测试 PT6311 13位VFD显示
void Device_Test_PT6311(void)
{
unsigned char i;
unsigned int tmp;
unsigned char device; // 检测设备
unsigned char led_status; // LED状态
unsigned char key_val[12]; // 按键数据 显示用
unsigned char key1, key2; // 按键键值 检测用
LED_Blink(1); // 设备插入指示
// ----------------------------------
// 变量初始化
{
for(i = 0; i < 12; i++)
{
key_val[i] = 0x00;
}
i = 0;
tmp = 0;
key1 = 0;
key2 = 0;
device = NULL;
led_status = 0;
}
// ----------------------------------
// VFD 全亮全灭测试
device = Device_Check_PT6311(); // 插入设备检测
if(device)
{
VFD_Init(); // 初始化
for(i = 0; i < 10; i++) // 10 * 200mS = 2000mS
{
PT_Write_Command(MODE_13DIG_15SEG); // 13位15段显示模式
VFD_Set_Brightness(8); // 亮度8级
VFD_Full(); // VFD全部亮
PT_LED_ON; // 效果灯亮
VFD_Power_Led(1); // 红灯亮
VFD_Lock_Led(1); // 绿灯亮
VFD_RedBlue_Led(1); // 蓝灯亮
VFD_Background_Led(1); // 导光亮
Delay_mS(200); // 全亮
}
VFD_Null(); // 清显示
PT_LED_OFF; // 效果灯灭
VFD_Power_Led(0); // 红灯灭
VFD_Lock_Led(0); // 绿灯灭
VFD_RedBlue_Led(0); // 蓝灯灭
VFD_Background_Led(0); // 导光灭
Delay_mS(500); // 全灭
}
// ----------------------------------
// VFD 位测试----
device = Device_Check_PT6311(); // 插入设备检测
if(device)
{
for(i = 0; i < 13; i++)
{
VFD_Show(i, 0xFFFF);
Delay_mS(150);
VFD_Show(i, 0x0000);
}
Delay_mS(150);
VFD_Null(); // 清显示
for(i = 0; i < 13; i++)
{
VFD_Show(i, 0xFFFF);
Delay_mS(150);
}
Delay_mS(150);
VFD_Null(); // 清显示
}
// ----------------------------------
// VFD 段测试----
device = Device_Check_PT6311(); // 插入设备检测
if(device)
{
for(i = 0; i < 15; i++)
{
tmp = 0x0001 << i;
VFD_Fill(tmp); // 输出段码
VFD_Update(); // 刷新显示
Delay_mS(150);
}
Delay_mS(150);
VFD_Null(); // 清显示
tmp = 0;
for(i = 0; i < 15; i++)
{
tmp |= 0x0001 << i;
VFD_Fill(tmp); // 输出段码
VFD_Update(); // 刷新显示
Delay_mS(150);
}
Delay_mS(150);
VFD_Null(); // 清显示
}
// ----------------------------------
// VFD LED灯测试----
device = Device_Check_PT6311(); // 插入设备检测
if(device)
{
// 四个LED灯依次闪烁(绿、红、蓝、蓝)
for(i = 0; i < 4; i++)
{
VFD_Set_LED(i, 1); // 亮
Delay_mS(200);
VFD_Set_LED(i, 0); // 灭
}
// 效果灯闪烁
PT_LED_ON; // 亮
Delay_mS(200);
PT_LED_OFF; // 灭
}
// ----------------------------------
// VFD 按键和IR测试
do{
PT_Write_Command(MODE_13DIG_15SEG); // 13位15段显示模式
VFD_Set_Brightness(8); // 亮度8级
key1 = VFD_Get_Key(); // 读取按键
if((key1 < 9) && (key1 > 0)) // 按键有效
{
if(key2 != key1) // 键值不同
{
key2 = key1; // 键值同步
for(i = 0; i < 11; i++)
key_val[i] = key2 + '0';
VFD_Prints(1, key_val); // 显示键值
led_status ^= 0x01; // 灯状态取反
VFD_Power_Led(led_status);
VFD_Lock_Led(led_status);
VFD_RedBlue_Led(led_status);
VFD_Background_Led(led_status);
if(led_status) { PT_LED_ON; }
else { PT_LED_OFF; }
if(key2 == 2) // Power按键
{
Delay_mS(100); // 显示键值延时
IR_Test_PT6311(); // IR接收测试
}
}
}
Delay_mS(20); // 按键扫描延时
device = Device_Check_PT6311(); // 插入设备检测
}while(device); // 循环检测按键,直到设备断开
PT_LED_OFF; // 效果灯灭
LED_Blink(1); // 设备拔出指示
}
复制代码
所有资料51hei提供下载:
Test_6226_1628_6311.zip
(60.82 KB, 下载次数: 49)
2019-5-27 13:32 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
新乡家电维修
时间:
2025-3-29 20:30
我找不到汇编语言,下载看看也不懂,PT6311控制LED没成功,LED端口有控制灯丝和负压的启动引脚,啊啊啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1