STC15W408AS直流有刷电机定时器0PWM 脉宽输出

embedded/2024/10/20 13:10:49/

/***2024 测试直流电机正反转past***/    
/***2024 9 27板2024 10 20*L1000 CODE4422**/    
              #include     <REG52.H>  
              #include     <intrins.h>
              #include     <string.h>
              #include     "stdio.h"
              #include     <stdlib.h>
              #define      uint unsigned int
              #define      uchar unsigned char
              sbit         OLED_SCL=P1^1;         //
              sbit         OLED_SDA=P1^0;         //
              sbit         INTPUT1=P1^2;
              sbit         INTPUT2=P1^3;
              sbit         INTPUT3=P1^4;
              sbit         INTPUT4=P1^5;
              sbit         D1_ADD=P5^4;
              sbit         D1_DEC=P1^6;
              sbit         D2_ADD=P5^5;
              sbit         D2_DEC=P1^7;
              sbit         L1_PWM=P3^5;             //
              sbit         L1_EN=P3^4;             // 高电平使能 低电平关闭
              sbit         R1_PWM=P3^6;             //
              sbit         R1_EN=P3^7;             //
              sbit         L2_PWM=P3^2;             //
              sbit         L2_EN=P3^0;             //
              sbit         R2_PWM=P3^1;             //
              sbit         R2_EN=P3^3;             //
              bit          MOTORRUN_L;             //
              bit          MOTORRUN_R;
              uchar        count = 0;
              uchar        aa;
              uchar        kcounter,kstatus;     //按键计数标志 按键状态标志
              uchar        time1,time2;             //电机占空比
              uchar        timeA,timeB;             //累加器
              #define      high 1
              #define      low 0
              #define      uint unsigned int      //
              #define      uchar unsigned char      //
              #define      CMD_IDLE     0        //空闲模式
              #define      CMD_READ     1        //IAP字节读命令
              #define      CMD_PROGRAM  2        //IAP字节编程命令
              #define      CMD_ERASE    3        //IAP扇区擦除命令
              #define      ENABLE_IAP   0x82     //if SYSCLK<20MHz
              #define      IAP_ADDRESS  0x0000   //时间 EEPROM首地址
              #define      IAP_ADDRESS1 0x0200   //时间 EEPROM首地址
              typedef      unsigned char BYTE;     //Catch_Up接上Catch_Dwon接下
              typedef      unsigned int WORD;
uchar code show1[]=
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*"A",10*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",11*/
0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",12*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",13*/
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/
};    
uchar code show2[]=
{
0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
0x20,0x10,0x48,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,/*"左",0*/
0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00,/*"右",1*/
0x80,0x60,0xF8,0x07,0x00,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x00,0x00,
0x00,0x00,0xFF,0x00,0x03,0x01,0x05,0x45,0x85,0x7D,0x05,0x05,0x05,0x01,0x03,0x00,/*"停",2*/
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"止",3*/
0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,
0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,/*"启",4*/
0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,
0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*"动",5*/
0x00,0x04,0x84,0x84,0x94,0xE4,0x85,0x86,0x84,0xC4,0xB4,0x84,0x84,0x84,0x80,0x00,
0x80,0x60,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"产",6*/
0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00,
0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00,/*"量",7*/
0x40,0x40,0x42,0xCC,0x00,0x80,0x88,0x88,0xFF,0x88,0x88,0xFF,0x88,0x88,0x80,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x40,0x5F,0x40,0x40,0x40,0x00,/*"进",8*/
0x40,0x40,0x42,0xCC,0x00,0x00,0xFF,0x49,0x49,0xC9,0x49,0x49,0x7F,0x80,0x00,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x5F,0x48,0x44,0x40,0x41,0x42,0x45,0x58,0x40,0x00,/*"退",9*/
0x00,0x00,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,
0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,/*"刀",10*/
0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,/*"待",11*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*"机",12*/
};
/*************Pin Define***************/
              void      Initial_LY096BG30();
              void      Delay_50ms(uint Del_50ms);
              void      fill_picture(uchar fill_Data);
              void      IIC_Start();
              void      IIC_Stop();
              void      Write_IIC_Command(uchar IIC_Command);
              void      Write_IIC_Data(uchar IIC_Data);
              bit       Write_IIC_Byte(uchar IIC_Byte);
              void      dis_Value(uchar s);
/*---------------延时子程序----------------*/
              void delay (uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<2;j++)
              ;
              }
