proteus8.15仿真1602只亮屏不显示

proteus8.15仿真1602,程序在社区复制的。仿真1602只亮屏不显示。
求大家出出主意

img

#include <reg51.h>                     
#define uint unsigned int
#define uchar unsigned char
sbit    RS=P2^0;
sbit    E=P2^2;
uchar code table[]="Welcome to china";
void delay(ms){
uint i,j;
    for(i=0;i<ms;i++){
    for(j=0;j<123;j++){
    }
 
    }
}
void write_com(uchar com){
    E=0;
    RS=0;
    P0=com;
    delay(5);
    E=1;
    delay(5);
    E=0;
}

void write_data(uchar dat){
    E=0;
    RS=1;
    P0=dat;
    delay(5);
    E=1;
    delay(5);
    E=0;
}

void init(){
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
}

void main(){
    uint i;
    init();
    write_com(0x80+0x40);
    for(i=0;i<16;i++){
    write_data(table[i]);
        delay(5);        
    }while(1);

VEE不要直接接地,用个电位器调节一下对比度

先尝试调单个字符的显示!

img


#include <reg52.h>                     
#define uint unsigned int
#define uchar unsigned char
sbit    RS=P2^0;
sbit    RW=P2^1;
sbit    E=P2^2;
uchar code table[]="Welcome to china";
void delay(ms){
uint i,j;
    for(i=0;i<ms;i++)
    for(j=0;j<123;j++);
}
void write_com(uchar com){
    E=0;
    RS=RW=0;
    delay(1);
    P0=com;
    E=1;delay(1);
    E=0;
}
void write_data(uchar dat){
    E=RW=0;
    RS=1;
    delay(1);
    P0=dat;
    E=1;delay(1);
    E=0;
}
void init(){
    write_com(0x38);
    write_com(0x0c);
    write_com(0x06);
    write_com(0x01);
}
void main(){
    uint i;
    init();
    write_com(0x80);
    for(i=0;i<16;i++){
    write_data(table[i]);    
    }write_com(0xc0);
        for(i=0;i<16;i++){
    write_data(table[i]);    
    }
        while(1);
    }
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7444428
  • 这篇博客也不错, 你可以看下动态数码管显示(proteus仿真图和程序)
  • 除此之外, 这篇博客: proteus进行51单片机矩阵键盘仿真实验中的 2.程序设计 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 按键检测部分
      这里编写的8×8矩阵键盘检测程序是通过51单片机的P2和P3口以行列检测原理的方式进行按键的检测。
    /********键盘检测函数************/
    void Key_Down(void)
    {
    	char a=0;
    	P2=0xff;	//P2口为高电平
    	P3=0x00;	//P3口为低电平
    	if(P2!=0xff)//读取按键是否按下
    	{
    		delay();//延时进行消抖
    		if(P2!=0xff)//再次检测键盘是否按下
    		{	
    			flags=1;
    			//测试列上哪一个键按下
    			P2=0x00;	//P2口为低电平
    			P3=0xff;	//P3口为高电平
    			switch(P3)
    			{
    				case(0Xfe):	KeyValue=1;break;  
    				case(0Xfd):	KeyValue=2;break;  
    				case(0Xfb): KeyValue=3;break;  
    				case(0Xf7):	KeyValue=4;break;
    				case(0Xef):	KeyValue=5;break;  
    				case(0Xdf):	KeyValue=6;break;  
    				case(0Xbf): KeyValue=7;break;  
    				case(0X7f):	KeyValue=8;break;  
    			}
    			//测试行上哪一个键按下
    			P2=0xff;	//P2口为高电平
    			P3=0x00;	//P3口为低电平
    			switch(P2)
    			{
    				case(0Xfe):	KeyValue=KeyValue;break;  
    				case(0Xfd):	KeyValue=KeyValue+8;break;  
    				case(0Xfb): KeyValue=KeyValue+16;break;  
    				case(0Xf7):	KeyValue=KeyValue+24;break;
    				case(0Xef):	KeyValue=KeyValue+32;break;  
    				case(0Xdf):	KeyValue=KeyValue+40;break;  
    				case(0Xbf): KeyValue=KeyValue+48;break;  
    				case(0X7f):	KeyValue=KeyValue+56;break;
    			}			
    		}
    	}
    	while((a<20)&&(P2!=0xff))	 //检测按键是否松开检测(P2!=0xff表示按键仍然处于按下的状态)
    	{
    		delay();
    		a++;
    	}
    	flags=0;
    }
    
    • 数码管显示部分
    /*****数码管段选数码******/
    void Seg_Choose()
    {  	
    	unsigned int key=KeyValue;
    	if(key<10)	//个位数时直接显示
    	{
    		k1=0;
    		k2=key;
    		key=0;
    	}
    	else	//两位数时分别显示
    	{
    		while(key/10!=0)
    		{
    			k2=key%10;
    			key/=10;
    			k1=key;	
    		}
    	}
    }
    
    • 完整程序如下
    #include<reg51.h>
    
    unsigned int KeyValue=0;
    unsigned int flags=0;  //按键状态标志位,按下为1,没按下为0
    unsigned int k1,k2;
    unsigned char code KB[10]={0xBF,0xB0,0xED,0xF9,0xF2,0xDB,0xDF,0xB1,0xFF,0xFB};   /*存储0~9的数码管1段选数码*/
    
    /*******延时函数*********/
    void Delay()
    {
    	unsigned int i;
    	for(i=0;i<200;i++);
    }
    
    /********键盘检测函数************
    //以下按键检测函数为逐行扫描的程序
    unsigned int kbscan()
    {
    	unsigned int linecode,rowcode;
    	unsigned int kcode[2];
    	P2=0x00;	//P2.0~P2.7置为0
    	P3=0xff;	//P3.0~P3.7置为1
    	//P1=0xff;
    	if((P3 & 0xff) != 0xff)	//P3口八位不全为1,说明有按键按下
    	{
    		delay();	//去除按键抖动
    		if((P3 & 0xff) != 0xff)
    		{
    			linecode=0xfe;
    			rowcode=P3;
    			while((linecode & 0x80) != 0 || (linecode & 0x80) == 0xff)	//逐行扫描
    			{
    				P2=linecode;	//P2口输出扫描码逐行扫描
    				if((P2 & 0xff)!=0xff)	//如果P2.0~P2.7不全为1,该行有按键按下
    				{
    					kcode[0]=linecode;		//把行编码存入数组中去
    					kcode[1]=rowcode;		//把列编码存入数组中去
    					//P1=0xb1;
    					return kcode;	//返回该数组
    				}
    				else
    				{
    					linecode=(linecode<<1) | 0x01;		//如果该行没有按键按下,查找下一行,行扫描值左移一位
    				}
    			}
    		}
    	}
    	return 0;	//无键按下返回0
    }
    */
    
    
    /********键盘检测函数************/
    void Key_Down(void)
    {
    	char a=0;
    	P2=0xff;	//P2口为高电平
    	P3=0x00;	//P3口为低电平
    	if(P2!=0xff)//读取按键是否按下
    	{
    		delay();//延时进行消抖
    		if(P2!=0xff)//再次检测键盘是否按下
    		{	
    			flags=1;
    			//测试列上哪一个键按下
    			P2=0x00;	//P2口为低电平
    			P3=0xff;	//P3口为高电平
    			switch(P3)
    			{
    				case(0Xfe):	KeyValue=1;break;  
    				case(0Xfd):	KeyValue=2;break;  
    				case(0Xfb): KeyValue=3;break;  
    				case(0Xf7):	KeyValue=4;break;
    				case(0Xef):	KeyValue=5;break;  
    				case(0Xdf):	KeyValue=6;break;  
    				case(0Xbf): KeyValue=7;break;  
    				case(0X7f):	KeyValue=8;break;  
    			}
    			//测试行上哪一个键按下
    			P2=0xff;	//P2口为高电平
    			P3=0x00;	//P3口为低电平
    			switch(P2)
    			{
    				case(0Xfe):	KeyValue=KeyValue;break;  
    				case(0Xfd):	KeyValue=KeyValue+8;break;  
    				case(0Xfb): KeyValue=KeyValue+16;break;  
    				case(0Xf7):	KeyValue=KeyValue+24;break;
    				case(0Xef):	KeyValue=KeyValue+32;break;  
    				case(0Xdf):	KeyValue=KeyValue+40;break;  
    				case(0Xbf): KeyValue=KeyValue+48;break;  
    				case(0X7f):	KeyValue=KeyValue+56;break;
    			}			
    		}
    	}
    	while((a<20)&&(P2!=0xff))	 //检测按键是否松开检测(P2!=0xff表示按键仍然处于按下的状态)
    	{
    		delay();
    		a++;
    	}
    	flags=0;
    }
    
    /*****数码管段选数码******/
    void Seg_Choose()
    {  	
    	unsigned int key=KeyValue;
    	if(key<10)   //个位数时直接显示
    	{
    		k1=0;
    		k2=key;
    		key=0;
    	}
    	else       //两位数时分别显示
    	{
    		while(key/10!=0)
    		{
    			k2=key%10;
    			key/=10;
    			k1=key;	
    		}
    	}
    }
    
    int main()
    {
    	while(1)
    	{	
    		Key_Down();
    		Seg_Choose();
    		P1=KB[k2];
    		P0=KB[k1];
    		Delay();
    	}  
    	return 0;
    }