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

📄 12232drivers.c

📁 C51单片机一个小项目源程序:包含液晶12232驱动,AD7705驱动,按键扫描及单片机内部EEPROM的驱动,是一个比较值得参考的源程序
💻 C
字号:
#include "mylib.h"
uchar dot_buffer[32];					//点阵缓存区
struct data_gb16 code hz16[] = 
{
"向",
0x00,0x00,0xFC,0x04,0x04,0xE6,0x25,0x24,0x24,0x24,0xE4,0x04,0x04,0xFC,0x00,0x00,
0x00,0x00,0x7F,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x0F,0x20,0x40,0x3F,0x00,0x00,
"盘",
0x20,0x20,0xA0,0x7C,0x24,0x26,0x6D,0xB4,0x24,0x24,0x24,0xFC,0x20,0x20,0x20,0x00,
0x44,0x42,0x41,0x7C,0x44,0x44,0x7C,0x45,0x44,0x7D,0x46,0x45,0x7C,0x40,0x40,0x00,
"检",
0x08,0x88,0x68,0xFF,0x28,0x48,0x10,0x48,0x44,0x43,0x44,0x48,0x50,0x10,0x10,0x00,
0x02,0x01,0x00,0x7F,0x00,0x20,0x22,0x2C,0x21,0x2E,0x30,0x28,0x27,0x22,0x20,0x00,
"仪",
0x40,0x20,0xF0,0x0C,0x03,0x00,0x38,0xC0,0x01,0x0E,0x04,0xE0,0x1C,0x00,0x00,0x00,
0x00,0x00,0xFF,0x00,0x40,0x40,0x20,0x10,0x0B,0x04,0x0B,0x10,0x20,0x60,0x20,0x00,
"测",
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,
"正",
0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
"常",
0x20,0x18,0x08,0x09,0xEE,0xAA,0xA8,0xAF,0xA8,0xA8,0xEC,0x0B,0x2A,0x18,0x08,0x00,
0x00,0x00,0x3E,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,0x00,
"矩",
0xA0,0x90,0x8F,0xF8,0x88,0x88,0x88,0x00,0xFE,0x22,0x22,0x22,0x22,0xE2,0x02,0x00,
0x40,0x20,0x18,0x07,0x02,0x04,0x18,0x00,0x7F,0x42,0x42,0x42,0x42,0x47,0x40,0x00,
"转",
0xC8,0xA8,0x9C,0xEB,0x88,0x88,0x88,0x40,0x48,0xF8,0x4F,0x48,0x48,0x48,0x40,0x00,
0x08,0x08,0x04,0xFF,0x04,0x04,0x00,0x02,0x0B,0x12,0x22,0xD2,0x0E,0x02,0x00,0x00,
"角",
0x00,0x40,0x20,0xF0,0x98,0x97,0x92,0x92,0xF2,0x92,0x9A,0x96,0x92,0xF0,0x00,0x00,
0x00,0x80,0x60,0x1F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x44,0x84,0x7F,0x00,0x00,
"欠",
0x80,0x40,0x20,0x18,0x0F,0x0A,0x08,0xE8,0x08,0x08,0x48,0x28,0x18,0x08,0x00,0x00,
0x40,0x40,0x20,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x30,0x60,0x20,0x20,0x00,
"压",
0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,
"完",
0x00,0x90,0x8C,0xA4,0xA4,0xA4,0xA5,0xA6,0xA4,0xA4,0xA4,0xA4,0x94,0x8C,0x04,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x70,0x00,0x00,
"成",
0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00,
0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00,
"保",
0x40,0x20,0xF8,0x17,0x82,0x80,0xBE,0xA2,0xA2,0xE2,0xA2,0xA2,0xBE,0x80,0x80,0x00,
0x00,0x00,0x7F,0x00,0x20,0x10,0x08,0x06,0x01,0x7F,0x03,0x0C,0x18,0x30,0x10,0x00,
"存",
0x00,0x04,0x04,0xC4,0x64,0x1C,0x27,0x25,0x24,0x24,0xA4,0x64,0x24,0x04,0x00,0x00,
0x04,0x02,0x01,0xFF,0x00,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x00,
"选",
0x40,0x40,0x42,0xCC,0x00,0x50,0x4E,0xC8,0x48,0x7F,0xC8,0x48,0x48,0x40,0x00,0x00,
0x00,0x40,0x20,0x1F,0x20,0x48,0x46,0x41,0x40,0x40,0x47,0x48,0x48,0x4E,0x40,0x00,
"择",
0x08,0x08,0xFF,0x88,0x48,0x08,0x42,0x46,0x2A,0xD2,0x2A,0x46,0x42,0x80,0x80,0x00,
0x42,0x81,0x7F,0x00,0x00,0x08,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x08,0x08,0x00,
"定",
0x00,0x10,0x0C,0xA4,0x24,0x24,0x25,0xE6,0x24,0x24,0x24,0x24,0x14,0x0C,0x04,0x00,
0x40,0x20,0x18,0x07,0x08,0x10,0x20,0x7F,0x42,0x42,0x42,0x42,0x40,0x40,0x00,0x00,
"检",
0x08,0x88,0x68,0xFF,0x28,0x48,0x10,0x48,0x44,0x43,0x44,0x48,0x50,0x10,0x10,0x00,
0x02,0x01,0x00,0x7F,0x00,0x20,0x22,0x2C,0x21,0x2E,0x30,0x28,0x27,0x22,0x20,0x00,
"标",
0x10,0x10,0xD0,0xFF,0x50,0x90,0x20,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x20,0x00,
0x04,0x03,0x00,0xFF,0x00,0x09,0x04,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x1C,0x00,
"电",
0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
"状",
0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00,
0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00,
"态",
0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00,
0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00,
"与",
0x00,0x00,0x00,0x00,0x7E,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xCC,0x08,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x24,0x46,0x44,0x20,0x1F,0x00,0x00,
"上",
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x60,0x40,0x00,
"位",
0x00,0xC0,0x30,0xEC,0x03,0x2A,0xC8,0x09,0x0A,0x0E,0x08,0xE8,0x48,0x08,0x00,0x00,
0x01,0x00,0x00,0x7F,0x20,0x20,0x20,0x27,0x20,0x30,0x2E,0x21,0x20,0x20,0x20,0x00,
"机",
0x08,0x08,0xC8,0xFF,0x48,0x88,0x08,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x41,0x30,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x78,0x00,
"通",
0x40,0x41,0xC6,0x00,0x00,0xF2,0x52,0x52,0x56,0xFA,0x5A,0x56,0xF2,0x00,0x00,0x00,
0x40,0x20,0x1F,0x20,0x40,0x5F,0x42,0x42,0x42,0x5F,0x4A,0x52,0x4F,0x40,0x40,0x00,
"讯",
0x20,0x21,0x2E,0xE4,0x00,0x42,0x42,0xFE,0x42,0x42,0x42,0x02,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x7F,0x00,0x00,0x00,0x00,0x3F,0x40,0x38,0x00

	
};
void send_mi(uchar instruction)
{  
   	clr_E2();                   //关S    
    set_E1();                   //开M	
	wait_ready();
    clr_A0();				    //指令
    clr_WR();				    //写触发	
	NOP();
	lcd_data = instruction;     //指令码
	NOP();	
    clr_E1();                   //关M
}

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)
{     
	clr_E1();                   //关M
    set_E2();                   //开S
	wait_ready();         
    clr_A0();				    //指令
    clr_WR();				    //写触发    
	NOP();
    lcd_data=instruction;       //指令码
    NOP();	
    clr_E2();                   //关S
}

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口输出
}

