📄 dd2odd.c
字号:
#define _DD2ODD_C_
#include "reg51.h"
#include "stdio.h"
#include "stdlib.h"
#include "absacc.h"
#include "intrins.h"
#define pa1 0xff20//connect to lcd databus.
#define pb1 0xff21
#define pc1 0xff22//connect to lcd controbus
#define cw1 0xff23
#define pa2 0xff24
#define pb2 0xff25
#define pc2 0xff26
#define cw2 0xff27
#define pa3 0xff28//p3,p4 connect to transmit port
#define pb3 0xff29//
#define pc3 0xff2a
#define cw3 0xff2b
#define pa4 0xff2c
#define pb4 0xff2d
#define pc4 0xff2e
#define cw4 0xff2f
#define pa5 0xff30//p5,p6 connect to receive port
#define pb5 0xff31
//#define pc5 0xff32
#define cw5 0xff33
#define PUSHBUTTON 0x01
#define SWBYTE 0xff32
unsigned int sys10mscounter;
unsigned char syslimitcounter;
unsigned char data lcdcounter;
unsigned char lcd_data[4];
bit lcdusing1,lcdusing2;
void soft_nop()
{
}
bit lcd_checkbusy() /*lcd bus connect to the thirdth board*/
{
register lcdstate;
XBYTE[cw5]=0x90;
XBYTE[pb5]=0xfe;
soft_nop();
lcdstate=XBYTE[pa5];
XBYTE[pb5]=0xfa;
return((bit)(lcdstate&0x80));
}
void soft_10ms()
{
register int i;
for(i=0;i<711;i++);
}
void soft_20ms()
{
soft_10ms();
soft_10ms();
}
void hard1_10ms(unsigned int time)
{
sys10mscounter=time;
while(sys10mscounter);
}
void hard2_10ms()
{
TMOD=0X51;
TH0=0XD8;
TL0=0XF6;
TR0=1;
ET0=1;
EA=1;
}
void lcd_wrcmd(unsigned char lcdcmd)
{
lcdusing1=1;
while(lcd_checkbusy());
XBYTE[cw5]=0x80;
XBYTE[pa5]=lcdcmd;
XBYTE[pb5]=0xfc;
soft_nop();
XBYTE[pb5]=0xf8;
XBYTE[pa5]=0xff;
lcdusing1=0;
}
void lcd_moveto(char position)
{
register cmd=0x80;
lcdcounter=position;
if(position>59)
position+=0x18;
else
{
if(position>39)position-=0x14;
else
{
if(position>19)position+=0x2c;
}
}
cmd=cmd|position;
lcd_wrcmd(cmd);
}
void lcd_wrdata(int lcddata) /*在当前显示位置显示数据*/
{
lcdusing2=1;
while(lcd_checkbusy());
if(lcdcounter==20)
{
lcd_moveto(20);
while(lcd_checkbusy());
}
if(lcdcounter==40)
{
lcd_moveto(40);
while(lcd_checkbusy());
}
if(lcdcounter==60)
{
lcd_moveto(60);
while(lcd_checkbusy());
}
if(lcdcounter==80)
{
lcd_moveto(0);
while(lcd_checkbusy());
lcdcounter=0;
}
/*为通用而如此*/
lcdcounter++;
XBYTE[cw5]=0x80;
XBYTE[pa5]=lcddata;
XBYTE[pb5]=0xfd;
soft_nop();
XBYTE[pb5]=0xf9;
XBYTE[pa5]=0xff;
lcdusing2=0;
}
void lcd_string(char *strpoint) /*在当前显示位置显示LCD字符串*/
{
register i=0;
while(strpoint[i]!=0)
{
lcd_wrdata(strpoint[i]);
i++;
}
}
display_data(float disp_ptr)//ascii code change
{
int lcddisplay;
lcddisplay=disp_ptr;
lcd_data[0]=(lcddisplay/100)+48;
lcddisplay%=100;
lcd_data[1]=(lcddisplay/10)+48;
lcddisplay%=10;
lcd_data[2]=lcddisplay+48;
lcd_data[3]=' ';
}
void lcd_init()/*初始化*/
{
lcd_wrcmd(0x38);
/*设置8位格式,2行,5*7*/
lcd_wrcmd(0x0c);
/*整体显示,关光标,不闪烁*/
lcd_wrcmd(0x06);
/*设定输入方式,增量不移位*/
lcd_wrcmd(0x01);
/*清除显示*/
lcdcounter=0;
}
bit is_sw(unsigned int BYTEPOS,unsigned char BITPOS)
{
unsigned char sw_temp;
XBYTE[cw5]=0x9b;
//read pc1 so pc1 should input
sw_temp=XBYTE[BYTEPOS];
if((sw_temp & BITPOS)==0x00) return (1);
else return (0);
}
void main()
{
unsigned int fail;
xdata unsigned int scandatapa1[]=
{
60,188
};
xdata unsigned int scandatapb1[]=
{
224,225,228,232,237
};
IE=0;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
lcd_init();
soft_20ms();
hard2_10ms();
XBYTE[cw1]=0x80;
XBYTE[cw2]=0x9b;
lcd_init();
lcd_string(" odd testor ");
lcd_moveto(20);
lcd_string(" Inventec corp.ltd. ");
lcd_moveto(40);
lcd_string(" Wu.Changling ");
lcd_moveto(60);
lcd_string(" 10/20/2007");
hard1_10ms(200);
while(1)
{
unsigned int xdata temp;
unsigned int i,j;
fail=0;
lcd_init();
XBYTE[cw1]=0x80;
XBYTE[cw2]=0x9b;
XBYTE[cw5]=0x9b;
lcd_string(" press start ");
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
while(is_sw(SWBYTE,PUSHBUTTON));
lcd_init();
lcd_string("Pa1");
for(i=0;i<2;i++)
{
XBYTE[pa1]=scandatapa1[i];
display_data(XBYTE[pa1]);
for (j=0;j<4;j++)
{
lcd_wrdata(lcd_data[j]);
hard1_10ms(1);
}
temp=XBYTE[pa2];
display_data(temp);
for (j=0;j<4;j++)
{
lcd_wrdata(lcd_data[j]);
hard1_10ms(1);
}
if(temp!=scandatapa1[i])
{
fail=1;
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
while(is_sw(SWBYTE,PUSHBUTTON));
goto FAIL1;
}
}
lcd_init();
lcd_string("Pb1");
for(i=0;i<5;i++)
{
XBYTE[pb1]=scandatapb1[i];
display_data(XBYTE[pb1]);
for (j=0;j<4;j++)
{
lcd_wrdata(lcd_data[j]);
hard1_10ms(1);
}
temp=XBYTE[pb2];
display_data(temp);
for (j=0;j<4;j++)
{
lcd_wrdata(lcd_data[j]);
hard1_10ms(1);
}
if(temp!=scandatapb1[i])
{
fail=1;
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
while(is_sw(SWBYTE,PUSHBUTTON));
goto FAIL2;
}
}
lcd_init();
lcd_string("test pass");
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
while(is_sw(SWBYTE,PUSHBUTTON));
fail=0;
goto END;
FAIL1: lcd_init();
lcd_string("pa1 test fail");
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
while(is_sw(SWBYTE,PUSHBUTTON));
goto END;
FAIL2: lcd_init();
lcd_string("pb1 test fail");
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
while(is_sw(SWBYTE,PUSHBUTTON));
goto END;
END: lcd_init();
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
while(!is_sw(SWBYTE,PUSHBUTTON));
hard1_10ms(10);
}
}
void timer0(void) interrupt 1 //T0中断
{
TH0=0xd8;
//12M,10ms
TL0=0xf6;
TR0=1;
if(sys10mscounter!=0)sys10mscounter--;
//定时器10ms
if(syslimitcounter!=0)syslimitcounter--;
//定时器10ms
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -