/***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