这个程序包含三个方面的知识:
1。4*4按键的部份--完成(0~9)数字键,功能键,字母键的输入;按键抬起后才能作用;
2。LCD12232的显示部份;串行显示,只用两根线,显示中英文字母及数字;
3。TTL系列芯片与CMOS系列芯片的知识,及做库;这部份还没完成;
我想第三步完成了,MM还符合一名合格的大学毕业生的;
哈!直接上代码了,下载地址:http://www.51hei.com/f/12232ch.rar
#include
#define uint unsigned int
#define uchar unsigned char
sbit SID = P0^5 ;
sbit SCK = P0^6 ;
sbit BUZ = P0^7;
sbit A0 = P3^0;
sbit A1 = P3^1;
sbit A2 = P3^2;
sbit A3 = P3^3;
sbit A4 = P3^4;
sbit A5 = P3^5;
sbit B0 = P0^0;
sbit B7 = P1^7;
sbit B6 = P1^6;
sbit B5 = P1^5;
sbit B4 = P1^4;
sbit B3 = P1^3;
sbit B2 = P1^2;
uchar Key_Select,Key_Mode;
uchar code Disp_1[]={"浙江师范大学行"};
uchar code Disp_2[]={"知学院电子信息"};
uchar code Disp_3[]={"工程08级毛梦超"};
uchar code Disp_4[]={"的毕业设计--集"};
uchar code Disp_5[]={"成电路测试系统!"};
uchar code Disp_6[]={"指导老师:丁宇"};
uchar code Disp_7[]={"请插入芯片后按"};
uchar code Disp_8[]={"确认键进行测试!"};
uchar code Disp_9[]={"请选择芯片类型:"};
uchar code Disp_10[]={"1-CMOS; 2-TTL;"};
uchar code Disp_11[]={"请输入CMOS系列"};
uchar code Disp_12[]={"请输入TTL 系列"};
uchar code Disp_13[]={"IC型号:"};
//-----------------Delay_*2us-------------------
void Delay_us(uchar x2us)
{
while(--x2us);
}
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=122;j>0;j--)
{}
}
//-------------4KHz-------------------
void Buz(void)
{
uint i;
for(i=200;i>0;i--)
{
BUZ=1;
Delay_us(120);
BUZ=0;
}
BUZ=0;
}
//-------------LCD Part--------------------
//LCD显示部份之写地址
//-----------------------------------------
void Lcd_Wr_Command(uchar com_data)
{
uchar i;
uchar i_data;
i_data=0xf8;
SCK=0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCK=0;
SCK=1;
i_data=i_data<<1;
}
i_data=com_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCK=0;
SCK=1;
i_data=i_data<<1;
}
i_data=com_data;
i_data<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCK=0;
SCK=1;
i_data=i_data<<1;
}
Delay_ms(1);
}
//-------------LCD Part--------------------
//LCD显示部份之写数据
//-----------------------------------------
void Lcd_Wr_Data(uchar com_data)
{
uchar i;
uchar i_data;
i_data=0xfa;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCK=0;
SCK=1;
i_data=i_data<<1;
}
i_data=com_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCK=0;
SCK=1;
i_data=i_data<<1;
}
i_data=com_data;
i_data<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCK=0;
SCK=1;
i_data=i_data<<1;
}
Delay_ms(1);
}
//-------------LCD Part--------------------
//LCD显示部份之初始化
//-----------------------------------------
void Lcd_init()
{
Delay_ms(100);
Lcd_Wr_Command(0x30);
Delay_ms(5);
Lcd_Wr_Command(0x02);
Delay_ms(5);
Lcd_Wr_Command(0x06);
Delay_ms(5);
Lcd_Wr_Command(0x0c);
Delay_ms(5);
Lcd_Wr_Command(0x01);
Delay_ms(5);
//Lcd_Wr_Command(0x80);
}
void Posit(uchar x,uchar y,uchar *String)
{
uchar Posit,Addr;
if(y==1)
Addr=0x80;
if(y==2)
Addr=0x90;
Posit=Addr+x;
Lcd_Wr_Command(Posit);
while(*String!='')
{
Lcd_Wr_Data(*String++);
Delay_ms(250);
}
}
//-------------------------------------------------
//4*4键盘扫描部份;按键释放后才返回键值
//------------------Key_Scan-----------------------
uchar s_scan(void)
{
P2=0xf0;
if((P2&0xf0)!=0xf0)
{
P2=0xf0;
Delay_ms(30);
if((P2&0xf0)!=0xf0)
{
P2=0xfe ; //第一列开始,逐行扫描
if((P2&0xf0)!=0xf0)
{
P2&=0xf0;
if(P2==0xe0)
{Buz();while(!(P2==0xf0));return(16);} //取消键
if(P2==0xd0)
{Buz();while(!(P2==0xf0));return(15);} //确认键`
if(P2==0xb0)
{Buz();while(!(P2==0xf0));return(14);} //选择键
if(P2==0x70)
{Buz();while(!(P2==0xf0));return(13);} //测试键
}
P2=0xfd; //第二列开始,逐行扫描
if((P2&0xf0)!=0xf0)
{
P2&=0xf0;
if(P2==0xe0)
{Buz();while(!(P2==0xf0));return(12);} //“LS”字母输入键
if(P2==0xd0)
{Buz();while(!(P2==0xf0));return(11);} //“CD”字母输入键
if(P2==0xb0)
{Buz();while(!(P2==0xf0));return(10);} //“0”键
if(P2==0x70)
{Buz();while(!(P2==0xf0));return(9);} //“9”键
}
P2=0xfb; //第三列开始,逐行扫描
if((P2&0xf0)!=0xf0)
{
P2&=0xf0;
if(P2==0xe0)
{Buz();while(!(P2==0xf0));return(8);} //“8”键
if(P2==0xd0)
{Buz();while(!(P2==0xf0));return(7);} //“7”键
if(P2==0xb0)
{Buz();while(!(P2==0xf0));return(6);} //“6”键
if(P2==0x70)
{Buz();while(!(P2==0xf0));return(5);} //“5”键
}
P2=0xf7; //第四列开始,逐行扫描
if((P2&0xf0)!=0xf0)
{
P2&=0xf0;
if(P2==0xe0)
{Buz();while(!(P2==0xf0));return(4);} //“4”键
if(P2==0xd0)
{Buz();while(!(P2==0xf0));return(3);} //“3”键
if(P2==0xb0)
{Buz();while(!(P2==0xf0));return(2);} //“2”键
if(P2==0x70)
{Buz();while(!(P2==0xf0));return(1);} //“1”键
}
}
}
return 0;
}[page]
//------------------main part-----------------
//主函数部份
//-----------------------------------------
void main()
{
uchar key_code;
Lcd_init();
//-------------------------------
//浙江师范大学行知学院电子信息
//-------------------------------
Posit(0,1,Disp_1);
Posit(0,2,Disp_2);
Delay_ms(1000);
Lcd_Wr_Command(0x01);
Delay_ms(5);
Lcd_Wr_Command(0x02);
Delay_ms(5);
//-------------------------------
//工程08级毛梦超的毕业设计-集
//-------------------------------
Posit(0,1,Disp_3);
Posit(0,2,Disp_4);
Delay_ms(1000);
//-------------------------------
Lcd_Wr_Command(0x01);
Delay_ms(5);
Lcd_Wr_Command(0x02);
Delay_ms(5);
//-------------------------------
//成电路测试系统!指导老师:丁宇
//-------------------------------
Posit(0,1,Disp_5);
Posit(0,2,Disp_6);
Delay_ms(5000);
//-------------------------------
Lcd_Wr_Command(0x01);
Delay_ms(5);
Lcd_Wr_Command(0x02);
Delay_ms(5);
//-------------------------------
//请插入芯片后按确认进行测试!
//-------------------------------
Posit(0,1,Disp_7);
Posit(0,2,Disp_8);
Delay_ms(100);
while(1)
{
key_code=s_scan();
//------------------------------------------------------
//键值处理程序,包含数字输入键和字母输入键以及功能键操作
//------------------------------------------------------
switch(key_code)
{
case 1:
{
Lcd_Wr_Data('1');
Delay_ms(300);
}break;
case 2:
{
Lcd_Wr_Data('2');
Delay_ms(300);
}break;
case 3:
{
Lcd_Wr_Data('3');
Delay_ms(300);
}break;
case 4:
{
Lcd_Wr_Data('4');
Delay_ms(300);
}break;
case 5:
{
Lcd_Wr_Data('5');
Delay_ms(300);
}break;
case 6:
{
Lcd_Wr_Data('6');
Delay_ms(300);
}break;
case 7:
{
Lcd_Wr_Data('7');
Delay_ms(300);
}break;
case 8:
{
Lcd_Wr_Data('8');
Delay_ms(300);
}break;
case 9:
{
Lcd_Wr_Data('9');
Delay_ms(300);
}break;
case 10:
{
Lcd_Wr_Data('0');
Delay_ms(300);
}break;
case 11:
{
Posit(5,2,"CD");
Delay_ms(300);
}break;
case 12:
{
Posit(5,2,"LS");
Delay_ms(300);
}break;
case 13:
{
P3=0x00;
if(Key_Select==1) //CMOS芯片型号CD4053
{
}
if(Key_Select==2) //TTL 芯片型号74LS00
{
P3=0x00;
P1=0x00;
B4=0x00;
B6=0;B7=0;
B3=0;B4=0;
if((A0&0x01)&&(A3&0x01)&&(B0&0x01)&&(B5&0x01))
{
Buz();
Buz();Delay_ms(500);
Lcd_Wr_Command(0x01);
Posit(0,1,"测试结果:");
Posit(4,2,"OK!");
Buz();Delay_ms(100);
Buz();Delay_ms(300);
Buz();Delay_ms(500);
Buz();Delay_ms(800);
Buz();Delay_ms(1000);
Buz();Delay_ms(800);
Buz();Delay_ms(500);
Buz();Delay_ms(300);
Buz();Delay_ms(100);
}
else
{
Buz();
Lcd_Wr_Command(0x01);
Posit(0,1,"测试结果:");
Posit(4,2,"FAIL!");
while(Key_Select)
{
Buz();
}
}
}
Delay_ms(300);
} break;
case 14: //选择键
{
Key_Select++;
if(Key_Select==1)
{
Lcd_Wr_Command(0x0f);
Lcd_Wr_Command(0x90);
}
if(Key_Select==2)
{
Lcd_Wr_Command(0x0f);
Lcd_Wr_Command(0x94);
}
if(Key_Select==3)
{
Lcd_Wr_Command(0x0c);
Key_Select=0;
}
Delay_ms(300);
}break;
case 15: //确认键
{
Key_Mode++;
if(Key_Mode==3)
{
Key_Mode=0;
Key_Select=0;
Lcd_Wr_Command(0x0c);
Lcd_Wr_Command(0x01);
Lcd_Wr_Command(0x02);
Posit(0,1,Disp_7);
Posit(0,2,Disp_8);
}
if(Key_Mode==1)
{
Lcd_Wr_Command(0x01);
Posit(0,1,Disp_9);
Posit(0,2,Disp_10);
}
if(Key_Mode==2)
{
if(Key_Select==1)
{
Lcd_Wr_Command(0x01);
Lcd_Wr_Command(0x02);
Posit(0,1,Disp_11);
Posit(0,2,Disp_13);
//Lcd_Wr_Command(0x95);
}
if(Key_Select==2)
{
Lcd_Wr_Command(0x01);
Lcd_Wr_Command(0x02);
Posit(0,1,Disp_12);
Posit(0,2,Disp_13);
//Lcd_Wr_Command(0x95);
}
}
Delay_ms(300);
}break;
case 16: //取消键
{
if(Key_Select==1)
{
Lcd_Wr_Command(0x0c);
Lcd_Wr_Command(0x01);
Lcd_Wr_Command(0x02);
Lcd_Wr_Command(0x0f);
Posit(0,1,Disp_11);
Posit(0,2,Disp_13);
//Lcd_Wr_Command(0x95);
}
if(Key_Select==2)
{
Lcd_Wr_Command(0x0c);
Lcd_Wr_Command(0x01);
Lcd_Wr_Command(0x02);
Lcd_Wr_Command(0x0f);
Posit(0,1,Disp_12);
Posit(0,2,Disp_13);
//Lcd_Wr_Command(0x95);
}
Delay_ms(300);
}break;
default:P0=0xff;
}
}
}