做最优秀的电子开发团队
搞定12864M LCD在流明LM3S系列ARM上的驱动
话说现在的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 共享协议. 转载请注明转自 单片机开发网
随机文章
| 打印文章 | 这篇文章由sowait于2009年12月19日 7:52 下午发表在Cortex-M3。你可以订阅RSS 2.0 也可以发表评论或引用到你的网站。 |
大约1月前
留个QQ 有问题问 感激不尽