#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
//-----------------------------------
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
#define LcdBus P0 //LCDM数据总线
#define DataPortB P1 //PIC16C74B PORTB
#define BitPortB P3 //接138,读位信息
//-----------------------------------
uchar bdata FlagBit;
uchar bdata CodeNum[5];
uchar data PortBData;
uchar bdata Segvalue[5];
//------------------------------------
sbit ENABLE1 = P3^6;
sbit ENABLE2 = P3^7;
sbit ENABLE3 = P2^7;
sbit ENABLE4 = P2^6;
sbit ENABLE5 = P2^5;
sbit RS = P2^4;
sbit RW = P2^3;
sbit E = P2^2;
sbit ENABLE6 = P2^1;
sbit ENABLE7 = P2^0;
sbit FlagBit0 =FlagBit^0;
sbit FlagBit1 =FlagBit^1;
sbit FlagBit2 =FlagBit^2;
sbit FlagBit3 =FlagBit^3;
sbit FlagBit4 =FlagBit^4;
sbit FlagBit5 =FlagBit^5;
sbit FlagBit6 =FlagBit^6;
sbit FlagBit7 =FlagBit^7;
//-----------------------------------
//SubRoutine
//-----------------------------------
//-----------------------------------
/* 定时器1的10ms中断服务程序 */
//void timer1() interrupt 3 using 2{
// TF1=0;
// _nop_();
//ReadPortB();
//test();
//_nop_();_nop_();
//}
// Delay Routine
//-----------------------------------
void delayms(uint);
void delayms(uint m) // 12MHz Xtal, close to ms value
{
uint data j;
uint data i;
for(i=0; i <m; i++)
for(j=0; j <109; j++)
_nop_();
}
//send command
void SdCmd(uchar);
void SdCmd(uchar Command)
{
RW = 0;
RS = 0;
E = 0;
LcdBus = Command;
E =1;
_nop_();
E =0;
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
//send display data
void SdData(uchar);
void SdData(uchar DData)
{
RW =0;
RS =1;
E =0;
LcdBus =DData;
E =1;
_nop_();
E =0;
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
void ClrScr(void);
void ClrScr(void)
{
SdCmd(0x01);
}
//Display
void hzkdis(uchar code *);
void hzkdis(uchar code *s)
{while(*s> 0)
{SdData(*s);
s++;
delayms(2);
}
}
//Read PortB
void ReadPortB(void);
void ReadPortB(void)
{ P3=0xff;
FlagBit=BitPortB;
FlagBit=BitPortB;
FlagBit=~FlagBit;
PortBData=DataPortB;
_nop_();
_nop_();
PortBData=DataPortB;
if (FlagBit7)
{ CodeNum[0]=PortBData; }
else if (FlagBit6)
{ CodeNum[1]=PortBData; }
else if (FlagBit5)
{ CodeNum[2]=PortBData; }
else if (FlagBit4)
{ CodeNum[3]=PortBData; }
else if (FlagBit3)
{ CodeNum[4]=PortBData; }
else {_nop_();}
}
//display data
void DDData(void);
void DDData(void)
{ char data *strs=Segvalue+2;
uchar t1;
delayms(5);
SdCmd(0x90);
_nop_();
_nop_();
_nop_();
for(t1=0;t1 <3;t1++)
{
_nop_();
_nop_();
switch(*strs)
{
case 0:hzkdis("0");break;
case 1:hzkdis("1");break;
case 2:hzkdis("2");break;
case 3:hzkdis("3");break;
case 4:hzkdis("4");break;
case 5:hzkdis("5");break;
case 6:hzkdis("6");break;
case 7:hzkdis("7");break;
case 8:hzkdis("8");break;
case 9:hzkdis("9");break;
case 13:hzkdis(" ");break;
default:_nop_();
}
_nop_();
_nop_();
strs++;
_nop_();
_nop_();
}
}
void PaSet(void);
void PaSet(void)
{
ClrScr();
SdCmd(0x80);
_nop_();
delayms(5);
}
//LED SEGGENT CODE CONVERT TO DIGITAL
void LedSegToNum(void);
void LedSegToNum()
{uchar data value;
uchar data *pt1;
uchar data *pt2;
uchar data mm;
pt2=Segvalue;
_nop_();
for(mm=0;mm <5;mm++)
{
switch(CodeNum[mm])
{ case 0x20:{value=0;}break;
case 0xe9:{value=1;}break;
case 0x42:{value=2;}break;
case 0xc0:{value=3;}break;
case 0x89:{value=4;}break;
case 0x84:{value=5;}break;
case 0x04:{value=6;}break;
case 0xe1:{value=7;}break;
case 0x00:{value=8;}break;
case 0x80:{value=9;}break;
case 0x01:{value=0x0A;}break;
case 0x0c:{value=0x0B;}break;
case 0x26:{value=0x0C;}break;
case 0x48:{value=0x0D;}break;
case 0x06:{value=0x0E;}break;
case 0x07:{value=0x0F;}break;
case 0xcf:{value=0x10;}break; //- RUN
case 0xe7:{value=0x11;}break; //ˉ START
case 0xee:{value=0x12;}break; //_ STOP
case 0xef:{value=0x13;}break; //ALL DARK
default:{_nop_();}
}
*pt2=value;
++pt2;
}
}
//display notice
void Display(uchar data *);
void Display(uchar data *points)
{
uchar data *pt4=points;
switch(*(pt4+1))
{
case 0:{
PaSet();
delayms(5);hzkdis("0 起始电压 ");delayms(5);DDData();hzkdis("%");}break;
case 1:{PaSet();hzkdis("1 起动时间 ");DDData();hzkdis("s");}break;
case 2:{PaSet();hzkdis("2 软停时间 ");DDData();hzkdis("s");}break;
case 3:{PaSet();hzkdis("3 起动延时 ");DDData();hzkdis("s");}break;
case 4:{PaSet();hzkdis("4 限流设定 ");DDData();hzkdis("%");}break;
case 5:{PaSet();hzkdis("5 编程输出 ");DDData();}break;
case 6:{PaSet();hzkdis("6 瞬停设置 ");DDData();}break;
case 7:{PaSet();hzkdis("7 瞬停后再起动 ");DDData();}break;
case 8:{PaSet();hzkdis("8 起动模式 ");DDData();}break;
case 9:{PaSet();hzkdis("9 操作控制方式 ");DDData();}break;
case 0xa:{
switch(*pt4)
{ case 0x10:{PaSet();hzkdis("ˉA 起动状态 ");}break;
case 0x11:{PaSet();hzkdis("-A 运行状态 " );}break;
case 0x12:{PaSet();hzkdis("_A 软停状态 " );}break;
case 0x13:{PaSet();hzkdis("A 0-20mA 电流量程 ");DDData();}break;
default:_nop_();
}
}break;
case 0xb:{PaSet();hzkdis("B 电流显示方式 " );DDData();}break;
case 0xc:{PaSet();hzkdis("C 通讯地址 ");DDData();}break;
case 0xd:{PaSet();hzkdis("D 参");SdData(0xca);SdData(0xfd); hzkdis("设置 ");DDData();}break;
case 0xe:{PaSet();hzkdis("E ");SdData(0xb9);SdData(0xfd);hzkdis("载倍");SdData(0xca);SdData(0xfd);hzkdis("设定 ");DDData();hzkdis("%");}break;
case 0xf:{if (*pt4!=0x10) {SdCmd(0x01);PaSet();hzkdis("F 缺相保护 ");}
else { switch(*(pt4+4))
{case 0x1:{PaSet();hzkdis("-F01 瞬停 ");}break;
case 0x2:{PaSet();hzkdis("-F02 起动时间太长 ");}break;
case 0x3:{PaSet();hzkdis("-F03 ");SdData(0xb9);SdData(0xfd);hzkdis(" 热 ");}break;
case 0x4:{PaSet();hzkdis("-F04 输入缺相 ");}break;
case 0x5:{PaSet();hzkdis("-F05 频率出错 ");}break;
case 0x6:{PaSet();hzkdis("-F06 参");SdData(0xca);SdData(0xfd);hzkdis("出错 ");}break;
case 0x7:{PaSet();hzkdis("-F07 起动");SdData(0xb9);SdData(0xfd);hzkdis("载 ");}break;
case 0x8:{PaSet();hzkdis("-F08 运行");SdData(0xb9);SdData(0xfd);hzkdis("载 ");}break;
case 0x9:{PaSet();hzkdis("-F09 输出缺相 ");}break;
default:_nop_();
}
}
}
default:_nop_();
}
}
void DePlay(void);
void DePlay(void)
{
delayms(10);
// LedSegToNum();
// initLCDM(); //initial lcdm
delayms(20);
Display(Segvalue);
delayms(1000);
}
//-----------------------------------
// Init LCD module
//-----------------------------------
void initLCDM(void);
void initLCDM(void )
{
RW=0;
RS=0;
E=0;
_nop_();
LcdBus=0xff; // pull up
SdCmd(0x30); // 8bit I/F, basic command, graphic off
SdCmd(0x06); // cursor right shift
SdCmd(0x0C); // display on
}
//Test
void test(void);
void test(void)
{
ClrScr();
delayms(5);
SdCmd(0x80);
hzkdis(" WELCOME! ");
delayms(1000);
SdCmd(0x90);
hzkdis(" 固态软启动器 ");
}
void Debug(void);
void Debug(void)
{ uchar counter;
uchar *text=Segvalue;
for(counter=0;counter <=0x0f;counter++)
{ delayms(5);
switch(counter)
{case 0x0: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=3;*(text+4)=0;}break;
case 0x1: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=1;*(text+4)=0;}break;
case 0x2: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=2;}break;
case 0x3: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x4: {Segvalue[1]=counter;*(text+2)=2;*(text+3)=5;*(text+4)=0;}break;
case 0x5: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x6: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x7: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x8: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=1;}break;
case 0x9: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=1;}break;
case 0x0a: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x0b: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x0c: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x0d: {Segvalue[1]=counter;*(text+2)=13;*(text+3)=13;*(text+4)=0;}break;
case 0x0e: {Segvalue[1]=counter;*(text+2)=1;*(text+3)=5;*(text+4)=0;}break;
case 0x0f: {Segvalue[1]=counter;Segvalue[2]=0;}break;
default:_nop_();
}
if (Segvalue[1]==0x0a) {DePlay(); Segvalue[0]=0x13;DePlay();
Segvalue[0]=0x10;DePlay();
Segvalue[0]=0x11;DePlay();
Segvalue[0]=0x12;DePlay();}
else if (Segvalue[1]==0x0f) {Deplay(); Segvalue[0]=0x10;Segvalue[3]=0;Segvalue[4]=1;DePlay();
Segvalue[4]=2;DePlay();
Segvalue[4]=3;DePlay();
Segvalue[4]=4;DePlay();
Segvalue[4]=5;DePlay();
Segvalue[4]=6;DePlay();
Segvalue[4]=7;DePlay();
Segvalue[4]=8;DePlay();
Segvalue[4]=9;DePlay(); }
else DePlay();
}
}
//-----------------------------------
// Main Program
//-----------------------------------
main()
{
delayms(200);
SP=0x90;
EA=0;
delayms(20); // disable interrupts
ENABLE1=0;
ENABLE2=0;
ENABLE3=1;
ENABLE4=1;
ENABLE5=1;
delayms(2);
initLCDM(); //initial lcdm
delayms(20);
// TMOD = 0x20;
// TH1 = 0xff-0x64;
//TL1 = TH1;
// TCON = 0x40;
//ET1=1;
//EA=1;
//TR1=1;
while(1)
{_nop_();_nop_();
//ReadPortB();
// CodeNum[0]=0xcf; //
// CodeNum[1]=0xC0; //
// CodeNum[2]=0xe9; //
// CodeNum[3]=0xC0; //
// CodeNum[4]=0x00; //
// TR1=0;
_nop_();_nop_();
_nop_();_nop_();
ENABLE1=0;
ENABLE2=0;
ENABLE3=1;
ENABLE4=1;
ENABLE5=1;
test();
delayms(2);
initLCDM(); //initial lcdm
Debug(); //调试函数
_nop_();_nop_();
LedSegToNum();
delayms(50);
Display(Segvalue);
delayms(50);
_nop_();
SdCmd(0x30); // 8bit I/F, basic command, graphic off
ClrScr(); // clr text screen
delayms(1000);
}
}
//end of program
以上程序仿真可以通过运行,烧片后程序运行以下好象就死掉了,找了几天都没发现问题,程序是用KEIL C51编译的,采用伟福的仿真器仿真的,我先烧了一个简单的程序,检查电路板没什么问题,火快烧到眉毛了,第一次用C写的程序,以前用汇编从来没出过这种问题,大家帮我看看程序啊,谢谢了!