proteus8.15仿真1602,程序在社区复制的。仿真1602只亮屏不显示。
求大家出出主意
#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不要直接接地,用个电位器调节一下对比度
先尝试调单个字符的显示!
#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);
}
/********键盘检测函数************/
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;
}