/**************Delay*******************************/
              void     Delay_50ms(uint Del_50ms)        //
              {
               uint m;
               for(;Del_50ms>0;Del_50ms--)
               for(m=62450;m>0;m--);
              }
/*************关所有输出*******************************/             
               void reset_io()
               {
               L1_PWM=0;                         //
               L1_EN=0;                             //
               R1_PWM=0;                         //
               R1_EN=0;                             //
               L2_PWM=0;                         //
               L2_EN=0;                             //
               R2_PWM=0;                         //
               R2_EN=0;                             //
               }
/*----关闭IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR = 0;                     //关闭IAP功能
              IAP_CMD = 0;                       //清除命令寄存器
              IAP_TRIG = 0;                      //清除触发寄存器
              IAP_ADDRH = 0x80;                  //将地址设置到非IAP区域
              IAP_ADDRL = 0;
              }
/*-从ISP/IAP/EEPROM区域读取一字节-*/
              BYTE IapReadByte(WORD addr)
              {
              BYTE dat;                          //数据缓冲区
              IAP_CONTR = ENABLE_IAP;            //使能IAP
              IAP_CMD = CMD_READ;                //设置IAP命令
              IAP_ADDRL = addr;                  //设置IAP低地址
              IAP_ADDRH = addr >> 8;             //设置IAP高地址
              IAP_TRIG = 0x5a;                   //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                   //写触发命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              dat = IAP_DATA;                    //读ISP/IAP/EEPROM数据
              IapIdle();                         //关闭IAP功能
              return dat;                        //返回
              }
/*-写一字节数据到ISP/IAP/EEPROM区域-*/
              void IapProgramByte(WORD addr, BYTE dat)
              {
              IAP_CONTR = ENABLE_IAP;            //使能IAP
              IAP_CMD = CMD_PROGRAM;             //设置IAP命令
              IAP_ADDRL = addr;                  //设置IAP低地址
              IAP_ADDRH = addr >> 8;             //设置IAP高地址
              IAP_DATA = dat;                    //写ISP/IAP/EEPROM数据
              IAP_TRIG = 0x5a;                   //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                   //写触发命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*---扇区擦除---------------*/
              void IapEraseSector(WORD addr)
              {
              IAP_CONTR = ENABLE_IAP;            //使能IAP val=IapReadByte(IAP_ADDRESS+1);
              IAP_CMD = CMD_ERASE;               //设置IAP命令
              IAP_ADDRL = addr;                  //设置IAP低地址
              IAP_ADDRH = addr >> 8;             //设置IAP高地址
              IAP_TRIG = 0x5a;                   //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                   //写触发命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               delay(5);                         //延时                  
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               delay(5);                         //延时
               }
/*******************IIC Start******************/
              void IIC_Start()
              {
               OLED_SCL=high;
               OLED_SDA=high;
               _nop_();
               OLED_SDA=low;
               _nop_();_nop_();
               OLED_SCL=low;
              }
/*************IIC Stop*************************/
              void IIC_Stop()
              {
              OLED_SDA=low;
              _nop_();
              OLED_SCL=high;
              _nop_();_nop_();
              OLED_SDA=high;
              }
/*****************IIC Write byte***************/
              bit Write_IIC_Byte(unsigned char IIC_Byte)
              {
              unsigned char i;
               bit Ack_Bit;                      //应答信号
               for(i=0;i<8;i++)        
               {
               if(IIC_Byte & 0x80)               //1?0?
               OLED_SDA=high;
               else
               OLED_SDA=low;
               OLED_SCL=high;
               _nop_();_nop_();
               OLED_SCL=low;
               IIC_Byte<<=1;                     //loop
               }
              OLED_SDA=high;                     //释放IIC SDA总线为主器件接收从器件产生应答信号    
              _nop_();_nop_();
              OLED_SCL=high;                     //第9个时钟周期
              _nop_();_nop_();
              Ack_Bit=OLED_SDA;                  //读取应答信号
              OLED_SCL=low;
              return Ack_Bit;    
              }  
/*************IIC Write Command*****************/
              void Write_IIC_Command(unsigned char IIC_Command)
              {
              IIC_Start();
              Write_IIC_Byte(0x78);              //Slave address,SA0=0
              Write_IIC_Byte(0x00);              //write command
              Write_IIC_Byte(IIC_Command);
              IIC_Stop();
              }
/****************IIC Write Data*****************/
              void Write_IIC_Data(uchar IIC_Data)
              {
              IIC_Start();
              Write_IIC_Byte(0x78);            
              Write_IIC_Byte(0x40);              //write data
              Write_IIC_Byte(IIC_Data);
              IIC_Stop();
              }
/***************设置参数显示******************/
               void dis_Val1(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB2+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X10);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);     //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB2+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X11);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/***************设置参数显示******************/
               void dis_Val2(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB4+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X10);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);     //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB4+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X11);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/***************定时器参数显示******************/
               void dis_Val(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB6+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X12);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);     //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB6+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X13);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/***************设置参数显示******************/
               void dis_Val4(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB6+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X15);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);     //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB6+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X16);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/********************picture**********************/
              void cleardisp()
              {
              uchar x,y;
              for(y=0;y<8;y++)
               {
               Write_IIC_Command(0xb0+y);
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);
                for(x=0;x<128;x++)               //横向像素
                {
                Write_IIC_Data(0X00);
                }
               }
              }
