|

楼主 |
发表于 2009-6-19 12:13:51
|
显示全部楼层
下面开始挂程序,很乱哦:
显示部分的子函数与对应头文件:
//led12864.h:***************************************************************************
//extern void BMP_display(uchar bmptu[]);
//手動清屏(圖片模式)
//extern void BMP_clear();
//顯示字符串,第一個漢字的地址為0.
extern void LCD_String(unsigned char Addr,unsigned char *string);
extern void LCD_Init(void);
// LCD_COM(0x34);//切換到高級指令
// LCD_COM(0x36);//開畫圖
extern void LCD_delay(unsigned int yanshi);
extern void LCD_BUS(unsigned char adata,unsigned char LCD_S_RS);
//led12864.c:***************************************************************************
#include <reg52.h>
#include "led12864.h"
sbit LCD_CS=P1^4 ;//串口接法
sbit LCD_SID=P1^1 ;
sbit LCD_SCLK=P1^2;
void LCD_delay(unsigned int yanshi)
{
for(;yanshi>0;yanshi--);
}
//LCD_S_RS=0時為指令,反之。
void LCD_BUS(unsigned char adata,unsigned char LCD_S_RS)
{
unsigned char temps,c_flag,i;
unsigned char sdata1,sdata2,sdata3;
if(LCD_S_RS==0)sdata1=0x1f;//11111000(的反排序)
else sdata1=0x5f;//11111010(反序)
temps=adata;
temps=temps>>4;
sdata2=0;
for(i=0;i<4;i++)
{
c_flag = temps & 0x01;
if(c_flag == 0x01)
sdata2=(sdata2<<1)+1;
else
sdata2=(sdata2<<1);
temps=(temps>>1);
} //0000d4d5d6d7(反序)
temps=adata;
sdata3=0;
for(i=0;i<4;i++)
{
c_flag = temps & 0x01;
if(c_flag == 0x01)
sdata3=(sdata3<<1)+1;
else
sdata3=(sdata3<<1);
temps=(temps>>1);
} //0000d0d1d2d3(反序)
//開始發送數據
LCD_CS=1;
LCD_delay(5);
for(i=0;i<8;i++)
{
LCD_SID=sdata1&0x01;
LCD_SCLK=1;
LCD_delay(5);
LCD_SCLK=0;
sdata1=(sdata1>>1);
LCD_delay(10);
}
for(i=0;i<8;i++)
{
LCD_SID=sdata2&0x01;
LCD_SCLK=1;
LCD_delay(5);
LCD_SCLK=0;
sdata2=(sdata2>>1);
LCD_delay(10);
}
for(i=0;i<8;i++)
{
LCD_SID=sdata3&0x01;
LCD_SCLK=1;
LCD_delay(5);
LCD_SCLK=0;
sdata3=(sdata3>>1);
LCD_delay(10);
}
LCD_CS=0;
}
void LCD_Init()//必須先調用該程序進行初始化。
{
LCD_CS=0;
LCD_SCLK=0;
LCD_SID=0;
LCD_delay(3500);
LCD_BUS(0x30,0);
LCD_delay(3600);
LCD_BUS(0x30,0);
LCD_delay(360);
LCD_BUS(0x0c,0);
LCD_delay(336);
LCD_BUS(0x01,0);
LCD_delay(336);
LCD_BUS(0x06,0);
LCD_delay(360);
}
//顯示字符串,第一個漢字的地址為0.
void LCD_String(unsigned char Addr,unsigned char *string)
{
unsigned char wpoin;//字符指針
unsigned char wzijieshu;
wzijieshu=Addr*2;
if((Addr<=7))LCD_BUS(0x80+Addr,0);
if((Addr>=8)&&(Addr<=15))LCD_BUS(0x90+Addr-8,0);
if((Addr>=16)&&(Addr<=23))LCD_BUS(0x88+Addr-16,0);
if((Addr>=24)&&(Addr<=31))LCD_BUS(0x98+Addr-24,0);
if(Addr>31)return;
for(wpoin=0;(*(string+wpoin))!='\0';wpoin++)
{
if(wzijieshu==16)LCD_BUS(0x90,0);
if(wzijieshu==32)LCD_BUS(0x88,0);
if(wzijieshu==48)LCD_BUS(0x98,0);
if(wzijieshu==64)return;
LCD_BUS((*(string+wpoin)),1);//數據
wzijieshu++;
}
}
/*
//手動清屏(圖片模式)
void BMP_clear()
{
uchar i,j;
for(i=0;i<32;i++) //12864实际为256x32
{
LED_COM(0x80+i); //垂直坐標
LED_COM(0x80); //水平坐標
for(j=0;j<16;j++) //256/8=32 byte
{
LED_DATA(0);
LED_DATA(0);
}
}
}
void BMP_display(uchar bmptu[])
{uint bpoin;
uchar i,j;
bpoin=0;
//上半屏
for(i=0;i<32;i++) //12864实际为256x32
{
LED_COM(0x80+i); //垂直坐標
LED_COM(0x80); //水平坐標
for(j=0;j<8;j++) //256/8=32 byte
{
LED_DATA(bmptu[bpoin]);
LED_DATA(bmptu[bpoin+1]);
bpoin+=2;
}
}
//下半屏
for(i=0;i<32;i++) //12864实际为256x32
{
LED_COM(0x80+i); //垂直坐標
LED_COM(0x88); //水平坐標
for(j=0;j<8;j++) //256/8=32 byte
{
LED_DATA(bmptu[bpoin]);
LED_DATA(bmptu[bpoin+1]);
bpoin+=2;
}
}
} */ |
|