仅仅使用pc14,pc15两个GPIO,外加电源线两条。(未测试,供参考)。<br />最近几天有空了测试<br />这种液晶是最常见的 12832,12864控制器,他们都是通用的。<br />硬件:sck - pc14 sid -> pc15 <br />psb - GND , CS - VCC<br /><br /><br />/*-------------------------------------------------------------------------------------<br />date:20071109<br />author: wkj<br />ver 1.0<br />stc7920 lcd driver<br />---------------------------------------------------------------------------------------*/<br />#include <sys/types.h><br />#include <stdio.h><br />#include <stdarg.h><br />#include <stdlib.h><br />#include <string.h><br />#include <unistd.h><br />#include <fcntl.h><br />#include <errno.h><br />#include <signal.h><br />#include <time.h><br />#include <sys/time.h><br />#include <sys/ioctl.h><br />#include <sys/stat.h><br />#include <sys/file.h><br />#include "gpio.h"<br />#include "main.h"<br />#include "io.h"<br />#include <stdarg.h><br />#include <memory.h><br />#include <errno.h><br />#include <sys/types.h><br />#include <sys/socket.h><br />#include <sys/mman.h><br />#include <sys/ioctl.h><br />#include <fcntl.h><br />#include <signal.h><br /><br />//当前像素位置 和当前显示页 <br />static unsigned char PixX,page;<br />#define DEBUGMSG(x, y, args...) printf(y, ##args)<br />void *map_base; //phy 0xffff f000 virtual address<br />//clock input 同步时钟输入端<br />#define E_CLK_0 *((unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<14; //PC14 as 0; A0=0<br />#define E_CLK_1 *((unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<14; //PC14 as 1; A0=1<br />#define RW_SID_0 *((unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<15; //PC15 as 0 ; RW=0 <br />#define RW_SID_1 *((unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<15; //PC15 as 1 ; RW=1<br /><br />void delay(unsigned long int n)<br />{<br /> unsigned long int i;<br /> for(i=0; i<n*10; i++) {;}<br />}<br /><br /> //串行发送一字节数据<br />void SendByte(unsigned char dat)<br />{<br /> unsigned char i;<br /> for(i=0;i<8;i++)<br /> {<br /> E_CLK_0;<br /> if(dat&0x80)<br /> {<br /> RW_SID_1;<br /> }<br /> else <br /> {<br /> RW_SID_0;<br /> }<br /> E_CLK_1;<br /> dat=dat<<1;<br /> }<br />}<br />//写控制命令<br />void SendCMD(unsigned char dat)<br />{<br /> SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志<br /> SendByte(dat&0xF0);//高四位<br /> SendByte((dat&0x0F)<<4);//低四位<br />}<br /><br />//写显示数据或单字节字符<br />void SendDat(unsigned char dat)<br />{<br /> SendByte(0xFA);//11111,01,0 RW=0,RS=1<br /> SendByte(dat&0xF0);//高四位<br /> SendByte((dat&0x0F)<<4);//低四位<br />}<br /><br />/* 写汉字到LCD 指定的位置<br /> x_add显示RAM的地址<br /> dat1/dat2显示汉字编码<br />*/<br />void display(unsigned char x_add,unsigned char dat1,unsigned char dat2)<br />{<br /> SendCMD(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC<br /> SendDat(dat1);<br /> SendDat(dat2);<br />}<br /><br />//初始化 LCM<br />void initlcm(void)<br />{<br /> delay(100);<br /> SendCMD(0x30);//功能设置,一次送8位数据,基本指令集<br /> SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off<br /> SendCMD(0x01);//0000,0001 清DDRAM<br /> SendCMD(0x02);//0000,0010 DDRAM地址归位<br /> SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC<br />}<br /><br /><br />//////////////////////////////////////////<br />unsigned char SetLcdDisplayCharPos(unsigned char row, unsigned char col) <br />{ <br /> if ((row < 2) && (col < 16))//英文字符为2行16列 <br /> { <br /> SendCMD(0x80 + row * 16 + col);//发送设定DDRAM地址row * 16 + col命令 <br /> return 1; <br /> } <br /> else <br /> return 0; <br />} <br /><br />void LcdDisplayChar(unsigned char row, unsigned char col, unsigned char * string) <br />{ <br /> if (SetLcdDisplayCharPos(row, col)) <br /> { <br /> SendDat(*string); <br /> } <br />} <br /><br />unsigned char SetLcdDisplayChinsePos(unsigned char row, unsigned char col) <br />{ <br /> if ((row < 2) && (col < 8))//汉字字符为2行8列(偶数对齐) <br /> { <br /> SendCMD(0x80 + row * 16 + col * 2);//发送设定DDRAM地址row * 16 + col * 2命令 <br /> return 1; <br /> } <br /> else <br /> return 0; <br />} <br /><br />void LcdDisplayChinse(unsigned char row, unsigned char col, unsigned char * string) <br />{ <br /> if (SetLcdDisplayChinsePos(row, col)) <br /> { <br /> SendDat(*string); <br /> SendDat(*(string + 1)); <br /> } <br />} <br /><br />void LcdDisplayString(unsigned char * string) <br />{ <br /> while(*string) SendDat(*string ++); <br />} <br /><br /><br />//////////////////////////////////////////<br /><br />FILE *f;<br />int n,fd;<br />main(void)<br />{<br />char num,status=0;<br />int i,j,count;<br />int ch; <br /> <br />printf("start
");<br />if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1){<br /> DEBUGMSG(DEBUG_ERR, "gpio: Error opening /dev/mem
");<br /> exit(-1);<br /> }<br /> //map 0xffff<br />map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, AT91_SYS);//AT91_SYS = 0xffff f000<br /> <br />*((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_PER )))) = (0x1<<15)|(0x1<<14); //PC15 PC14 as gpio ;1 bit set to GPIO and zero bit no effect<br />*((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_OER )))) = (0x1<<15)|(0x1<<14);;//as output<br />*((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_PUER )))) = (0x1<<15)|(0x1<<14);;//use up resistor<br /><br /> initlcm();<br /> SendCMD(0x81);//1000,0001 设定DDRAM 7位地址000,0001到地址计数器AC<br /> SendDat(0x33);<br /> SendDat(0x42);<br /> SendDat(0x43);<br /> SendDat(0x44);<br /> SendCMD(0x00);<br /><br /> SetLcdDisplayChinsePos(0, 0);//汉字定位到上行左端 <br /> LcdDisplayString("汉字显示演示程序"); <br /> delay(65535);<br /> SetLcdDisplayCharPos(1,0);//字符定位到下行左端 <br /> LcdDisplayString("0123456789ABCDEF"); <br /><br /> delay(65535);<br /><br /> for(;;)<br /> {<br /> delay(100);<br /> display(0x80,0xb0,0xb2);<br /> display(0x81,0xbb,0xD5);<br /> display(0x82,0xb5,0xe7);<br /> display(0x83,0xc1,0xA6);<br /> display(0x84,0xc5,0xe0);<br /> display(0x85,0xD1,0xb5);<br /> display(0x86,0xd6,0xD0);<br /> display(0x87,0xd0,0xc4);<br /> delay(65000);<br /> SendCMD(0x00);<br /> delay(100);<br /> display(0x90,0xb0,0xb2);<br /> display(0x91,0xbb,0xD5);<br /> display(0x92,0xb5,0xe7);<br /> display(0x93,0xc1,0xA6);<br /> display(0x94,0xc5,0xe0);<br /> display(0x95,0xD1,0xb5);<br /> display(0x96,0xd6,0xD0);<br /> display(0x97,0xd0,0xc4);<br /> delay(65000);<br /> SendCMD(0x00);<br /> delay(100);<br /> display(0x88,0xb0,0xb2);<br /> display(0x89,0xbb,0xD5);<br /> display(0x8A,0xb5,0xe7);<br /> display(0x8B,0xc1,0xA6);<br /> display(0x8C,0xc5,0xe0);<br /> display(0x8D,0xD1,0xb5);<br /> display(0x8E,0xd6,0xD0);<br /> display(0x8F,0xd0,0xc4);<br /> delay(65000);<br /> SendCMD(0x00);<br /> delay(100);<br /> display(0x98,0xb0,0xb2);<br /> display(0x99,0xbb,0xD5);<br /> display(0x9A,0xb5,0xe7);<br /> display(0x9B,0xc1,0xA6);<br /> display(0x9C,0xc5,0xe0);<br /> display(0x9D,0xD1,0xb5);<br /> display(0x9E,0xd6,0xD0);<br /> display(0x9F,0xd0,0xc4);<br /> delay(65000);<br /> SendCMD(0x00);<br /> }<br /> close(fd);<br />}<br /><br /> |
|