| 
 
| /*------------------------------------------------------------<br />ST7920中文字库液晶显示模块LCD12232并行8位显示C30演示程序<br />C30菜鸟HotPower@126.com             2007.12.8 于雁塔菜地<br />-------------------------------------------------------------*/<br /><br />#include "lcd.h"<br /><br />unsigned char LcdRowWriteEnable[2] = {0, 0};//显示行刷新允许标志<br />unsigned char LcdBuffer[2][15];//LCD显示缓冲区(2行15个字符)<br />unsigned char LcdRow = 0, LcdCol = 0;//虚拟光标<br /><br />void LcdInit(void)//LCD初始化<br />{<br />    LcdIOInit();//LCD管脚初始化<br />    LcdClearBuffer();//清空LCD显示缓冲区<br /><br />//    LcdWriteCommand(0x20);//发送功能设定控制命令(4位)<br />    LcdWriteCommand(0x30);//发送功能设定控制命令(8位)<br />    LcdWriteCommand(0x02);//发送位址归位命令,设定DDRAM位址计数器为0<br />    LcdWriteCommand(0x04);//发送进入点命令 <br />    LcdWriteCommand(0x0c);//发送开显示关光标命令<br />    LcdWriteCommand(0x01);//发送清除显示命令 <br />    LcdWriteCommand(0x80);//发送设定DDRAM地址0x00命令,光标定位到(0,0)<br /><br />/*----------------------------------------------------------------------<br />    LcdWriteCommand(0x30);//发送功能设定控制命令(8位)<br />    LcdWriteCommand(0x30);//发送功能设定控制命令(8位)<br />    LcdWriteCommand(0x30);//发送功能设定控制命令(8位)<br />    LcdWriteCommand(0x01);//发送清除显示命令 <br />    LcdWriteCommand(0x06);//发送进入点命令0x06 <br />    LcdWriteCommand(0x0a);//发送开关显示关光标命令<br />    LcdWriteCommand(0x0c);//发送开显示关光标命令<br />    LcdWriteCommand(0x02);//发送位址归位命令,设定DDRAM位址计数器为0<br />    LcdWriteCommand(0x17);//游标或显示移位控制<br />    LcdWriteCommand(0x80);//发送设定DDRAM地址0x00命令,光标定位到(0,0)<br />----------------------------------------------------------------------*/<br />    LCD_BK = 0;//打开背光<br />}<br /><br />void LcdIOInit(void)//LCD管脚初始化<br />{<br />    LCD_BK = 0;//打开背光<br />    LCD_E = 0;//不使能 <br />    LCD_RW = 1;//写读数据 <br />    TRIS_E  =  PORTOUTMODE;//定义E为输出IO<br />    TRIS_RW =  PORTOUTMODE;//定义RW为输出IO<br />    TRIS_RS =  PORTOUTMODE;//定义RS为输出IO<br />    TRIS_BK =  PORTOUTMODE;//定义BK为输出IO<br />    TRIS_DATA = 0;//定义RE0~RE7为输出IO<br />}<br /><br />void LcdWriteCommand(unsigned char Command)//写LCD命令字<br />{<br />    LCD_RS = 0;//命令 <br />    Nop(); <br />    LCD_RW = 0;//写命令 <br />    Nop(); <br />    LCD_E = 1;//使能       <br />    Nop(); <br />    LCD_BUS = Command;//发送8位命令 <br />    Nop();     <br />    LCD_E = 0;//不使能,读出数据 打入命令<br />    Nop();     <br />    LCD_RW = 1;//写命令结束 <br />      if (Command == 0x01)//清除显示命令,需要等待时间相对较长<br />    {<br />         _delay_loop(1600);//st7920要求等待1.6mS<br />    }<br />      else<br />    {<br />         _delay_loop(72);//st7920要求等待72uS<br />    }<br />}<br /><br />void LcdWriteData(unsigned char data)//写LCD显示数据 <br />{ <br />    LCD_RS = 1;//数据 <br />    Nop(); <br />    LCD_RW = 0;//写数据 <br />    Nop(); <br />    LCD_E = 1;//使能       <br />    Nop(); <br />    LCD_BUS = data;//发送8位数据 <br />    Nop();     <br />    LCD_E = 0;//不使能,打入数据 <br />    Nop();     <br />    LCD_RW = 1;//写数据结束 <br />    _delay_loop(72);//st7920要求等待72uS<br />} <br /><br />void LcdWaitBusy(void)//LCD忙标志测试(有时死机,故没用)  <br />{ <br />    TRIS_DATA = 0xff;//定义RE0~RE7为输入IO <br />    LCD_BUS = 0xff;<br />    Nop(); <br />    LCD_RS = 0;//命令         <br />    Nop(); <br />    LCD_RW = 1;//读数据<br />    Nop(); <br />    LCD_E = 1;//使能       <br />    Nop(); <br />    while(LCD_BF)//读取忙碌标志BF(LCD_DATA.7)<br />    {<br />        Nop();//搞不清有时死机在此处,所以用_delay_loop()代替<br />    }<br />    LCD_E = 0;//不使能,读出状态 <br />    Nop();     <br />    TRIS_DATA = 0;//定义RE0~RE7为输出IO<br />    Nop();     <br />} <br /><br />void LcdClearBuffer(void)<br />{<br />unsigned char i, j;<br />    for (i = 0;i < 2;i ++)//2行字符 <br />    {//2行汉字<br />        for (j = 0;j < 15; j ++)//15个字符<br />        {//每行7个半汉字15个字符<br />            LcdBuffer[j] = ' ';//空白字符<br />        }<br />        LcdRowWriteEnable = 1;//允许此行刷新汉字显示<br />    }<br />    LcdRow = 0;//虚拟光标定位在0行<br />    LcdCol = 0;//虚拟光标定位在0列<br />}<br /><br /><br />void LcdDisplayPos(unsigned char row, unsigned char col)<br />{<br />    if ((row < 2) && (col < 15))//容错处理,光标越界<br />    {<br />        LcdRow = row;//刷新虚拟光标<br />        LcdCol = col;//刷新虚拟光标<br />        LcdRowWriteEnable[row] = 1;//允许此行刷新汉字显示<br />    }<br />}<br /><br />void LcdDisplay(const char * string)//不真的LCD显示<br />{<br />    while(*string)//0字符结束<br />    {<br />        LcdBuffer[LcdRow][LcdCol ++] = *string ++;//写入显示缓冲区<br />    }<br />}<br /><br />unsigned char LcdDisplayBuffer(void)//显示刷新LCD缓冲区内的数据(一般0.25S~0.5S刷新一次)<br />{<br />unsigned char i, j;<br />unsigned char num = 0;//刷新字符个数<br />    for (i = 0; i < 2; i ++)<br />    {//2行汉字<br />        if (LcdRowWriteEnable)<br />        {//允许此行刷新汉字显示<br />            LcdWriteCommand(0x80 + (i << 4));//移动真的LCD光标<br />            for (j = 0; j < 15; j ++)<br />            {//每行7个半汉字15个字符<br />                LcdWriteData(LcdBuffer[j]);//刷新显示字符<br />                num ++;//刷新字符个数计数<br />            }<br />            LcdRowWriteEnable = 0;//过后不允许此行刷新汉字显示<br />        }<br />    }<br />    return num;//返回实际刷新字符个数<br />}<br /><br />void _delay_loop(unsigned long count)//软件延时<br />{<br />    while(count --)<br />    {<br />        //ClrWdt();//注意大延时要记住喂狗<br />    }<br />}<br />  <br /> 相关链接:<a href='http://blog.**/hotpower/65478/message.aspx'>http://blog.**/hotpower/65478/message.aspx</a> | 
 |