at91rm9200驱动 sed1520 12232 lcd的程序(原创)

[复制链接]
4293|12
 楼主| wangkj 发表于 2007-9-11 15:17 | 显示全部楼层 |阅读模式
<br />/*-------------------------------------------------------------------------------------<br />date:20070911<br />author:&nbsp;wkj<br />ver&nbsp;1.0<br />sed1520&nbsp;12232&nbsp;lcd&nbsp;driver<br />input:XXXXXX<br />output:return&nbsp;0<br />---------------------------------------------------------------------------------------*/<br />#include&nbsp;&ltsys/types.h&gt<br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltstdarg.h&gt<br />#include&nbsp;&ltstdlib.h&gt<br />#include&nbsp;&ltstring.h&gt<br />#include&nbsp;&ltunistd.h&gt<br />#include&nbsp;&ltfcntl.h&gt<br />#include&nbsp;&lterrno.h&gt<br />#include&nbsp;&ltsignal.h&gt<br />#include&nbsp;&lttime.h&gt<br />#include&nbsp;&ltsys/time.h&gt<br />#include&nbsp;&ltsys/ioctl.h&gt<br />#include&nbsp;&ltsys/stat.h&gt<br />#include&nbsp;&ltsys/file.h&gt<br />#include&nbsp;&quot;gpio.h&quot;<br />#include&nbsp;&quot;main.h&quot;<br />#include&nbsp;&quot;io.h&quot;<br />#include&nbsp;&ltstdarg.h&gt<br />#include&nbsp;&ltmemory.h&gt<br />#include&nbsp;&lterrno.h&gt<br />#include&nbsp;&ltsys/types.h&gt<br />#include&nbsp;&ltsys/socket.h&gt<br />#include&nbsp;&ltsys/mman.h&gt<br />#include&nbsp;&ltsys/ioctl.h&gt<br />#include&nbsp;&ltfcntl.h&gt<br />#include&nbsp;&ltsignal.h&gt<br />#include&nbsp;&quot;font5x7.h&quot;<br />#define&nbsp;DEVICE_FILE_NAME&nbsp;&quot;scan_keyb&quot;<br />void&nbsp;&nbsp;&nbsp;&nbsp;*map_base;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//phy&nbsp;0xffff&nbsp;f000&nbsp;virtual&nbsp;address<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;uint&nbsp;unsigned&nbsp;int<br />#define&nbsp;Byte&nbsp;unsigned&nbsp;char<br />#define&nbsp;Word&nbsp;unsigned&nbsp;int<br />#define&nbsp;FIRSTPAGE&nbsp;2&nbsp;<br />//当前像素位置&nbsp;和当前显示页&nbsp;<br />static&nbsp;unsigned&nbsp;char&nbsp;PixX,page;<br />#define&nbsp;DEBUGMSG(x,&nbsp;y,&nbsp;args...)&nbsp;printf(y,&nbsp;##args)<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_CMD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;0x1&lt&lt28;&nbsp;//PC28&nbsp;as&nbsp;0;&nbsp;A0=0<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0x1&lt&lt28;&nbsp;//PC28&nbsp;as&nbsp;1;&nbsp;A0=1<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_WRITE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;0x1&lt&lt30;//PC30&nbsp;as&nbsp;0&nbsp;;&nbsp;RW=0&nbsp;<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_READ&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0x1&lt&lt30;//PC30&nbsp;as&nbsp;1&nbsp;;&nbsp;RW=1<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clear_LCD_E1&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;&nbsp;0x1&lt&lt13;//PC13&nbsp;as&nbsp;0;&nbsp;E1=0&nbsp;&nbsp;<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET_LCD_E1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0x1&lt&lt13;//PC13&nbsp;as&nbsp;1;&nbsp;E1=1&nbsp;<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Clear_LCD_E2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;0x1&lt&lt10;//PC10&nbsp;as&nbsp;0;&nbsp;E2=0<br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET_LCD_E2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*((unsigned&nbsp;long*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0x1&lt&lt10;//PC10&nbsp;as&nbsp;1;&nbsp;E2=1<br /><br />/*----------------------------------------------------------------------------<br />调用方式:void&nbsp;OutMI(uchar&nbsp;i)<br />函数说明:发指令i到主窗口。(内函数,私有,用户不直接调用)<br />------------------------------------------------------------------------------*/<br />void&nbsp;OutMI(uchar&nbsp;i)<br />{<br />&nbsp;&nbsp;volatile&nbsp;unsigned&nbsp;int&nbsp;LCD_STAT;&nbsp;<br />//&nbsp;&nbsp;A0=0;<br />&nbsp;&nbsp;LCD_CMD&nbsp;;<br />//&nbsp;&nbsp;RW=1;<br />&nbsp;&nbsp;LCD_READ;<br />&nbsp;&nbsp;do&nbsp;//if&nbsp;lcd&nbsp;is&nbsp;always&nbsp;busy&nbsp;,should&nbsp;no&nbsp;return,so&nbsp;should&nbsp;add&nbsp;couter&nbsp;for&nbsp;exit&nbsp;of&nbsp;timeout<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//DATA=0xFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0xFF&lt&lt16;&nbsp;//all&nbsp;data&nbsp;to&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SET_LCD_E1;<br />&nbsp;&nbsp;&nbsp;&nbsp;//LCD_STAT=LCD_BUSY;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_ODR&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;input&nbsp;//0&nbsp;bit&nbsp;no&nbsp;effect<br />&nbsp;&nbsp;&nbsp;&nbsp;LCD_STAT=*(unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_PDSR&nbsp;)));//PC0...PC31<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_OER&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;output&nbsp;again<br />&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(((LCD_STAT&nbsp;&gt&gt16&nbsp;)&0x80)!=0);&nbsp;&nbsp;//bit&nbsp;7&nbsp;of&nbsp;pc23..pc16&nbsp;is&nbsp;1&nbsp;is&nbsp;busy.&nbsp;pc23..16&gt&gt16=&gtD7..D0<br /><br />&nbsp;&nbsp;//RW=0;&nbsp;<br />&nbsp;&nbsp;LCD_WRITE;<br />&nbsp;&nbsp;//DATA=i;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;i&lt&lt16;&nbsp;//all&nbsp;1&nbsp;bit&nbsp;output<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;(~i)&lt&lt16;&nbsp;//all&nbsp;0&nbsp;bit&nbsp;output&nbsp;use&nbsp;negtive&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;//E1=0;<br />&nbsp;&nbsp;SET_LCD_E1;<br />&nbsp;&nbsp;Clear_LCD_E1;<br />}<br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;OutMD(uchar&nbsp;i)<br />函数说明:发数据i到主窗口。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;OutMD(uchar&nbsp;i)<br />{<br />&nbsp;&nbsp;volatile&nbsp;unsigned&nbsp;int&nbsp;LCD_STAT;&nbsp;<br />//&nbsp;&nbsp;A0=0;<br />&nbsp;&nbsp;LCD_CMD&nbsp;;<br />//&nbsp;&nbsp;RW=1;<br />&nbsp;&nbsp;LCD_READ;<br />&nbsp;&nbsp;do&nbsp;//if&nbsp;lcd&nbsp;is&nbsp;always&nbsp;busy&nbsp;,should&nbsp;no&nbsp;return,so&nbsp;should&nbsp;add&nbsp;couter&nbsp;for&nbsp;exit&nbsp;of&nbsp;timeout<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//DATA=0xFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0xFF&lt&lt16;&nbsp;//all&nbsp;data&nbsp;to&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SET_LCD_E1;<br />&nbsp;&nbsp;&nbsp;&nbsp;//LCD_STAT=LCD_BUSY;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_ODR&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;input&nbsp;//0&nbsp;bit&nbsp;no&nbsp;effect<br />&nbsp;&nbsp;&nbsp;&nbsp;LCD_STAT=*(unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_PDSR&nbsp;)));//PC0...PC31<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_OER&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;output&nbsp;again<br />&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(((LCD_STAT&nbsp;&gt&gt16&nbsp;)&0x80)!=0);&nbsp;&nbsp;//bit&nbsp;7&nbsp;of&nbsp;pc23..pc16&nbsp;is&nbsp;1&nbsp;is&nbsp;busy.&nbsp;pc23..16&gt&gt16=&gtD7..D0<br /><br />//&nbsp;&nbsp;A0=1;<br />&nbsp;&nbsp;LCD_DATA;<br />&nbsp;&nbsp;//RW=0;&nbsp;<br />&nbsp;&nbsp;LCD_WRITE;<br />&nbsp;&nbsp;//DATA=i;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;i&lt&lt16;&nbsp;//all&nbsp;1&nbsp;bit&nbsp;output<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;(~i)&lt&lt16;&nbsp;//all&nbsp;0&nbsp;bit&nbsp;output&nbsp;use&nbsp;negtive&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;//E1=0;<br />&nbsp;&nbsp;SET_LCD_E1;<br />&nbsp;&nbsp;Clear_LCD_E1;<br />}<br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;OutSI(uchar&nbsp;i)<br />函数说明:发指令i到从窗口。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;OutSI(uchar&nbsp;i)<br />{<br />&nbsp;&nbsp;volatile&nbsp;unsigned&nbsp;int&nbsp;LCD_STAT;&nbsp;<br />//&nbsp;&nbsp;A0=0;<br />&nbsp;&nbsp;LCD_CMD&nbsp;;<br />//&nbsp;&nbsp;RW=1;<br />&nbsp;&nbsp;LCD_READ;<br />&nbsp;&nbsp;do&nbsp;//if&nbsp;lcd&nbsp;is&nbsp;always&nbsp;busy&nbsp;,should&nbsp;no&nbsp;return,so&nbsp;should&nbsp;add&nbsp;couter&nbsp;for&nbsp;exit&nbsp;of&nbsp;timeout<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//DATA=0xFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0xFF&lt&lt16;&nbsp;//all&nbsp;data&nbsp;to&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SET_LCD_E2;<br />&nbsp;&nbsp;&nbsp;&nbsp;//LCD_STAT=LCD_BUSY;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_ODR&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;input&nbsp;//0&nbsp;bit&nbsp;no&nbsp;effect<br />&nbsp;&nbsp;&nbsp;&nbsp;LCD_STAT=*(unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_PDSR&nbsp;)));//PC0...PC31<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_OER&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;output&nbsp;again<br />&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(((LCD_STAT&nbsp;&gt&gt16&nbsp;)&0x80)!=0);&nbsp;&nbsp;//bit&nbsp;7&nbsp;of&nbsp;pc23..pc16&nbsp;is&nbsp;1&nbsp;is&nbsp;busy.&nbsp;pc23..16&gt&gt16=&gtD7..D0<br /><br />&nbsp;&nbsp;//RW=0;&nbsp;<br />&nbsp;&nbsp;LCD_WRITE;<br />&nbsp;&nbsp;//DATA=i;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;i&lt&lt16;&nbsp;//all&nbsp;1&nbsp;bit&nbsp;output&nbsp;;&nbsp;0&nbsp;no&nbsp;effect&nbsp;<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;(~i)&lt&lt16;&nbsp;//all&nbsp;0&nbsp;bit&nbsp;output&nbsp;use&nbsp;negtive&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;//E1=0;<br />&nbsp;&nbsp;SET_LCD_E2;<br />&nbsp;&nbsp;Clear_LCD_E2;<br />}<br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;OutSD(uchar&nbsp;i)<br />函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;OutSD(uchar&nbsp;i)<br />{<br />&nbsp;&nbsp;volatile&nbsp;unsigned&nbsp;int&nbsp;LCD_STAT;&nbsp;<br />//&nbsp;&nbsp;A0=0;<br />&nbsp;&nbsp;LCD_CMD&nbsp;;<br />//&nbsp;&nbsp;RW=1;<br />&nbsp;&nbsp;LCD_READ;<br />&nbsp;&nbsp;do&nbsp;//if&nbsp;lcd&nbsp;is&nbsp;always&nbsp;busy&nbsp;,should&nbsp;no&nbsp;return,so&nbsp;should&nbsp;add&nbsp;couter&nbsp;for&nbsp;exit&nbsp;of&nbsp;timeout<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//DATA=0xFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0xFF&lt&lt16;&nbsp;//all&nbsp;data&nbsp;to&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SET_LCD_E2;<br />&nbsp;&nbsp;&nbsp;&nbsp;//LCD_STAT=LCD_BUSY;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_ODR&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;input&nbsp;//0&nbsp;bit&nbsp;no&nbsp;effect<br />&nbsp;&nbsp;&nbsp;&nbsp;LCD_STAT=*(unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_PDSR&nbsp;)));//PC0...PC31<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_OER&nbsp;))))&nbsp;=&nbsp;0xFF&lt&lt16;//as&nbsp;output&nbsp;again<br />&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(((LCD_STAT&nbsp;&gt&gt16&nbsp;)&0x80)!=0);&nbsp;&nbsp;//bit&nbsp;7&nbsp;of&nbsp;pc23..pc16&nbsp;is&nbsp;1&nbsp;is&nbsp;busy.&nbsp;pc23..16&gt&gt16=&gtD7..D0<br /><br />//&nbsp;&nbsp;A0=1;<br />&nbsp;&nbsp;LCD_DATA;<br />&nbsp;&nbsp;//RW=0;&nbsp;<br />&nbsp;&nbsp;LCD_WRITE;<br />&nbsp;&nbsp;//DATA=i;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;i&lt&lt16;&nbsp;//all&nbsp;1&nbsp;bit&nbsp;output<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;(~i)&lt&lt16;&nbsp;//all&nbsp;0&nbsp;bit&nbsp;output&nbsp;use&nbsp;negtive&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//E1=1;<br />&nbsp;&nbsp;//E1=0;<br />&nbsp;&nbsp;SET_LCD_E2;<br />&nbsp;&nbsp;Clear_LCD_E2;<br />}<br /><br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;LcdIni(void)<br />函数说明:12232点阵液晶初始化,开机后仅调用一次。<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;LcdIni(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//LCD_RESET=0;&nbsp;&nbsp;//to&nbsp;68&nbsp;mode<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_CODR))))&nbsp;=&nbsp;0x1&nbsp;&lt&lt14;//Reset&nbsp;&nbsp;PC14=0<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt255;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;//LCD_RESET=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_SODR))))&nbsp;=&nbsp;0x1&nbsp;&lt&lt14;//Reset&nbsp;&nbsp;PC14=1<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0XE2);OutSI(0XE2);//复位<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0XA4);OutSI(0XA4);//动态驱动//关闭休闲状态&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//OutMI(0XAE);OutSI(0XAE);//POWER&nbsp;SAVE&nbsp;//disp&nbsp;off<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0XA9);OutSI(0XA9);//1/32占空比<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0XA0);OutSI(0XA0);//&nbsp;ADC&nbsp;forward&nbsp;,时钟线输出<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0Xc0);OutSI(0Xc0);//display&nbsp;start&nbsp;line,first&nbsp;line<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0X00);OutSI(0X00);//col&nbsp;address&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0XB8);OutSI(0XB8);//set&nbsp;page&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0XEE);OutSI(0XEE);//read&nbsp;modify&nbsp;off&nbsp;写模式<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0XAF);OutSI(0XAF);&nbsp;//display&nbsp;on&nbsp;of&nbsp;main&nbsp;and&nbsp;master<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;SetPage(uchar&nbsp;page0,uchar&nbsp;page1)<br />函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;SetPage(uchar&nbsp;page0,uchar&nbsp;page1)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(0xB8|page1);OutSI(0xB8|page0);<br />}<br /><br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;SetAddress(uchar&nbsp;address0,uchar&nbsp;address1)<br />函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;SetAddress(uchar&nbsp;address0,uchar&nbsp;address1)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(address1&0x7F);OutSI(address0&0x7F);<br />}<br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;SetStartRow(uchar&nbsp;row0,uchar&nbsp;row1)<br />函数说明:同时设置主从行地址为0-31。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;SetStartRow(uchar&nbsp;row0,uchar&nbsp;row1)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMI(row0&0xC0);OutSI(row1&0xC0);<br />}<br /><br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;PutChar0(uchar&nbsp;ch)<br />函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;PutChar0(uchar&nbsp;ch)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OutSD(ch);<br />}<br /><br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;PutChar1(uchar&nbsp;ch)<br />函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;PutChar1(uchar&nbsp;ch)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OutMD(ch);<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br /><br />/*------------------------------------------------------------------------------<br />--<br />调用方式:void&nbsp;clrscr(void)<br />函数说明:清屏<br />--------------------------------------------------------------------------------<br />-*/<br />void&nbsp;clrscr(void)<br />{<br />&nbsp;&nbsp;uchar&nbsp;i;<br /><br />&nbsp;&nbsp;for&nbsp;(page=0;page&lt4;page++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(page,page);<br />&nbsp;&nbsp;&nbsp;&nbsp;SetAddress(0,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt61;i++){PutChar0(0x00);PutChar1(0);}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;page=FIRSTPAGE;<br />&nbsp;&nbsp;PixX=0;<br />&nbsp;&nbsp;SetPage(page,page);<br />&nbsp;&nbsp;SetAddress(0,0);<br />&nbsp;&nbsp;SetStartRow(0,0);<br />}&nbsp;<br /><br /><br />/*------------------------------------------------------------------------------<br />--<br />every&nbsp;chinese&nbsp;charset&nbsp;is&nbsp;16x16&nbsp;bitmap<br />调用方式:void&nbsp;LcdPutCch(unsigned&nbsp;char&nbsp;str[])<br />函数说明:显示中文字符<br />字符在LCD上的显示速度较慢,如果正在接受serial&nbsp;port的数据,请不要一次显示太多的字符,<br />以免字符接受丢失<br />进入中文显示方式是:&nbsp;发送字符&nbsp;CCHMODE&nbsp;&nbsp;(0xF0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发送字符阵列(纵向16点阵(上部),纵向16点阵(下部)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用LcdPutCch,str为点阵指针;<br />--------------------------------------------------------------------------------*/<br />/*void&nbsp;LcdPutCch(unsigned&nbsp;char&nbsp;str[])<br />{<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;if&nbsp;(PixX&gt121-15)&nbsp;&nbsp;//no&nbsp;space&nbsp;to&nbsp;place&nbsp;one&nbsp;chinese&nbsp;char&nbsp;,&nbsp;need&nbsp;to&nbsp;&ltCR&gt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(page==4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//out&nbsp;of&nbsp;last&nbsp;line<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page=0;&nbsp;&nbsp;//wrap&nbsp;to&nbsp;firt&nbsp;line&nbsp;of&nbsp;display&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPage(page,page);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAddress(0,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt32;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;if&nbsp;(i==16)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX=PixX-16;&nbsp;//back&nbsp;16&nbsp;pix&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(page==4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//out&nbsp;of&nbsp;last&nbsp;line<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page=0;&nbsp;&nbsp;//wrap&nbsp;to&nbsp;firt&nbsp;line&nbsp;of&nbsp;display&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPage(page,page);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAddress(PixX,PixX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if&nbsp;(PixX&lt61)&nbsp;//0..60<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutChar1(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//61..121<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutChar0(str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />}<br />*/<br />/*------------------------------------------------------------------------------<br />--<br />every&nbsp;english&nbsp;charset&nbsp;is&nbsp;8x8&nbsp;bitmap<br />调用方式:void&nbsp;LcdPutCh(unsigned&nbsp;char&nbsp;ch)<br />函数说明:显示字符<br />only&nbsp;display&nbsp;from&nbsp;0x20&nbsp;to&nbsp;0x7f&nbsp;&nbsp;,&nbsp;all&nbsp;ASCIII&nbsp;code.<br />字符在LCD上的显示速度较慢,如果正在接受serial&nbsp;port的数据,请不要一次显示太多的字符,<br />以免字符接受丢失<br />--------------------------------------------------------------------------------*/<br />void&nbsp;LcdPutCh(unsigned&nbsp;char&nbsp;ch)<br />{<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,j;<br /><br />&nbsp;&nbsp;&nbsp;if&nbsp;(ch=='\n')&nbsp;&nbsp;//need&nbsp;to&nbsp;&ltCR&gt<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(page==4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//out&nbsp;of&nbsp;last&nbsp;line<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page=0;&nbsp;&nbsp;//wrap&nbsp;to&nbsp;firt&nbsp;line&nbsp;of&nbsp;display&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPage(page,page);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAddress(0,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if&nbsp;(PixX&gt121-6)&nbsp;&nbsp;//no&nbsp;space&nbsp;to&nbsp;place&nbsp;one&nbsp;char&nbsp;,&nbsp;need&nbsp;to&nbsp;&ltCR&gt<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(page==4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//out&nbsp;of&nbsp;last&nbsp;line<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page=0;&nbsp;&nbsp;//wrap&nbsp;to&nbsp;firt&nbsp;line&nbsp;of&nbsp;display&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPage(page,page);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAddress(0,0);<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;i=ch-'&nbsp;';<br />&nbsp;&nbsp;&nbsp;for&nbsp;(j=0;j&lt5;j++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//3&nbsp;space&nbsp;pixel<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(PixX&lt61)&nbsp;//0..60<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutChar1(Fonts[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//61..121<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutChar0(Fonts[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for&nbsp;(j=0;j&lt3;j++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(PixX&lt61)&nbsp;//0..60<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutChar1(0x0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//61..121<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutChar0(0x0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PixX++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />}<br />/*------------------------------------------------------------------------------<br />--<br />调用方式:<br />函数说明:显示字符串<br />\n&nbsp;will&nbsp;&ltCR&gt,<br />string&nbsp;length&nbsp;must&nbsp;be&nbsp;less&nbsp;then&nbsp;255.<br />every&nbsp;line&nbsp;&lt15&nbsp;ASCII,<br />It&nbsp;will&nbsp;be&nbsp;display&nbsp;line&nbsp;by&nbsp;line,<br />if&nbsp;display&nbsp;after&nbsp;last&nbsp;line,it&nbsp;will&nbsp;be&nbsp;&nbsp;display&nbsp;in&nbsp;first&nbsp;line<br />--------------------------------------------------------------------------------*/<br />void&nbsp;LcdPutS(unsigned&nbsp;char&nbsp;*Str)<br />{&nbsp;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;for&nbsp;(i=0;i&ltstrlen(Str);i++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;LcdPutCh(Str);<br />&nbsp;&nbsp;}<br />}<br />//#define&nbsp;DEBUGMSG(x,&nbsp;y,&nbsp;args...)<br />FILE&nbsp;*f;<br />int&nbsp;n,fd;<br /><br />int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;*argv[])<br />{<br />char&nbsp;num,status=0;<br />int&nbsp;i,j,count;<br />int&nbsp;ch;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />printf(&quot;start\n&quot;);<br />if((fd&nbsp;=&nbsp;open(&quot;/dev/mem&quot;,&nbsp;O_RDWR&nbsp;|&nbsp;O_SYNC))&nbsp;==&nbsp;-1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUGMSG(DEBUG_ERR,&nbsp;&quot;gpio:&nbsp;Error&nbsp;opening&nbsp;/dev/mem\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//map&nbsp;0xffff<br />map_base&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;mmap(0,&nbsp;MAP_SIZE,&nbsp;PROT_READ&nbsp;|&nbsp;PROT_WRITE,&nbsp;MAP_SHARED,&nbsp;fd,&nbsp;AT91_SYS);//AT91_SYS&nbsp;=&nbsp;0xffff&nbsp;f000<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_PER&nbsp;))))&nbsp;=&nbsp;0x50FF6400;&nbsp;//PC23:PC16&nbsp;PC14,13,10,30,28as&nbsp;gpio&nbsp;;1&nbsp;bit&nbsp;set&nbsp;to&nbsp;GPIO&nbsp;and&nbsp;zero&nbsp;bit&nbsp;no&nbsp;effect<br />//may&nbsp;the&nbsp;format&nbsp;is&nbsp;better=&nbsp;(0xff&lt&lt16)|(0x1&lt&lt14)|(0x1&lt&lt13)|(0x1&lt&lt10)|(0x1&lt&lt30)|(0x1&lt&lt28);&nbsp;<br />*((volatile&nbsp;unsigned&nbsp;int*)(map_base&nbsp;+&nbsp;((PIOC_OFFSET&nbsp;+&nbsp;AT91_PIO_OER&nbsp;))))&nbsp;=&nbsp;0x50FF6400;//as&nbsp;output<br /><br />&nbsp;&nbsp;LcdIni();&nbsp;//LCD&nbsp;init&nbsp;and&nbsp;reset<br />&nbsp;&nbsp;clrscr();&nbsp;<br />&nbsp;&nbsp;LcdPutS(&quot;1234567890abcde&quot;);<br />&nbsp;&nbsp;LcdPutS(&quot;2@#$%^&*()ABCDF&quot;);<br />&nbsp;&nbsp;clrscr();<br />&nbsp;&nbsp;LcdPutS(&quot;$:&gt&quot;);<br />close(fd);<br />return&nbsp;0;<br />}<br />
LPcfANS 发表于 2007-9-11 15:18 | 显示全部楼层

