各位热心网友能看看我这是哪出的问题,是程序问题还是电路问题呀。。。开启仿真是酱紫:
/*AMPIRE 128*64(128行64列)接在传统单片机上的P0口需接上拉电阻,其内部分为两个芯片:
IC1(左屏幕)与IC2(右屏幕)均为8页*64列(64*64点)(一页即8行)
*/
#include"STC12C5A.h"
#include "intrins.h"
#define LCD_Display_ON 0x3f//开显示
#define LCD_Display_OFF 0x3e//关显示
/*起始行的格式为:11------(0-63行)
起始列的格式为:01------(0-63列,与行构成64*64的IC)
起始页的格式为:1011----(0-7页)
*/
#define LCD_Row 0xc0//行首地址
#define LCD_Col 0x40//列首地址
#define LCD_Page 0xb8//页首地址
sbit cs1=P1^0;
sbit cs2=P1^1;
sbit E=P1^2;
sbit RW=P1^3;
sbit RS=P1^4;
/*华工*/
char Hz_hua[]={0x00,0x40,0x22,0x40,0x12,0x40,0x13,0xFC,0x84,0x40,0x48,0x40,0x40,0x40,0x17,0xFE,
0x10,0x00,0x20,0x00,0xE3,0xF8,0x22,0x08,0x22,0x08,0x22,0x08,0x23,0xF8,0x02,0x08
};
char Hz_gong[]={0x01,0x00,0x01,0x08,0x7D,0x10,0x05,0xA0,0x09,0x60,0x31,0x18,0xC5,0x06,0x02,0x00,
0x08,0x10,0x0A,0x14,0x6A,0xD4,0x2C,0x58,0x2A,0x54,0x4A,0x94,0xA9,0x52,0x10,0x20
};
/*延时函数,与函数名字无关,不是延时一毫秒*/
void delay_ms(int t)
{
char i,j;
for(i=0;i<t;i++);
for(j=0;j<10;j++);
}
/*状态检查:LCD是否忙*/
void LCD_Busy()
{
char busy;
E=0;
RS=0;//选择指令模式
RW=1;//选择读
while(1)
{
E=1;//读指令、数据模式
_nop_();
_nop_();//延时一小会
busy=P2;//读取状态标志存储器
_nop_();//延时一小会
E=0;
if((busy&0x80)==0)//检测BF位是否为0
break;
}
}
/*写命令到LCD中*/
void LCD_wcmd(char cmd)
{
LCD_Busy();//检测忙信号
RS=0;//选择指令模式
RW=0;//选择写
P2=cmd;//往P2口送入要写入的命令
delay_ms(2);//延时一小会
E=1;
delay_ms(2);//延时一小会
E=0;//下降沿写入命令
}
/*写数据到LCD中*/
void LCD_wdat(char dat)
{
LCD_Busy();//检测忙信号
RS=1;//选择数据模式
RW=0;//选择写
P2=dat;//往P2口送入要写入的数据
delay_ms(2);//延时一小会
E=1;
delay_ms(2);//延时一小会
E=0;//下降沿写入命令
}
/*LCD初始化*/
void LCD_Init()
{
delay_ms(100);//延时一小会
cs1=1;//刚开始关闭两屏
cs2=1;
delay_ms(100);//延时一小会
/*写初始化*/
LCD_wcmd(LCD_Display_OFF);//关闭显示屏
LCD_wcmd(LCD_Page+0);//设第0页为起始页
LCD_wcmd(LCD_Row+0);//设第0行为起始行
LCD_wcmd(LCD_Col+0);//设第0列为起始列
LCD_wcmd(LCD_Display_ON);//开启显示屏
}
/*清除LCD内存数据*/
void LCD_Clear()
{
unsigned char j,k;
cs1=0;//开启两个显示屏
cs2=0;
LCD_wcmd(LCD_Page+0);//设第0页为起始页
LCD_wcmd(LCD_Col+0);//设第0列为起始列
for(k=0;k<8;k++)//控制页数0—7,共8页
{
LCD_wcmd(LCD_Page+k);//设置第k页为写入页
for(j=0;j<64;j++) //每页最多可写32个中文或64个ASCII码
{
LCD_wcmd(LCD_Col+j);
LCD_wdat(0x00);//控制列数0—63,共64列,每写入一列,自动加一
}
}
}
/*指定位置显示汉字16*16*/
void hz_LCDDisp16(char page,char column,char* hz)
{
char i=0,j=0;
for(j=0;j<2;j++)
{
LCD_wcmd(LCD_Page+page+j);//设置第j页为写入页
LCD_wcmd(LCD_Col+column);//设第col列为起始列
for(i=0;i<16;i++)
{
LCD_wdat(hz[16*j+i]);
}
}
}
void main()
{
LCD_Init();
LCD_Clear();
cs1=0;
cs2=1;
hz_LCDDisp16(0,48, Hz_hua);
cs1=1;
cs2=0;
hz_LCDDisp16(0,0,Hz_gong);
while(1);
}
|