⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dd2odd.c

📁 单片机测试程式
💻 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 + -