沙发.

  
 楼主| wangkj 发表于 2007-9-11 15:21 | 显示全部楼层

http 下载地址:

这是根据我的at91_core和ext扩展做得,这个是12232的。<br />刚刚完成,还没测试。以前测试过320*240和19264的是没有问题的。<br />用GPIO驱动的,改动起来很容易,非内核方式。<br />原来我说过,作一个使用的非内核驱动的例子,这个就是了。
 楼主| wangkj 发表于 2007-9-11 15:28 | 显示全部楼层

沙发太快了 ......比我的注释还快。

我写的这个例子程序注释极其清楚。如果再不明白。无语了。<br />LCD&nbsp;手册:http://amd.9966.org/pic/qf12232A.pdf<br />这个程序是给别人订做的,不过,版权是我的,就公开了。<br />这个仅仅是lcd部分的。所以,对用户也没有任何损失。
阿南 发表于 2007-9-11 20:17 | 显示全部楼层

支持老wang,嗨没办法!否则要天天给您穿红酷头,烦死人.

以后自己加
 楼主| wangkj 发表于 2007-9-12 08:02 | 显示全部楼层

这个程序和51的程序除了最底层的四个函数不同

其他的完全相同。最底层的四个函数其实也是类似的。<br />这些都是直接控制硬件实现的。<br />就是是我说的,用arm像51一样简单的意思。
 楼主| wangkj 发表于 2007-9-20 12:27 | 显示全部楼层

无意中发现 俺的帖子在头版

xieqin 发表于 2007-9-20 12:53 | 显示全部楼层

...

玩单片机或只玩玩简单的LCD显示,这种方法倒不错.<br /><br />对UI要求较高的应用,这种方法的效率和性能就太低了.&nbsp;用个buffer做虚拟的&quot;屏幕&quot;才行.<br /><br />不信,搞个简单的两行字重叠显示试试,搞个图片上显示半透字试试
flylongins 发表于 2007-9-20 19:13 | 显示全部楼层

老王时间真多啊。。。。

顶。
 楼主| wangkj 发表于 2007-9-20 22:08 | 显示全部楼层

这个针对的就是简单应用

让arm9比单片机还简单<br />如果是我的全环境的at91_core,连编译器都内置到板子中了。
hotpover 发表于 2007-9-21 22:24 | 显示全部楼层

怎么会有void *map_base; 这样的语法的 ?

  
 楼主| wangkj 发表于 2007-9-22 00:01 | 显示全部楼层

无类型指针。

  
ggbb 发表于 2008-1-23 16:11 | 显示全部楼层

;;

本帖最后由 ggbb 于 2014-12-1 01:44 编辑

;;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

580

主题

9972

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部