/***********************Initial code*********************/
              void  Initial_LY096BG30()
              {
              Write_IIC_Command(0xAE);   //display off
              Write_IIC_Command(0x20);     //Set Memory Addressing Mode    
              Write_IIC_Command(0x10);     //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
              Write_IIC_Command(0xb0);     //Set Page Start Address for Page Addressing Mode,0-7
              Write_IIC_Command(0xc8);      //Set COM Output Scan Direction
              Write_IIC_Command(0x00);   //---set low column address
              Write_IIC_Command(0x10);   //---set high column address
              Write_IIC_Command(0x40);   //--set start line address
              Write_IIC_Command(0x81);   //--set contrast control register
              Write_IIC_Command(0x7f);
              Write_IIC_Command(0xa1);   //--set segment re-map 0 to 127
              Write_IIC_Command(0xa6);   //--set normal display
              Write_IIC_Command(0xa8);   //--set multiplex ratio(1 to 64)
              Write_IIC_Command(0x3F);   //
              Write_IIC_Command(0xa4);   //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
              Write_IIC_Command(0xd3);   //-set display offset
              Write_IIC_Command(0x00);   //-not offset
              Write_IIC_Command(0xd5);   //--set display clock divide ratio/oscillator frequency
              Write_IIC_Command(0xf0);   //--set divide ratio
              Write_IIC_Command(0xd9);   //--set pre-charge period
              Write_IIC_Command(0x22);   //
              Write_IIC_Command(0xda);   //--set com pins hardware configuration
              Write_IIC_Command(0x12);
              Write_IIC_Command(0xdb);   //--set vcomh
              Write_IIC_Command(0x20);   //0x20,0.77xVcc
              Write_IIC_Command(0x8d);   //--set DC-DC enable
              Write_IIC_Command(0x14);   //
              Write_IIC_Command(0xaf);   //--turn on oled panel
             }
/*-----------------------------------------*/
              void red_eeprom(void)
              {
              time1=IapReadByte(IAP_ADDRESS);    //十位
              time2=IapReadByte(IAP_ADDRESS+1);
              }
/***************************************/              
              void write_eeprom( )
              {
              IapEraseSector(IAP_ADDRESS);       //扇区擦除      
              IapProgramByte(IAP_ADDRESS,time1); /**/
              IapProgramByte(IAP_ADDRESS+1,time2);
              }                                    
/********************显示待机**********************/
              void Diswait()
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb6+y);        //竖向第一行    待
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);             //横向第一个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*11]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb6+y);        //竖向第一行    机
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);             //横向第二个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*12]);  //字符表第8个字
                }
               }
              }
/*****************/
              void LEFT_FORWARD()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);             //横向第一个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    启
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);             //横向第二个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*4]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    动
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x12);             //横向第二个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*5]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    进
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x13);             //横向第二个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*8]);  //字符表第8个字
                }
               }
              }
/*****************/
              void LEFT_BACK()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x14);             //横向第一个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    启
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x15);             //横向第二个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*4]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    动
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x16);             //横向第二个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*5]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    进
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x17);             //横向第二个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*9]);  //字符表第8个字
                }
               }
              }
/**************左进停止***/
              void Left_ForStop()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);      //横向第一个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    进
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);      //横向第二个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*8]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    停
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x12);      //横向第二个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*2]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    止
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x13);      //横向第二个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*3]);  //字符表第8个字
                }
               }
              }
