⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12232.c

📁 12232驱动程序 调试通过 中北大学信息与通信工程学院 沈阳 QQ:184676957
💻 C
📖 第 1 页 / 共 2 页
字号:
////////////////////////////////////////////////////////////////////////////////
void send_md(uchar c)
{
    clr_E2();                //关S
    set_E1();                //开M
    wait_ready(); 
    set_A0();        		 //数据
    clr_WR();        		 //写触发 
    NOP();
    lcd_data = c;            //数据
    NOP(); 
    clr_E1();                //关M
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void send_si(uchar instruction)
//函数说明:发指令instruction到从窗口(内函数,私有,用户不能直接调用)
////////////////////////////////////////////////////////////////////////////////
void send_si(uchar instruction)
{     
    clr_E1();                //关M
    set_E2();                //开S
    wait_ready();         
    clr_A0();       		 //指令
    clr_WR();       		 //写触发    
    NOP();
    lcd_data=instruction;    //指令码
    NOP(); 
    clr_E2();                //关S
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void send_sd(uchar data)
//函数说明:发数据data到从窗口(内函数,私有,用户不直接调用)
////////////////////////////////////////////////////////////////////////////////
void send_sd(uchar c)
{
 clr_E1();
 set_E2();  
 wait_ready(); 
 set_A0();       //数据
 clr_WR();        //写触发    
 lcd_data = c;
 NOP();
 clr_E2();
}

////////////////////////////////////////////////////////////////////////////////
//等待ready:等待LCD内部操作完成
////////////////////////////////////////////////////////////////////////////////
void wait_ready(void)
{
//  DDRA = 0x00;                   //PA口输入
    clr_A0();                      //指令
    set_WR();                      //读
 NOP();                           
 while(lcd_data & status_busy); //读入LCD状态,1=忙,一直等待LCD内部操作完成
// DDRA = 0xff;                //重新置PA口输出
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void lcd_init(void)
//函数说明:122x32LCD初始化,开机后仅调用一次
////////////////////////////////////////////////////////////////////////////////
void lcd_init(void)
{
    send_mi(reset);     	 //复位m-left,s-right
    send_si(reset);
    send_mi(disp_off);       //关闭显示
    send_si(disp_off);
    send_mi(dynamic_driver); //动态驱动
    send_si(dynamic_driver);
    send_mi(clk32);          //1/32占空比
    send_si(clk32);
    send_mi(adc_select);     //clockwise
    send_si(adc_select);
    send_mi(mode_write);     //写模式
    send_si(mode_write);    
    send_mi(col_addr_set);
    send_mi(disp_start_line);//归回零列,设定显示起始行首
    send_si(col_addr_set);
    send_si(disp_start_line);  
    send_mi(disp_on);        //开显示
    send_si(disp_on);  
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void lcd_clr(void)
//函数说明:清屏
////////////////////////////////////////////////////////////////////////////////
void lcd_clr(void)
{
 uchar i, page;
 for (page=0;page<4;page++)
    {
  send_mi(page_addr_set|page);
  send_si(page_addr_set|page);
  send_mi(0);                     //主窗口设置为0列
  send_si(0);                     //从窗口设置为0列               
     for (i=0;i<62;i++)
     {
  send_md(0x00);
  send_sd(0x00);
     }
    }
}     

////////////////////////////////////////////////////////////////////////////////
//调用方式:void set_page(uchar page)
//函数说明:同时设置主(右)从(左)显示页为0-3页
////////////////////////////////////////////////////////////////////////////////
void set_page(uchar page)
{
    send_mi(page_addr_set|page);
    send_si(page_addr_set|page);
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void SetAddress(uchar address)
//函数说明:同时设置主(右)从(左)列地址为0-61列
////////////////////////////////////////////////////////////////////////////////
void set_address(uchar address)
{
    send_mi(address&0x7F);  //&0x7F,考虑到防止越限
    send_si(address&0x7F);
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void putchar_l(uchar c)
//函数说明:在右页(从窗口)当前地址画一个字节(8点)
////////////////////////////////////////////////////////////////////////////////
void putchar_l(uchar c)
{
    send_md(c);
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void putchar_r(uchar c)
//函数说明:在左页(主窗口)当前地址画一个字节(8点)
////////////////////////////////////////////////////////////////////////////////
void putchar_r(uchar c)
{
    send_sd(c);
}    

////////////////////////////////////////////////////////////////////////////////
//调用方式:void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
//函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16
//          bmp是图形指针
//          使用zimo21软件,采用纵向取模下高位得到bmp数据。
//  col     图型的起始位置0~121
// layer    图形的位置(Y坐标)0-下半部分 非0-上半部分
// width    图形宽度8,16可选
//  bmp     图形数据指针
////////////////////////////////////////////////////////////////////////////////
void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
{
 uchar x;        
 uchar address;                  //address表示显存的物理地址
 uchar p=0;         
 uchar page=0;
 uchar window=0;         //page表示上下两页,window表示左右窗口(0左,1右)
    if (layer) page=2;              //左-主窗口,右-从窗口    
    for (x=col; x<col+width; x++)
    {   
     if (x>121)return;           //防止显示乱码
        if (x>60)     //左右窗口定位
  {
   window=1;               //右-从窗口
   address=x%61;
  }
        else
      address=x;              //主窗口输出  
	  set_page(page);             //上层数据输出
      set_address(address);       
        if (window)     
          putchar_r(bmp[p]);        
        else 
          putchar_l(bmp[p]);        

        set_page(page+1);           //下层数据输出
        set_address(address);       //列保持不变 
        
        if (window)     
           putchar_r(bmp[p+width]);     
  else 
           putchar_l(bmp[p+width]);       

        p++;
    }
}

////////////////////////////////////////////////////////////////////////////////
//函数:void disp_one_ascii(uchar col,uchar layer,uchar ascii_code)
//说明:显示单个ASCII码col-列;layer-上下行:1-上,0-下;ascii_code:所要显示德ASCCII码
////////////////////////////////////////////////////////////////////////////////
void disp_one_ascii(uchar col,uchar layer,uchar ascii_code,uchar mode)
{
 uchar i;
 for(i=0;i<16;i++)                //ASCII码显示占用16个字节
 {   
  if(mode)dot_buffer[i]=~ascii[(ascii_code-0x20)*16 + i];
  else    dot_buffer[i]= ascii[(ascii_code-0x20)*16 + i]; 
 }  
 draw_bmp(col,layer,8,dot_buffer);
}

////////////////////////////////////////////////////////////////////////////////
//函数:void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
//说明:显示小于4个的十进制数字//修改缓冲区的大小可以扩展显示
////////////////////////////////////////////////////////////////////////////////
void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
{
     while(n--)
  {
  if(mode)disp_one_ascii(col,layer,disp_buffer[n]+0x30,1);
  else    disp_one_ascii(col,layer,disp_buffer[n]+0x30,0);
  col += 8;
  }
}

////////////////////////////////////////////////////////////////////////////////
//函数:void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
//说明:ASCII(8*16) 和 汉字(16*16)显示函数
////////////////////////////////////////////////////////////////////////////////
void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
{
 uchar c1,c2;
 uchar i,j,k;
 uchar ulen=0;
 uchar ucol,ulayer;
 ucol = col;   
 ulayer = layer;
 while (ptr[ulen]!= 0)ulen++; //探测字串长度
 i=0;
 while(i<ulen)
 {
  c1 = ptr[i];
  c2 = ptr[i+1];	 //ASCII字符与汉字内码的区别在于128做分界;大于128的为汉字码
  if(c1 <=128)       //ASCII
  {   
    if(mode)disp_one_ascii(ucol,ulayer,c1,1);//反色显示
    else    disp_one_ascii(ucol,ulayer,c1,0);//正常显示
    ucol+=8;
    i++;                    				 //ASCII码的处理
  }
  else         								 //中文
  {
       for(j=0;j<sizeof(hz16)/sizeof(hz16[0]);j++)                              
       {                           			 //查找定位当前汉字的点阵区
        if((c1 == hz16[j].index[0]) && (c2 == hz16[j].index[1]))
     	break;
       }
       for(k=0;k<32;k++)
    {   if(mode)dot_buffer[k]=~hz16[j].zimo[k];
        else    dot_buffer[k]= hz16[j].zimo[k];
    } 
       draw_bmp(ucol,ulayer,16,dot_buffer);
       ucol+=16;
    i+=2;                     //中文的处理
  }
 }
} 
////////////////////////////////////////////////////////////////////////////////
void main(void)
{ 
   uchar i;
   uint  j;
//   RST=1;
   for(i=0;i<10;i++)for(j=1;j<10;j++);       //开机延时
   lcd_init(); 
   lcd_clr();   
   dprintf(0,0,"   测试成功!!   ",1);       //说明/在up  行从第10列开始显示/正常显示                           
   dprintf(2,1,"2007.10.21 沈阳",0);       //说明/在up  行从第10列开始显示/正常显示
//   disp_ram_data(10,1,8,0);               //说明/在dowm行从第10列开始显示/反白显示
   while(1); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -