[$is_event_jimu] 2 [$group_e] 元件事件库.Tm1638模块 [$group] 元件库-显示器.$pname$ [$last_ver_update_time] 2021-04-03 [$min_need_ver] 1.23 [$p_list] [$short_show_UIname] [$code_area_type] codes,exe_per_1ms,init_code [$blocks_type] [$name] tm1638的初始化积木 [$引脚占用列表,用于提示冲突] [($_xgm$clk),type=pin]|tm1638积木里已占用CLK引脚 [($_xgm$dio),type=pin]|tm1638积木里已占用DIO引脚 [($_xgm$stb),type=pin]|tm1638积木里已占用STB引脚 [$寄存器占用列表,用于提示冲突,但=>后的值没变则不提示冲突] [$中断函数号占用列表,用于提示冲突] [$interrupt_1] [$thread_do] [$cs] [$shared_func_In_main_c] [$function_ref_define_in_headfile] @@file=tm1638_drv.h u8 Read_key_$rnd_varname_pre$( ); void init_TM1638_$rnd_varname_pre$(void); void Write_COM_$rnd_varname_pre$(unsigned char cmd); extern u8 SMG_Write_Buffer_$rnd_varname_pre$[]; extern u8 led_st__$rnd_varname_pre$[]; extern unsigned char tab11[]; extern u8 i_tttt_$rnd_varname_pre$; unsigned char Read_key_$rnd_varname_pre$(void); void Write_DATA_$rnd_varname_pre$(unsigned char add,unsigned char DATA); void Write_allLED_$rnd_varname_pre$(unsigned char LED_flag) ; void SMG_show_num_$rnd_varname_pre$(u8 align, long show_num,signed char mask_wei); void SMG_show_float_$rnd_varname_pre$(float show_num,signed char point_num,signed char mask_wei); void clear_all_$rnd_varname_pre$(); [$replace_map] $_xgm$clk = $field$clk,mytype|pin, ptype|TIMES $_xgm$dio = $field$dio,mytype|pin, ptype|TIMES $_xgm$stb = $field$stb,mytype|pin, ptype|TIMES [$init_code_for_define_area] @@file=tm1638_drv.c #define _nop_() __nop() u8 i_tttt_$rnd_varname_pre$; u8 led_st__$rnd_varname_pre$[8]; #define DATA_COMMAND 0X40 #define DISP_COMMAND 0x80 #define ADDR_COMMAND 0XC0 #define DIO_$rnd_varname_pre$ [($_xgm$dio),type=pin] #define CLK_$rnd_varname_pre$ [($_xgm$clk),type=pin] #define STB_$rnd_varname_pre$ [($_xgm$stb),type=pin] void Delay_5NOP() { u8 a; for(a=5 ;a>0;a--); } void TM1638_Write_$rnd_varname_pre$(unsigned char DATA) //写数据函数 { #get_P口_to_PxM1_PxM0_set_code(group_xml,rand1,block_name,ref_complier,extinfo,"[($_xgm$dio),type=pin]","1","tm1638 数码管的DIO信号输入,0=弱上拉,1=PP")% unsigned char i; for(i=0;i<8;i++) { IO_Write(CLK_$rnd_varname_pre$ ,0) ; if(DATA&0X01) IO_Write(DIO_$rnd_varname_pre$ ,1) ; else IO_Write(DIO_$rnd_varname_pre$ ,0) ; DATA>>=1; IO_Write(CLK_$rnd_varname_pre$ ,1) ; } } unsigned char TM1638_Read_$rnd_varname_pre$(void) //读数据函数 { unsigned char i; unsigned char temp=0; TT_disable_100us_Task_scan_for_other(1); #get_P口_to_PxM1_PxM0_set_code(group_xml,rand1,block_name,ref_complier,extinfo,"[($_xgm$dio),type=pin]","0","tm1638 数码管的DIO信号输入,0=弱上拉,1=PP")% IO_Write(DIO_$rnd_varname_pre$ ,1) ; for(i=0;i<8;i++) { temp>>=1; IO_Write(CLK_$rnd_varname_pre$ ,0) ; Delay_5NOP(); if( IO_Read(DIO_$rnd_varname_pre$) ==1){ temp|=0x80; } IO_Write(CLK_$rnd_varname_pre$ ,1) ; Delay_5NOP(); } TT_disable_100us_Task_scan_for_other(0); return temp; } void Write_COM_$rnd_varname_pre$(unsigned char cmd) //发送命令字 { TT_disable_100us_Task_scan_for_other(1); IO_Write(STB_$rnd_varname_pre$ ,0) ; TM1638_Write_$rnd_varname_pre$(cmd); IO_Write(STB_$rnd_varname_pre$ ,1) ; TT_disable_100us_Task_scan_for_other(0); } unsigned char Read_key_$rnd_varname_pre$(void) { unsigned char c[4]; unsigned char i; unsigned char key_value=0; IO_Write(STB_$rnd_varname_pre$ ,0) ; TM1638_Write_$rnd_varname_pre$(0x42); //读键扫数据 命令 for(i=0;i<4;i++) c[i]=TM1638_Read_$rnd_varname_pre$(); IO_Write(STB_$rnd_varname_pre$ ,1) ; if((c[0]&0x0f)>0){ key_value=1; } if((c[0]&0xf0)>0){ key_value=2; } if((c[1]&0x0f)>0){ key_value=3; } if((c[1]&0xf0)>0){ key_value=4; } if((c[2]&0x0f)>0){ key_value=5; } if((c[2]&0xf0)>0){ key_value=6; } if((c[3]&0x0f)>0){ key_value=7; } if((c[3]&0xf0)>0){ key_value=8; } return key_value; } void Write_DATA_$rnd_varname_pre$(unsigned char add,unsigned char DATA) //指定地址写入数据 { TT_disable_100us_Task_scan_for_other(1); #get_P口_to_PxM1_PxM0_set_code(group_xml,rand1,block_name,ref_complier,extinfo,"[($_xgm$dio),type=pin]","1","tm1638 数码管的DIO信号输入,0=弱上拉,1=PP")% Write_COM_$rnd_varname_pre$(0x44); //STB_$rnd_varname_pre$=0; IO_Write(STB_$rnd_varname_pre$ ,0) ; TM1638_Write_$rnd_varname_pre$(0xc0|add); TM1638_Write_$rnd_varname_pre$(DATA); //STB_$rnd_varname_pre$=1; IO_Write(STB_$rnd_varname_pre$ ,1) ; TT_disable_100us_Task_scan_for_other(0); } void Write_allLED_$rnd_varname_pre$(unsigned char LED_flag) //控制全部LED函数,LED_flag表示各个LED状态 { unsigned char i; for(i=0;i<8;i++) { if(LED_flag&(1<0)){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[(show_num%10)]); if(i==0){break;} show_num=show_num/10; if(show_num!=0){ i--; } } if(is_fushu==1){ if(i>0){ i--; Write_DATA_$rnd_varname_pre$(i<<1,tab11[17]); //负号 // SMG_Write_Buffer_$rnd_varname_pre$[i]=36; }else{ for(u8 ii=0;ii<=7;ii++) { Write_DATA_$rnd_varname_pre$(ii<<1,tab11[17]); //负号 //SMG_Write_Buffer_$rnd_varname_pre$[ii]=36; } return; } } if(i>0){ i--; for(;i>=0;i--) { if(i!=mask_wei){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[16]); // SMG_Write_Buffer_$rnd_varname_pre$[i]=16;//熄灭 } } } } //---------------------------------- if(align==0){ long show_num2= show_num; signed char offset1=0; signed char offsetfushu=0; if(is_fushu==1){ Write_DATA_$rnd_varname_pre$(0<<1,tab11[17]); // SMG_Write_Buffer_$rnd_varname_pre$[0]=36; offsetfushu=1; } if(show_num==0){ Write_DATA_$rnd_varname_pre$(offsetfushu<<1,tab11[0]); // SMG_Write_Buffer_$rnd_varname_pre$[offsetfushu]=0; offset1=1+offsetfushu; } while((show_num2>0)){ offset1++; show_num2=show_num2/10; } i=0+offset1-1+offsetfushu; while((show_num>0)){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[(show_num%10)]); // SMG_Write_Buffer_$rnd_varname_pre$[i]=(show_num%10); if(i==0&&is_fushu==0){break;} if(i<=1&&is_fushu==1){break;} //i--; show_num=show_num/10; if(show_num!=0){ i--; } } if(is_fushu==1){ if(offset1>=8){ for(u8 ii=0;ii<=7;ii++) { Write_DATA_$rnd_varname_pre$(ii<<1,tab11[17]); // SMG_Write_Buffer_$rnd_varname_pre$[ii]=36; } return; } } for(i=(0+offset1+offsetfushu);i<=7;i++) { if(i!=mask_wei){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[16]); // SMG_Write_Buffer_$rnd_varname_pre$[i]=16;//熄灭 } } } } void SMG_show_float_$rnd_varname_pre$(float show_num,signed char point_num,signed char mask_wei){ signed char i; u32 float_xiaoshu_cont; signed char point_num_i; if(show_num<0){ i=7; for(;i>=0;i--) { Write_DATA_$rnd_varname_pre$(i<<1,tab11[17]); SMG_Write_Buffer_$rnd_varname_pre$[i]=17; } return; } if(point_num<0){point_num=0;} if(point_num>=4){point_num=4;} if (point_num>0){ float intpart; //为变量赋初值 float_xiaoshu_cont= (u32)(modff(show_num, &intpart)*(powf(10,(u8)point_num) )); //求小数部分 point_num_i=point_num; i=7; while(point_num_i>0){ point_num_i--; Write_DATA_$rnd_varname_pre$(i<<1,tab11[float_xiaoshu_cont%10]); SMG_Write_Buffer_$rnd_varname_pre$[i]=float_xiaoshu_cont%10; i--; float_xiaoshu_cont=float_xiaoshu_cont/10; } show_xiaoshu_index_$rnd_varname_pre$=i; }else{ show_xiaoshu_index_$rnd_varname_pre$=7; } //----------------------------------- u32 show_num3=(u32)show_num; i=7-point_num; if(show_num3==0){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[0]); i=6-point_num;} while((show_num3>0)){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[show_num3%10]); SMG_Write_Buffer_$rnd_varname_pre$[i]=(show_num3%10); if(i==0){ i=-1;//add at 20220527 ,解决显示3位小数时,如果整个有8位,则头位不显示的问题 break;} i--; show_num3=show_num3/10; } for(;i>=0;i--) { if(i!=mask_wei){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[16]); SMG_Write_Buffer_$rnd_varname_pre$[i]=16;//熄灭 } } Write_DATA_$rnd_varname_pre$(show_xiaoshu_index_$rnd_varname_pre$<<1,tab11[ SMG_Write_Buffer_$rnd_varname_pre$[ show_xiaoshu_index_$rnd_varname_pre$] ] |128 ); } void clear_all_$rnd_varname_pre$(){ u8 i=0; for(i=0;i<8;i++){ Write_DATA_$rnd_varname_pre$(i<<1,tab11[16]); SMG_Write_Buffer_$rnd_varname_pre$[i]=16;//熄灭 } } [$init_code_for_define_area_once] @@file=tm1638_drv.c //共阴数码管显示代码 const unsigned char tab11[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};//0x00为熄灭 [$init_code_for_init_val] #get_P口_to_PxM1_PxM0_set_code(group_xml,rand1,block_name,ref_complier,extinfo,"[($_xgm$clk),type=pin]","1","tm1638的CLK信号输入")% #get_P口_to_PxM1_PxM0_set_code(group_xml,rand1,block_name,ref_complier,extinfo,"[($_xgm$dio),type=pin]","0","tm1638的DIO信号")% #get_P口_to_PxM1_PxM0_set_code(group_xml,rand1,block_name,ref_complier,extinfo,"[($_xgm$stb),type=pin]","1","tm1638的STB信号输入")% IO_Write([($_xgm$clk),type=pin] ,1) ; IO_Write([($_xgm$dio),type=pin] ,1) ; IO_Write([($_xgm$stb),type=pin] ,1) ; TT_disable_100us_Task_scan_for_other(1); init_TM1638_$rnd_varname_pre$(); for(i_tttt_$rnd_varname_pre$=0;i_tttt_$rnd_varname_pre$<8;i_tttt_$rnd_varname_pre$++){ Write_DATA_$rnd_varname_pre$(i_tttt_$rnd_varname_pre$<<1,tab11[0]); //初始化寄存器 led_st__$rnd_varname_pre$[i_tttt_$rnd_varname_pre$]=0; } TT_disable_100us_Task_scan_for_other(0); [$timer0_1ms_code] [$timer0_100us_code] [$run] [$toolbox_block_code]