/**************左退停止***/
              void Left_BackStop()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x14);      //横向第一个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    退
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x15);      //横向第二个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*9]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    停
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x16);      //横向第二个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*2]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y); //竖向第一行    止
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x17);      //横向第二个字
                for(x=0;x<16;x++)          //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*3]);  //字符表第8个字
                }
               }
              }
             // MOTORRUN_L;=0;                     //
             //  MOTORRUN_R;=0;                     //
             //time1,time2;             //电机占空比
             //timeA,timeB;             //累加器
/**************定时中断*************************/
               void timer0() interrupt 1
               {
               aa++;           //timeA
               L2_PWM=0;             //
               R2_PWM=0;
               if(aa>=10)
                {
                 aa=0;
                 }
                 if(MOTORRUN_L==1)
                 {
                  timeA++; //计数加
                  if(timeA<time1) //time=20
                  {
                   L1_PWM=0;
                  }
                  else if(timeA>time1&&timeA<99)
                  {
                  L1_PWM=1;
                  timeA=0;
                  }
                  else if(timeA>99)
                  {
                  L1_PWM=0;
                  timeA=0;
                  }
                 }
                 else  if(MOTORRUN_R==1)
                 {
                  timeA++; //计数加
                  if(timeA<time1) //time=20
                  {
                   R1_PWM=0;
                  }
                  else if(timeA>time1&&timeA<99)
                  {
                  R1_PWM=1;
                  timeA=0;
                  }
                  else if(timeA>99)
                  {
                  R1_PWM=0;
                  timeA=0;
                  }
                 
                   }
             }
/*************************************************/                             
/**|    定时器1       | |      定时器0          |**/
/***GATE  C/T  M1  M0     GATE  C/T  M1  M0    ***/
//M1 M0  00  13位定时器/计数器,兼容8048定时模式,TL1使用低五位,TH1使用全部八位
//M1 M0  01  16位定时器/计数器
//M1 M0  10  8位自动重载定时器,当溢出时将TH1的值自动载入TL1
//M1 M0     11  定时器1无效
//M1 M0     11  定时器0作为双八位定时器/计数器,TL0作为八位定时器/计数器,通过标准定时器0
//的控制位控制,TH0仅作为一个八位定时器,由定时器1    的控制位控制    

/*************CMOD PCA工作模式寄存器**************/    
// BIT    7    6   5   4   3     2    1   0
//        CIDL   X   X   X  CPS2 CPS1 CPS1  ECF
//        CIDL=0时,空闲模式下PCA计数器继续工作
//        CIDL=1时,空闲模式下PCA计数器停止工作
//        CPS2 CPS1 CPS1=000 0:系统时钟  SYSclk/12
//                      =001 1:系统时钟  SYSclk/2
//                      =010 2:定时器0的溢出脉冲。由于定时器0可以工作在1T模式,通过改变定时器0的溢出率实现可调频率PWM输出
//                      =011 3: ECI/P1.2(或P3.4或P2.4)脚输入的外部时钟,最大频率SYSclk/2
//                      =100 4: 系统时钟  SYSclk    
//                      =101 5: 系统时钟  SYSclk/4
//                      =110 6: 系统时钟  SYSclk/6
//                      =111 7: 系统时钟  SYSclk/8
// ECF  PCA计数溢出中断使能位 =0时禁止寄存器CCON中CF位的中断  =1时允许寄存器CCON中CF位的中断
/*************CCON PCA控制寄存器**************/    
// BIT    7    6   5   4    3     2    1   0
//          CF   CR               CCP2 CCP1 CCP0
//          CF  PCA计数器阵列溢出标志位,当PCA计数器溢出时,有硬件置位如果CMOD的ECF置位    则CF标志可以用来产生中断
//          CR  PCA计数器阵列运行控制位 启动和关闭PCA计数器阵列计数器
//          CCP2    PCA模块2中断标志,当出现匹配和捕获时,由硬件置位,必须通过软件清零
//          CCP1    PCA模块1中断标志,当出现匹配和捕获时,由硬件置位,必须通过软件清零        
//          CCP0    PCA模块0中断标志,当出现匹配和捕获时,由硬件置位,必须通过软件清零    

