话说现在的ARM都是玩的TFT  LCD了,但是仍有一些应用中还会用到在8051单片机常用的12864M显示屏了.晚上在公司加班无事可做,发现抽屉中居然有个12864,刚好也正在学Cortex-M3所以就顺便把它移植到了我的LM3S1138的开发板上来了.程式是我之前在8051上用写过并稳定运行过的,所以整体移植几乎没遇到什么问题.程式也很简单,所以直接上源.系统是繁体的,所以注解也是繁体,没办法公司电脑都是繁体的.

51上面的驱动也可以找我要.留言就可以了

由于是使用流明的LM3S系列芯片,所以我也使用固件库,这样更方便一点.
/*   CS == PE1
SIO== PE2
CLK== PE3   */

#define LCD_CS   GPIO_PIN_1
#define LCD_SIO  GPIO_PIN_2
#define LCD_CLK  GPIO_PIN_3
#define com 0
#define dat 1
/*********************************************************************

相关IO的初始化

**********************************************************************/
void softspi_init(void)
{
/*   CS == PE1
SIO== PE2
CLK== PE3   */

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,                  //设置两个LED为输出模式
GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_1);

GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_1,0×0);

}

/*********************************************************************

12864写入一个字节

**********************************************************************/

void lcd_byte(INT8U byte)    //LCD寫字節指令
{
INT8U i;
for(i=0;i<8;i++)
{
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0×0);    //     lcd_clk=0;
if(byte&0×80)
GPIOPinWrite(GPIO_PORTE_BASE,LCD_SIO,0xFF);
else                                                   // lcd_rw=CY;
GPIOPinWrite(GPIO_PORTE_BASE,LCD_SIO,0×0);
byte<<=1;

GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0xff);    //     lcd_clk=1;
}
}

/*************************************************************************lCD寫入數據子程式*****************************/
void lcd_write(INT8U dat_com,INT8U byt)    //lCD寫入數據子程式
{
INT8U temp;
if(dat_com==0)     //如果為0,則表示寫入指令
temp=0xf8;     //11111,RS(0),RW(0),0
else            //為1,寫入數據
temp=0xfa;     //11111,RS(1),RW(0),0

GPIOPinWrite(GPIO_PORTE_BASE,LCD_CS,0xff);    //  lcd_cs=1;
lcd_busy();            //檢測lCD是否為忙狀態
lcd_byte(temp);        //將首位寫入lCD
lcd_byte(byt&0xf0); //寫入高四位
lcd_byte(byt<<4);   //寫入低四位
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CS,0×0);    //  lcd_cs=0;
}

/**********************************************************************從lCD中讀取一個數據**************************/
INT8U lcd_read(void)    //從lCD中讀取一個數據
{
INT8U i,temp1,temp2;
temp1 = 0;
temp2 = 0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0×0);    //lcd_clk = 0;
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0xFF);    //lcd_clk = 1;
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0×0);    //lcd_clk = 0;
if(GPIOPinRead(GPIO_PORTE_BASE,LCD_SIO))    //  讀取IO狀態
temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0×0);    //lcd_clk = 0;
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0xFF);    //lcd_clk = 1;
GPIOPinWrite(GPIO_PORTE_BASE,LCD_CLK,0×0);    //lcd_clk = 0;
if(GPIOPinRead(GPIO_PORTE_BASE,LCD_SIO))    //  讀取IO狀態
temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}

/***********************************************************************等待lCD空閑狀態**************************/
void lcd_busy(void)    //等待lCD空閑狀態

{
do
lcd_byte(0xfc);      //11111,RW(1),RS(0),0
while(0×80&lcd_read());
}

/**********************************************************************lCD初始化******************************/
void lcd_init(void)    //lCD初始化
{
lcd_write(com,0×30); //基本指令功能.
lcd_write(com,0x0c); //打開顯示.關閉光標,關閉反白
lcd_write(com,0×01); //清屏指令.
lcd_write(com,0×06); //AC自動加一
}
/*********************************************************************LCD顯示漢字子程式********************/
void lcdshow(INT8U dz,INT8U nr[],INT8U sl)
{
unsigned char i=0;
unsigned char one;
unsigned char two;
lcd_write(com,dz);
for(;sl>0;sl–)
{
one=nr[i];
lcd_write(dat,one);
i+=1;
two=nr[i];
if(one<0×80)
{
if(two<0×80)
{
lcd_write(dat,two);
i+=1;
continue;
}
;
lcd_write(dat,0×02);
continue;
}

lcd_write(dat,two);
i+=1;
}
}

在实际应用中只须要先调用IO初始化,然后LCD初始化后就可以直接使用了.比如:

softspi_init();    //  初始化IO,只须要上电运行一次

lcd_init();          //  LCD初始化  ,让LCD处于白屏状态.

//然后直接用lcdshow函数显示汉字..

INT8U showfen[]={“单片机开发网”};     //定义一个要显示的数据串

lcdshow(0×80,showfen,5);                //调用lcdshow显示那个数据串,第一个参数是显示的位置,第二个参数是数据串的起始地址,第三个是显示的数量.

怎么样,这个函数够方便吧..

声明: 本站遵循 署名-非商业性使用-相同方式共享 3.0 共享协议. 转载请注明转自 单片机开发网

随机文章