数码管显示程序.docx
- 文档编号:11008813
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:34
- 大小:21.26KB
数码管显示程序.docx
《数码管显示程序.docx》由会员分享,可在线阅读,更多相关《数码管显示程序.docx(34页珍藏版)》请在冰豆网上搜索。
数码管显示程序
/*====================================================================
顺德区雄正电子有限公司
版权所有(A)2014
======================================================================
项目:
音乐净化台灯
产品型号:
文件名:
原理图:
MCU:
BS84B08A-3(IN_16M)
原始版本:
V1.0
创建人:
mingtao_lu
创建日期:
2014-02-17
描 述:
======================================================================
修改时间:
版本:
修改人:
描 述:
====================================================================*/
/*====================================================================
芯片端口定义
----------------------
---|1PB0/KEY1|__|SDA/PA020|---MOTOR_DOWN
---|2PB1/KEY2SDO/PA119|---MOTOR_UP
---|3PB2/KEY3SCL/PA218|---OUT_Play
---|4PB3/KEY4SCS/PA317|---OUT_next
---|5PB4/KEY5INT/PA416|---OUT_prev
OUT_FAN---|6PB5/KEY6PA715|---MOTOR_A
TM_CLK---|7PB6/KEY7AN7/PD714|---MOTOR_B
TM_DIO---|8PB7/KEY8AN6/PD613|---OUT_DAMP
0V---|9VSSAN1/PD112|---1380_stb
+5V---|10VDDVref/AN0/PD011|---1380_clk
------------------------
======================================================================
//CODEOPTION配置选项
//SysVolt5.00V(forcloosingtheSysFreqrange)
//VDD5.00V(forselectionsofinternalRC)
//HIRCfrequency16MHz@Vdd=5V
//IOorRESBFunctionIO
====================================================================*/
#include"..\HXT_REFERENCE.H"
#include"..\MAIN_PROGRAM\MAIN_PROGRAM.H"
//====================================================================
//===I/O口功能定义===//
#definep_tm_clk_pb6//TM1651串行时钟pb6
#definep_tm_dio_pb7//TM1651(HT1381)串行数据pb7
#definep_1381_clk_pd0//HT1381串行时钟
#definep_1381_stb_pd1//HT1381使能
#definep_led_show_pb5//顶部灯
#definep_led_damp_pd6//底部灯
#definep_sw_up_pa0//上限位开关
#definep_sw_down_pa1//下限位开关
#definep_motor_a_pa7//电机正反转
#definep_motor_b_pd7//电机正反转
#definep_out_play_pa2//MP3播放/暂停键
#definep_out_next_pa3//MP3下一曲/音量-
#definep_out_prev_pa4//MP3上一曲/音量+
//====================================================================
//===特殊声明===//
//====================================================================
//====数码管显示表宏定义====//
#defineseg_a0x01
#defineseg_b0x04
#defineseg_c0x40
#defineseg_d0x10
#defineseg_e0x08
#defineseg_f0x02
#defineseg_g0x20
#defineseg_h0x80
#defineseg00(seg_a+seg_b+seg_c+seg_d+seg_e+seg_f)//"0"
#defineseg01(seg_b+seg_c)//"1"
#defineseg02(seg_a+seg_b+seg_d+seg_e+seg_g)//"2"
#defineseg03(seg_a+seg_b+seg_c+seg_d+seg_g)//"3"
#defineseg04(seg_b+seg_c+seg_f+seg_g)//"4"
#defineseg05(seg_a+seg_c+seg_d+seg_f+seg_g)//"5"
#defineseg06(seg_a+seg_c+seg_d+seg_e+seg_f+seg_g)//"6"
#defineseg07(seg_a+seg_b+seg_c)//"7"
#defineseg08(seg_a+seg_b+seg_c+seg_d+seg_e+seg_f+seg_g)//"8"
#defineseg09(seg_a+seg_b+seg_c+seg_d+seg_f+seg_g)//"9"
#defineseg10(0x00)//"灭"
constunsignedchartable_seg[]=//定义显示数据表
{seg00,seg01,seg02,seg03,seg04,seg05,seg06,seg07,seg08,seg09,
seg10
};
//====================================================================
//===蜂鸣器宏定义===//
//====================================================================
//===按键值宏定义===//
#definekey_temp_mode0x04//模式
#definekey_temp_set0x10//调节
#definekey_temp_prev0x02//上一曲
#definekey_temp_play0x01//播放键
#definekey_temp_next0x08//下一曲
//====================================================================
#defineset_dio_input_pbc|=0x80//设置TM1651数据口为输入
#defineset_dio_output_pbc&=0x7f//设置TM1651数据口为输出
#defineset_play_input_pac|=0x04//
#defineset_play_output_pac&=0xfb//
#defineset_next_input_pac|=0x08//
#defineset_next_output_pac&=0xf7//
#defineset_prev_input_pac|=0x10//
#defineset_prev_output_pac&=0xef//
//====================================================================
//===进制定义===//
#definebcd_to_hex(x)(((x>>4)*10)+(x&0x0f))//BCD码转10进制
#definehex_to_bcd(x)(((x/10)<<4)+(x%10))//10进制转BCD码
//====================================================================
//===图标定义===//
#definemotor_upp_motor_a=1;p_motor_b=0;//电机向上移动
#definemotor_downp_motor_a=0;p_motor_b=1;//电机向下移动
#definemotor_stopp_motor_a=0;p_motor_b=0;//电机停止移动
//====================================================================
//===时钟定义===//
#definetime_secr_data_time[0]
#definetime_minr_data_time[1]
#definetime_hourr_data_time[2]
//====================================================================
//===按键定义===//
#defineN_key0//无键
#defineS_key1//短键
#defineD_key2//双键
#defineL_key3//长键
#definekey_state_00//初始状态
#definekey_state_11//去抖
#definekey_state_22//双键
#definekey_state_33//长按
//====================================================================
//===位功能标志定义===//
bitb_t2500us;//2.5ms时钟标志位
bitb_t100ms;//100ms时钟标志位
bitb_t500ms;//500ms时钟标志位
bitb_flash_show;//闪烁标志位
bitb_display_show;//显示标志位
bitb_motor_change;//电机转向标志位
bitb_show_first;//电机上升到位后首次显示标志位
bitb_mp3_play;//MP3运行标志位
bitb_set_times;//调节标志位
bitb_key_first;//首次上电标志位
bitb_onf;//开关机标志位
bitb_motor_up;//上限位标志位
bitb_motor_down;//下限位标志位
bitb_out_damp;//底部灯输出标志位
bitb_out_show;//顶部灯输出标志位
//====================================================================
//===功能变量定义===//
unsignedcharr_t2500us;//系统2.5ms计时
unsignedcharr_t100ms;//系统100ms计时
unsignedcharr_t500ms;//系统500ms计时
unsignedcharr_dis_buff[4];//显示缓存区
unsignedcharr_data_time[3];//时间数据缓存区
unsignedcharr_key_buf;//有效键值
unsignedcharr_key_old;//备份键值
unsignedintr_key_5s;//5秒无键自动确认
unsignedcharr_set_time;//时钟设置
unsignedcharr_delay_cnt;//MP3按键时长计时
unsignedcharr_motor_dly;//电机延时计时
unsignedcharr_check_up;//电机上限位去抖
unsignedcharr_check_down;//电机下限位去抖
//====================================================================
//===延时函数===//
voiddelay(unsignedcharz)
{
unsignedcharj;
for(;z!
=0;z--)
{
for(j=5;j!
=0;j--);
}
}
//====================================================================
//===HT1381驱动函数===//
voidht_send_byte(unsignedcharr_byte)//写数据在上升沿
{
unsignedchari;
for(i=8;i>0;i--)//从低位开始送
{
p_1381_clk=0;//产生上升沿
p_tm_dio=(r_byte&0x01);//送数据
p_1381_clk=1;
r_byte>>=1;//准备下次数据
}
}
unsignedcharht_read_byte(void)//读数据在上升沿
{
unsignedchari,r_byte=0;
set_dio_input;
for(i=8;i>0;i--)//从低位开始读
{
r_byte>>=1;//准备下次数据
p_1381_clk=0;//产生上升沿
if(p_tm_dio!
=0)//读取输出数据
r_byte+=0x80;//保存数据
p_1381_clk=1;
}
set_dio_output;
return(r_byte);//返回读取值
}
voidht_write_date(unsignedcharaddress,unsignedcharr_byte)
{//写数据函数
p_1381_stb=0;
p_1381_clk=0;
p_1381_stb=1;
ht_send_byte(address);//写地址
ht_send_byte(r_byte);//写数据
p_1381_clk=1;
p_1381_stb=0;
}
unsignedcharht_read_date(unsignedcharaddress)//读数据函数
{
unsignedcharr_temp;
p_1381_clk=0;
p_1381_stb=1;
ht_send_byte(address);
r_temp=ht_read_byte();
p_1381_stb=0;
p_1381_clk=0;
return(r_temp);
}
voidht_write_times(void)
{
unsignedchari;
ht_write_date(0x8e,0x00);//关写保护
for(i=0;i<=2;i++)//写入时钟数据
{
ht_write_date((0x80+i*2),hex_to_bcd(r_data_time[i]));//
}
ht_write_date(0x8e,0x80);//开写保护
}
voidht_read_times(void)
{
unsignedchari;
for(i=0;i<=2;i++)
{//读取时钟数据到缓存
r_data_time[i]=bcd_to_hex(ht_read_date(0x81+i*2));
}
}
voidht_init_times(void)
{
unsignedcharr_temp;
p_1381_stb=0;
r_temp=ht_read_date(0x81);
if((r_temp&0x80)!
=0)//判断是否掉电
{//掉电后初始化
time_sec=0;
time_min=0;
time_hour=12;
ht_write_times();//写入时钟数据
}
ht_read_times();//读取时钟数据
}
//====================================================================
//===TM1651驱动函数===//
voidtm_start(void)
{
p_tm_clk=1;
p_tm_dio=1;
delay(5);
p_tm_dio=0;
}
voidtm_stop(void)
{
p_tm_clk=1;
p_tm_dio=0;
delay(5);
p_tm_dio=1;
}
voidtm_ack(void)
{
unsignedchari;
p_tm_clk=0;
set_dio_input;
delay(5);
while((p_tm_dio==1)&&(i<=50))
{//等待应答信号,延时无回应则默认应答
i++;
}
p_tm_clk=1;
delay(5);
p_tm_clk=0;
set_dio_output;
}
voidsend_one_byte(unsignedcharr_temp)
{
unsignedchari;
for(i=8;i>0;i--)
{
p_tm_clk=0;
if(r_temp&0x01)
p_tm_dio=1;
else
p_tm_dio=0;
delay(5);
p_tm_clk=1;
r_temp>>=1;
}
}
voidtm_send_data(void)
{
unsignedchari;
tm_start();
send_one_byte(0x40);
tm_ack();
tm_stop();
tm_start();
send_one_byte(0xc0);
tm_ack();
for(i=0;i<4;i++)
{
send_one_byte(table_seg[r_dis_buff[i]]);
//send_one_byte(0xff);
tm_ack();
}
tm_stop();
tm_start();
send_one_byte(0x8f);
tm_ack();
tm_stop();
}
voidtm_send_stop(void)
{
tm_start();
send_one_byte(0x80);
tm_ack();
tm_stop();
}
//====================================================================
//===按键扫描处理函数===//
voidkey_time_process(void)
{
if(r_key_old==key_temp_set)
{
if(b_set_times)
{
if(r_set_time==1)
{
if(time_min<59)
{
time_min++;
}
else
{
time_min=0;
}
}
elseif(r_set_time==2)
{
if(time_hour<23)
{
time_hour++;
}
else
{
time_hour=0;
}
}
}
else
{
b_out_show^=1;
}
}
}
voidkey_mp3_process(void)
{
if(r_key_old==key_temp_play)
{
r_delay_cnt=5;
b_mp3_play^=1;
set_play_output;
p_out_play=0;
}
if(r_key_old==key_temp_next)
{
r_delay_cnt=5;
set_next_output;
p_out_next=0;
}
if(r_key_old==key_temp_prev)
{
r_delay_cnt=5;
set_prev_output;
p_out_prev=0;
}
}
voidkey_mode_long(void)
{
if(b_onf)
{
if(r_key_old==key_temp_mode)
{
r_set_time=1;
b_set_times=1;
}
if(r_key_old==key_temp_next)
{
r_delay_cnt=20;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码管 显示 程序