- #include "lcd12864.h"
- /**
- * @name:
- * @description:
- * @author: 何影萌
- * @version:
- * @return {*}
- * @param {int} ms
- */
- int delay(int ms)
- {
- int lanzixuan;
- while(ms--)
- {
- uint8_t i;
- for(i=0;i<250;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- return lanzixuan;
- }
- /*******************************************************************/
- /* */
- /*检查LCD忙状态 */
- /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
- /* */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /* */
- /*写指令数据到LCD */
- /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
- /* */
- /*******************************************************************/
- void lcd_wcmd(uint8_t cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*写显示数据到LCD */
- /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
- /* */
- /*******************************************************************/
- void lcd_wdat(uint8_t dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*写字符串到LCD */
- /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
- /* */
- /*******************************************************************/
- void lcd_wstr(uint8_t *Str)
- {
- while(*Str)
- {
- lcd_wdat(*Str++);
- }
- }
- /*******************************************
- 函数名称:Draw_PM
- 功 能:在整个液晶屏幕上画图
- 参 数:无
- 返回值 :无
- ********************************************/
- void Draw_PM(const uint8_t *ptr)
- {
- uint8_t i,j,k;
- lcd_wcmd(0x34); //打开扩展指令集
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- lcd_wcmd(i++);
- lcd_wcmd(0x80);
- for(k = 0;k < 16;k++)
- {
- lcd_wdat(*ptr++);
- }
- }
- i = 0x80;
- for(j = 0;j < 32;j++)
- {
- lcd_wcmd(i++);
- lcd_wcmd(0x88);
- for(k = 0;k < 16;k++)
- {
- lcd_wdat(*ptr++);
- }
- }
- lcd_wcmd(0x36); //打开绘图显示
- lcd_wcmd(0x30); //回到基本指令集
- }
- /*******************************************************************/
- /* */
- /* LCD初始化设定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- delay(50);
- wela=0;
- dula=0;
- LCD_PSB = 1; //并口方式
- lcd_wcmd(0x34); //扩充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //显示开,关光标
- delay(5);
- lcd_wcmd(0x01); //清除LCD的显示内容
- delay(5);
- }
- /*********************************************************/
- /* */
- /* 设定显示位置 */
- /* */
- /*********************************************************/
- void lcd_pos(uint8_t X,uint8_t Y)
- {
- uint8_t pos;
- if (X==0)
- {X=0x80;}
- else if (X==1)
- {X=0x90;}
- else if (X==2)
- {X=0x88;}
- else if (X==3)
- {X=0x98;}
- pos = X+Y ;
- lcd_wcmd(pos); //显示地址
- }
- /**
- * @name:
- * @description: 以下为蓝灵电子新增加的功能
- * @author: 何影萌
- * @version:
- * @return {*}
- */
- /**
- * @brief 读取数据
- * @return uint8_t
- */
- uint8_t Lanling_Read_Dat()
- {
- uint8_t datas;
- while(lcd_busy());
- LCD_RS=1;
- LCD_RW=1;
- LCD_EN=1;
- delayNOP();
- datas=P0;
- delayNOP();
- LCD_EN=0;
- return datas;
- }
- /**
- * @brief 画点
- * @param x
- * @param y
- */
- void Lanling_Draw_Point(uint8_t x,uint8_t y)
- {
- uint8_t temph,templ;
- uint8_t x_byte,x_bit;
- uint8_t y_byte,y_bit;
- lcd_wcmd(0x34);
- lcd_wcmd(0x36);
- x_byte=x>>4;
- x_bit=x&0x0f;
- y_byte=y>>5;
- y_bit=y%32;
- lcd_wcmd(0x80+y_bit);
- lcd_wcmd(0x80+x_byte+y_byte*8);
- temph=Lanling_Read_Dat();
- temph=Lanling_Read_Dat();
- templ=Lanling_Read_Dat();
- lcd_wcmd(0x80+y_bit);
- lcd_wcmd(0x80+x_byte+y_byte*8);
- if(x_bit<8)
- {
- lcd_wdat(temph|(0x01<<(7-x_bit)));
- lcd_wdat(templ);
- }
- else
- {
- lcd_wdat(temph);
- lcd_wdat(templ|(0x01<<(15-x_bit)));
- }
- }
- /**
- * @brief 清除点
- * @param x
- * @param y
- */
- void Lanling_Clear_Point(uint8_t x,uint8_t y)
- {
- uint8_t temph,templ;
- uint8_t x_byte,x_bit;
- uint8_t y_byte,y_bit;
- lcd_wcmd(0x34);
- lcd_wcmd(0x36);
- x_byte=x>>4;
- x_bit=x&0x0f;
- y_byte=y/32;
- y_bit=y%32;
- lcd_wcmd(0x80+y_bit);
- lcd_wcmd(0x80+x_byte+y_byte*8);
- temph=Lanling_Read_Dat();
- temph=Lanling_Read_Dat();
- templ=Lanling_Read_Dat();
- lcd_wcmd(0x80+y_bit);
- lcd_wcmd(0x80+x_byte+y_byte*8);
- if(x_bit<8)
- {
- lcd_wdat(temph&(~(0x01<<(7-x_bit))));
- lcd_wdat(templ);
- }
- else
- {
- lcd_wdat(temph);
- lcd_wdat(templ&(~(0x01<<(15-x_bit))));
- }
- }
- /**
- * @brief 蓝灵电子专属清屏函数
- */
- void Lanling_Clr()
- {
- uint8_t i,j,k;
- lcd_wcmd(0x34);
- lcd_wcmd(0x36);
- for(i=0;i<2;i++)
- {
- for(j=0;j<32;j++)
- {
- lcd_wcmd(0x80+j);
- lcd_wcmd(0x80+i*8);
- for(k=0;k<16;k++)
- {
- lcd_wdat(0x00);
- }
- }
- }
- lcd_wcmd(0x30); //基本指令操作
- }
- /*Main.c*/
- void main()
- {
- unsigned char i;
- lcd_init();
- Lanling_Clr();
- for(i=0;i<64;i++)
- {
- Lanling_Draw_Point(i,i);
- }
- for(i=64;i<128;i++)
- {
- Lanling_Draw_Point(i,127-i);
- }
- while(1);
- }
复制代码
|