/********PCA比较/捕获寄存器 CCAPM0     CCAPM1 CCAPM2*/
// BIT    7    6     5      4     3     2     1     0
//             ECOM0 CAPP0  CAPN0     MAT0  TOG0  PWM0  ECCF0
//             ECOM0允许比较器功能控制位,=1允许比较器功能
//             CAPP0 正捕获控制位,=1允许上升沿捕获
//             CAPN0 负捕获控制位,=1允许下升沿捕获
//             MAT0匹配控制位 =1时,PCA的计数值与PCA比较/捕获寄存器的匹配将置位CCON寄存器的中断标志CCF0
//             TOG0翻转控制位,当TOG0=1时,工作在PCA高速脉冲输出模式,PCA计数器的值与模块的比较/捕获寄存器匹配将使CCP0脚翻转
//                PWM0 脉宽调节模式
//             ECCF0 使能CCF0中断,使能寄存器CCON的比较/捕获标志CCP0,用来产生中断
/*************************************************/        
              void PCAInit()
              {
              CMOD=0x05;                         // PCA 计数器时钟位 系统时钟  允许CCON中的CF位中断
              CCON=0x00;                         // 初始化 寄存器
              CCAPM0=0x11;                       // 下降沿捕获  使能CCF0 中断
              CL=0;
              CH=0;                              // 初始化  计数器
              CR=1;                              // 允许PCA 模块运行
              }
/********中断服务程序***************************/    
              void PCA_isr() interrupt 7
              {
              CCF0=0;                            // 清除中断标志位
              L1_PWM=0;
              R1_PWM=0;
              count++;
              if(count>=time1)
               {
                count=0;
               if(MOTORRUN_L==1)
               L1_PWM=1;
               R2_PWM=~R2_PWM;                         //P10 取反
               if(MOTORRUN_R==1)
               R1_PWM=1;
               }
              }            
/*************************************************/
              void   main( )                     /*主程序开始*/
              {
               TMOD&=0xF0;                         //设置定时器模式
               TL0=0x00;                         //设置定时初始值
               TH0=0x28;                         //设置定时初始值
               ET0=1;
               TF0=1;                             //清除TF0标志
               TR0=1;                             //定时器0开始计时
               EA=1;                             //
               P3M0=0XFF;                         //强推挽
               P3M1=0X00;
               MOTORRUN_L=0;                     //
               MOTORRUN_R=0;                     //
               reset_io();                         //
               Initial_LY096BG30();              //初始化显示屏
               Delay_50ms(2);
               cleardisp();                         //清除显示
               Diswait();                        //显示待机
               red_eeprom();                      //
               dis_Val1(time1);                     //
               dis_Val2(time1);                     //
               PCAInit();
               while(1)            
               {
/***************电机一延时参数加*************/
                 dis_Val(aa);
                 dis_Val4(count);
                 RstKey();                         //按键复位
                 for(;kcounter<5;)               //按键循环5次
                  {
                   if(!D1_ADD)                      //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!D1_ADD)             //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  time1++;
                  if(time1>200)
                  time1=0;
                  write_eeprom();
                  dis_Val1(time1);
                  }
/***************电机一延时参数减*************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)              //按键循环5次
                  {
                   if(!D1_DEC)                      //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!D1_DEC)             //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  time1--;
                  if(time1<1)
                  time1=99;
                  write_eeprom();
                  dis_Val1(time1);
                  }
/***************电机二延时参数加*************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)              //按键循环5次
                  {
                   if(!D2_ADD)                      //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!D2_ADD)             //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  time2++;
                  if(time2>99)
                  time2=0;
                  write_eeprom();
                  dis_Val2(time2);
                  }
/***************电机二延时参数减*************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)              //按键循环5次
                  {
                   if(!D2_DEC)                      //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!D2_DEC)             //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  time2--;
                  if(time2<1)
                  time2=99;
                  write_eeprom();
                  dis_Val2(time2);
                  }

                RstKey();
                for(;kcounter<5;)                //按键循环5次
                {
                 if(!INTPUT1)                    //按键低电平
                 {
                 LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                 }
                 else if(~!INTPUT1)              //按键高电平
                 {
                 HighVoltKey();                  //按键计数器加一    状态标志归零
                 }
                }
                if(kstatus>=3)                   /*按键状态标志大于等于3为有效值*/
                {  
                 R1_EN=1;
                 L1_EN=1;
                 MOTORRUN_R=0;
                 Delay_50ms(10);                  //
                 MOTORRUN_L=1;
                 LEFT_FORWARD();                 //显示电机左进
                }
//
                   RstKey();
                for(;kcounter<5;)                //按键循环5次
                {
                 if(!INTPUT2)                    //按键低电平
                 {
                 LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                 }
                 else if(~!INTPUT2)              //按键高电平
                 {
                 HighVoltKey();                  //按键计数器加一    状态标志归零
                 }
                }
                if(kstatus>=3)                   /*按键状态标志大于等于3为有效值*/
                {  
                L1_EN=1;
                 R1_EN=1;
                MOTORRUN_L=0;
                Delay_50ms(100);                  //
                MOTORRUN_R=1;
                LEFT_BACK();                     //显示电机左退
                }
//
                RstKey();
                for(;kcounter<5;)                //按键循环5次
                {
                 if(!INTPUT3)                    //按键低电平
                 {
                 LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                 }
                 else if(~!INTPUT3)              //按键高电平
                 {
                 HighVoltKey();                  //按键计数器加一    状态标志归零
                 }
                }
                if(kstatus>=3)                   /*按键状态标志大于等于3为有效值*/
                {  
                 MOTORRUN_L=0;
                 L1_PWM=0;                         //
                 L1_EN=0;                             //
                 Left_ForStop();
                }
//
                   RstKey();
                for(;kcounter<5;)                //按键循环5次
                {
                 if(!INTPUT4)                    //按键低电平
                 {
                 LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                 }
                 else if(~!INTPUT4)              //按键高电平
                 {
                 HighVoltKey();                  //按键计数器加一    状态标志归零
                 }
                }
                if(kstatus>=3)                   /*按键状态标志大于等于3为有效值*/
                {  
                MOTORRUN_R=0;
                R1_PWM=0;                         //
                R1_EN=0;           
                Left_BackStop();
                }
//
               }     
                }                    //L1000CODE4422
                                             