//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)
{
    uchar i, page;
	for (page=0;page<4;page++)
    {
    	send_mi(page_addr_set|page);  //0xb8  10111000
		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 lcd_clr1(uchar page,uchar i,uchar withe,uchar mode)
{
    //uchar  page;
	//for (page=0;page<4;page++)
    //{
	    uchar k;
    	send_mi(page_addr_set|page);   //0xb8  10111000
		send_si(page_addr_set|page); 
        send_mi(i);
        send_si(i);             
    	//for (i=0;i<62;i++)
		for(k=i;k<(i+withe);k++)
    	{
	    	//send_md(0x00);
			//send_sd(0x00);
			if(mode)
			{
			   send_md(0);			//左屏
//			   send_sd(0);			
			}
			else   send_sd(0);	   //右屏
		}
    //}
}   
/*void lcd_clr2()
{
	lcd_clr1(0,6,54,1);
	lcd_clr1(1,6,54,1);
	lcd_clr1(2,6,54,1);
	lcd_clr1(3,6,54,1);
	lcd_clr1(0,6,54,0);
	lcd_clr1(1,6,54,0);
	lcd_clr1(2,6,54,0);
	lcd_clr1(3,6,54,0);
}  */   

//同时设置主(右)从(左)显示页为0~3页
void set_page(uchar page)
{
    send_mi(page_addr_set|page);
    send_si(page_addr_set|page);
}

//同时设置主(右)从(左)列地址为0~61列
void set_address(uchar address)
{
    send_mi(address&0x7F);               //&0x7F,考虑到防止越限
    send_si(address&0x7F);
}

//在右页(从窗口)当前地址画一个字节(8点)

void putchar_l(uchar c)
{
    send_md(c);
}

//在左页(主窗口)当前地址画一个字节(8点)

void putchar_r(uchar c)
{
    send_sd(c);
}    

//画一个图,横坐标是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 draw_bmp1(uchar col,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);
//        set_page(page+2);             //上层数据输出
//        set_address(address);
        
        if (window) 				
          putchar_r(bmp[p]);        
        else 
          putchar_l(bmp[p]);        

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

	    //page=2;
		set_page(page+2);             //上层数据输出
        set_address(address);
//         set_page(page);             //上层数据输出
//        set_address(address);
        
        if (window) 				
          putchar_r(bmp[p+2*width]);        
        else 
          putchar_l(bmp[p+2*width]);        

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


}	*/

//显示单个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);
}

//显示小于4个的十进制数字
//修改缓冲区的大小可以扩展显示
#ifdef 	 disp_ram_data
#define  disp_ram_data
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;
	 }
}
#endif

//ASCII(8*16) 和 汉字(16*16)显示函数

void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
{
	uchar c1,c2;
	uchar i,j,k;
	uchar ulen;
	//uchar ucol,ulayer,umode;
	uchar ucol,ulayer;
    ulen = 0; 
	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;                     //中文的处理
		}
	}
}

⌨️ 快捷键说明

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