|  | 
 
| 程序来源于@人人学会单片机 
 
 //************************************************************************************
 //  单片机框架式编程 视频教程《人人学会单片机》
 //  配套文档带目录《人人学会单片机.pdf》
 //        自学网址1:https://www.acfun.cn/v/ac15187311
 //        自学网址2:https://www.bilibili.com/video/BV1Jx411Z7yC
 //        自学网址3:https://www.ixigua.com/7143839926553936415
 //        自学网址4:https://www.yuanzige.com/course/detail/80163
 
 //        以下代码只在STC15W单片机上做测试,外挂晶振频率是30MHz
 //        PCB布线需要,位选和段选都是打乱的
 //        如果通信不稳定,可以给电源加电容
 //************************************************************************************
 
 
  
 
  
 
  
 
 哔哩哔哩视频
 
 
 
 
 
 复制代码//************************************************************************************
//  单片机框架式编程 视频教程《人人学会单片机》
//  配套文档带目录《人人学会单片机.pdf》
//        自学网址1:https://www.acfun.cn/v/ac15187311
//        自学网址2:https://www.bilibili.com/video/BV1Jx411Z7yC
//        自学网址3:https://www.ixigua.com/7143839926553936415
//        自学网址4:https://www.yuanzige.com/course/detail/80163
//        以下代码只在STC15W单片机上做测试,外挂晶振频率是30MHz
//        PCB布线需要,位选和段选都是打乱的 
//        如果通信不稳定,可以给电源加电容
//************************************************************************************
#include "STC15.H"
#include <intrins.h>
typedef unsigned char         u8;        //数据类型缩写,必须写在自定义的头文件的最前面。代码从上到下按顺序编译的。
typedef unsigned short         u16;//数据类型缩写,必须写在自定义的头文件的最前面。代码从上到下按顺序编译的。
typedef unsigned long         u32;//数据类型缩写,必须写在自定义的头文件的最前面。代码从上到下按顺序编译的。
sbit TM3130_GPIO=P3^3;                                                //TM3130 数据口
u8 data TM3130_Write_Buffer[8];                                //数码管需要显示的缓存
//芯片的SG0~SG7,跟数据B0~B7是位置相反的。
//数码管取模,ABCDEFGP顺序:5、4、2、1、3、7、6、0
u8 code SMG_SEG[20]={0xBE,0x14,0x7A,0x76,0xD4,0xE6,0xEE,0x34,0xFE,0xF6,0xFC,0xCE,0xAA,0x5E,0xEA,0xE8};
//*****************************************************************************
//TM3130B发送,本函数只适合:STC15W4K单片机 30MHz晶振
//示波器实测:发0时单片机IO输出高电平300ns, 发1时单片机IO输出高电平680ns
//*****************************************************************************
void TM3130_Write_Data(u8 *Point,u8 len)
{
        u8 data i,k;
        u8 bdata Value;
        for(i=0;i<len;i++)                                                //多少位数码管                                                        
        {        
                Value=*Point;
                k=0x80;                                                                //用来确定第几位数据发送
                while(k)
                {
                        if(Value&k)                                                //如果要发送的是数据1
                        {
                                TM3130_GPIO=1;                                //B  TM3130脚就是高电平 
                        _nop_();_nop_();_nop_();_nop_();//延迟200ns
                        }
                        _nop_();_nop_();_nop_();_nop_();//延迟200ns
                        
                        TM3130_GPIO=1;                                        //A  拉高         
                        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//延迟300ns
                        
                        TM3130_GPIO=0;                                        //C  拉低 
                                                                                        //右移和while需要700ns
                        k>>=1;                                                        //右移一位,发送下一个bit
                }
        Point++;                        
        }
} 
void TM3130_Display_Drive()                                                //        TM3130显示数据,PCB布线需要,位选和段选都是打乱的 
{
        static u16 xdata count=1000;
        if(count==1000)                                                                //先发送数据
        {        count=0;                                                                //计数器清0
                EA=0;                                                                        //发送前 总中断开关 拉闸
                TM3130_Write_Data(TM3130_Write_Buffer,8); //发送8个灯的数据
                EA=1;                                                                        //发送后 总中断开关 闭合
        }
        else TM3130_GPIO=0;                                                        //后发送低电平不少于280us
        
        count++;
}//*/
void main()
{
        while(1)
        {
                TM3130_Write_Buffer[3]=SMG_SEG[1];        //第1位数码管,PCB布线需要,位选和段选都是打乱的   
                TM3130_Write_Buffer[2]=SMG_SEG[2];        //第2位数码管,PCB布线需要,位选和段选都是打乱的                   
                TM3130_Write_Buffer[0]=SMG_SEG[3];        //第3位数码管,PCB布线需要,位选和段选都是打乱的   
                TM3130_Write_Buffer[1]=SMG_SEG[4];        //第4位数码管,PCB布线需要,位选和段选都是打乱的   
                
                TM3130_Write_Buffer[7]=SMG_SEG[9];        //第1位数码管,PCB布线需要,位选和段选都是打乱的   
                TM3130_Write_Buffer[6]=SMG_SEG[8];        //第2位数码管,PCB布线需要,位选和段选都是打乱的                   
                TM3130_Write_Buffer[4]=SMG_SEG[7];        //第3位数码管,PCB布线需要,位选和段选都是打乱的   
                TM3130_Write_Buffer[5]=SMG_SEG[6];        //第4位数码管,PCB布线需要,位选和段选都是打乱的                   
                TM3130_Display_Drive();
        }
}
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?立即注册 
  |