http://www.ppmy.cn/embedded/128999.html

相关文章

SpringCloudAlibaba升级手册

目录 1. 版本对照 版本现状 SpringCloud与AlibabaCloud对应版本 Springboot与Elasticsearch版本对应 2. openfeign问题 问题 解决方案 3. Feign请求问题 问题 解决方法 4. Sentinel循环依赖 问题 解决方案 5. bootstrap配置文件不生效 问题 解决方案 6. Nacos的…

软考(网工)——网络安全

文章目录 &#x1f550;网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552;Hash …

AcWing1027

题目重述&#xff1a; 题目的核心是找到一条路径的最大权值总和&#xff0c;但路径要从起点 (1, 1) 走到终点 (n, n)。由于两条路径分别经过不同的格子&#xff0c;我们可以巧妙地将问题简化为两次同时出发的路径问题。这种映射的设计让我们能够更方便地处理两条路径重叠在同一…

探索 Python Web 开发:从框架到爬虫

Python 是 Web 开发中广泛使用的编程语言&#xff0c;因其简单、灵活和强大的生态系统&#xff0c;适合构建各种类型的 Web 应用和 API。在本篇博客中&#xff0c;我们将讨论 Web 开发的几个重要主题&#xff0c;包括 Flask 和 Django 框架、API 开发、HTTP 请求处理以及网页爬…

Qt贪吃蛇-游戏逻辑设计(4)

目录 游戏房间 实现游戏开始和游戏暂停 设置移动按钮 退出游戏 绘制分数 绘制游戏失败效果 控制蛇的移动速度 添加吃食物的音效 选择大厅 历史记录绑定信号槽 往文件中写入分数 承接上文 游戏房间 实现游戏开始和游戏暂停 setLoops 参数是循环的次数&#xff0c…

如何快速学会盲打

今天就来给大家分享一下如何快速学会盲打 盲打的基本方法和步骤 手指放置&#xff1a;将双手放在键盘上&#xff0c;左手食指放在F键上&#xff0c;右手食指放在J键上&#xff0c;其他手指分别放在相邻的键位上。熟悉键盘布局&#xff1a;学习26个字母的位置&#xff0c;以及…

Docker报错-Docker Desktop - Unexpected WSL error

使用超级管理员Shell键入命令 netsh winsock reset 重启后即可。

Qt 每日面试题 -9

81、请写一个调用消息对话框提示报错的程序 QMessageBox::waring(this,tr("警告"), tr("用户名或密码错误!"),QMessageBox::Yes)82、Qt都提供哪些标准对话框以供使用&#xff0c;他们实现什么功能? Qt提供9个标准对话框: QColorDialog 颜色对话框&…